mit6.824 2022 lab1
以前写的lab1博客:MIT6.824 lab1
汇总博客:MIT6.824 2022
基本实现
Coordinator:
1 Worker通过RPC申请任务,实现该RPC处理逻辑
我的实现是通过一个管道,Coordinator往里面写入任务,RPC处理函数从里面获取任务
2 调度任务
1 |
|
Worker:
1 一直调用Coordinator RPC申请任务
2 执行相应的Map任务与Reduce任务
2022版的lab1与2018的lab1虽然有一些不一样,但关键步骤差不多。在实现中比较重要的一点就是worker如何告知master任务已完成,之前lab1 master调用worker的方法,由于是RPC是同步调用,可以通过res判断任务执行状态
1 |
|
而2022是worker调用master方法申请任务,可选的通知方式有:
- master通过判断预期的输出文件是否存在来间接判断下发的任务是否执行完成(不推荐)
- worker在任务完成后调用rpc方法,告知master
第一种方式相关代码
1 |
|
第二种方式显然是更好的,不过实现上还有一些问题。我刚开始是使用两个map存放各个阶段的完成结果,超时处理则是直接过10s再查看是否完成任务,效率比较低。
1 |
|
看了《Go语言并发之道》后,使用select实现超时处理,相关代码如下
1 |
|
当Coordinator完成所有任务后,可以发布一个假任务使worker退出循环,相关代码如下:
1 |
|
参考代码
coordinator.go
1 |
|
rpc.go
1 |
|
worker.go
1 |
|
通过截图
知识:
plugin模式
1 |
|
plugin 模式是 golang 1.8 才推出的一个特殊的构建方式,它将 package main 编译为一个 go 插件,并可在运行时动态加载。
1 |
|
Go 编译模式
[[: not found
test-mr.sh: 10: [[: not found
test-mr.sh: 38: TIMEOUT+= -k 2s 180s : not found
bash与sh是有区别的,两者是不同的命令,且bash是sh的增强版,,而”[[]]”是bash脚本中的命令,因此在执行时,使用sh命令会报错,将sh替换为bash命令即可。即使sh链接的是bash,仍然会开启posix模式,和普通的bash还是有区别。
运行shell脚本时报错”[[ : not found”解决方法
new与make
Go提供了两种分配原语,即内建函数 new 和 make。 它们所做的事情不同,所应用的类型也不同。go中的new函数不会初始化内存,只会将内存置零。 也就是说,new(T) 会为类型为 T 的新项分配已置零的内存空间, 并返回它的地址,也就是一个类型为 T 的值。用Go的术语来说,它返回一个指针, 该指针指向新分配的,类型为 T 的零值。
内建函数 make(T, args) 的目的不同于 new(T)。它只用于创建切片、映射和信道,并返回类型为 T(而非 T)的一个**已初始化 (而非置零) 的值。 出现这种用差异的原因在于,这三种类型本质上为引用数据类型,它们在使用前必须初始化。 例如,切片是一个具有三项内容的描述符,包含一个指向(数组内部)数据的指针、长度以及容量, 在这三项被初始化之前,该切片为 nil。对于切片、映射和信道,make 用于初始化其内部的数据结构并准备好将要使用的值。