ToB企服应用市场:ToB评测及商务社交产业平台

标题: mit 6.824 lab1分析 [打印本页]

作者: 河曲智叟    时间: 2023-4-10 22:53
标题: mit 6.824 lab1分析
6.824 lab1 笔记

1. 阅读论文


2. 官网rules & hints

2.1 rules

2.2 hints

3. 架构设计


3.1 RPC设计

在该lab中,我们需要两个RPC,一个是callTask RPC向coordinator请求一个任务,一个是callTaskDone RPC向coordinator报告某个任务的完成,以下皆在rpc.go中定义
3.2 Coordinator

3.2.1 结构体设计
  1. type taskState int
  2. const (
  3.         spare taskState = iota
  4.         executing
  5.         finish
  6. )
  7. type task struct {
  8.         fileName string
  9.         id       int
  10.         state    taskState
  11.         start    time.Time
  12. }
复制代码
首先设计一个task struct,该结构体代表一个任务
  1. type Coordinator struct {
  2.         // Your definitions here.
  3.         mu         sync.Mutex
  4.         state      taskType
  5.         tasks      []*task
  6.         mapChan    chan *task
  7.         reduceChan chan *task
  8.         nReduce    int
  9.         nFiles     int
  10.         finished   int
  11. }
复制代码
接着设计主要Coordinator结构体
3.2.2 初始化

[code]func MakeCoordinator(files []string, nReduce int) *Coordinator {        c := Coordinator{}        // Your code here.        c.mapPhase(files, nReduce)        go c.watch()        c.server()        return &c}func (c *Coordinator) mapPhase(files []string, nReduce int) {        c.state = mapType                 //设置系统状态为map阶段        c.nReduce = nReduce                c.nFiles = len(files)        c.tasks = make([]*task, c.nFiles)        c.mapChan = make(chan *task, c.nFiles) // c.nFiles长度的map channel        for i := 0; i < c.nFiles; i++ {                c.tasks = &task{fileName: files, id: i}                c.mapChan  0 {                case true:                        task :=  0 {                case true:                        task :=  0,则取出一个task,调用c.setReply(task, reply),将任务的相关信息填入reply中,并把task的当前状态设为执行中,开始时间设为time.Now()。如果没有可分配的任务,则设reply.Tp = waitting,让worker等待一会再请求任务若当前系统状态为reduce阶段:同上
</ol>3.2.4 任务完成

[code]func (c *Coordinator) CallTaskDone(args *CallTaskDoneArgs, reply *CallTaskDoneReply) error {        c.mu.Lock()        defer c.mu.Unlock()        if c.state != args.Tp || c.state == done {                return nil        }        if c.tasks[args.TaskID].state != finish {                c.tasks[args.TaskID].state = finish                c.finished++                //fmt.Printf("task %v done\n", args.TaskID)                if c.state == mapType && c.finished == c.nFiles {                        c.reducePhase()                } else if c.state == reduceType && c.finished == c.nReduce {                        close(c.reduceChan)                        c.state = done                }        }        return nil}func (c *Coordinator) reducePhase() {        //fmt.Printf("reduce phase\n")        close(c.mapChan)        c.state = reduceType        c.tasks = make([]*task, c.nReduce)        c.finished = 0        c.reduceChan = make(chan *task, c.nReduce)        for i := 0; i < c.nReduce; i++ {                c.tasks = &task{id: i}                c.reduceChan  timeout {                                task.state = spare                                switch c.state {                                case mapType:                                        c.mapChan




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4