Lab 1 MapReduce
资料
论文: MapReduce (2004)
实验要求:Lab 1: MapReduce
课程相关,建议看掉 Lecture 1 和 Lecture2,也就是 B 站课程的 P1 和 P2。了解一下 MapReduce 的基本概念,以及 Golang 并发编程和 RPC 的演示。
在 Lecture6,也就是 B 站课程的 P6 中,有这次 Lab 的相关 Q&A,可以小小的借鉴一下。
按理来说不应该寻找解析博客,但既然搜到本篇博客了,这里就推荐一篇解析详细的博客:MIT 6.824 Lab 1: MapReduce 实验。
本篇博客基于上述博客,内容更精简,包含了自己一些的踩坑历程。
任务: task.go
CO (coordinator) 和 C (Client) 都需要使用到Task,有必要定义相同的Task数据结构。
二者RPC通信使用Task,为了减少流量,提高吞吐量(throughput)应当减少Task类的大小,仅仅应当包含二者都必须的内容,不应该包含仅仅需要单方维护的信息。Task是系统框架分配资源的最小单元。
Task包含的字段包括:
TaskTy ...
第9章 顺序容器
顺序容器概述
顺序容器(sequential container):为程序员提供了控制元素存储和访问顺序的能力。这种顺序不依赖于元素的值,而是与元素加入容器时的位置相对应。
顺序容器类型
容器类型
介绍
vector
可变大小数组。支持快速随机访问。在尾部之外的位置插入或删除元素可能很慢。
deque
双端队列。支持快速随机访问。在头尾位置插入/删除速度很快。
list
双向链表。只支持双向顺序访问。在list中任何位置进行插入/删除操作速度都很快。
forward_list
单向链表。只支持单向顺序访问。在链表任何位置进行插入/删除操作速度都很快。
array
固定大小数组。支持快速随机访问。不能添加或者删除元素。
string
与vector相似的容器,但专门用于保存字符。随机访问块。在尾部插入/删除速度快。
除了固定大小的array外,其他容器都提供高效、灵活的内存管理。
forward_list和array是新C++标准增加的类型,没有size()方法
通常使用vector是最好的选择,除非你有很好的理由选择其他容器。
新标准库的容 ...
第8章 IO库
前面章节已经在用的IO库设施
istream:输入流类型,提供输入操作。
ostream:输出流类型,提供输出操作
cin:一个istream对象,从标准输入读取数据。
cout:一个ostream对象,向标准输出写入数据。
cerr:一个ostream对象,向标准错误写入消息。
>>运算符:用来从一个istream对象中读取输入数据。
<<运算符:用来向一个ostream对象中写入输出数据。
getline函数:从一个给定的istream对象中读取一行数据,存入到一个给定的string对象中。
IO类
标准库定义的IO类型
iostream头文件:从标准流中读写数据,istream、ostream等。
fstream头文件:从文件中读写数据,ifstream、ofstream等。
sstream头文件:从字符串中读写数据,istringstream、ostringstream
IO对象不可复制或赋值
1.IO对象不能存在容器里.
2.形参和返回类型也不能是流类型。
3.形参和返回类型一般是流的引用。
4.读写一个IO对象会改变其状态,因此传递和返回的 ...
CSAPP - Cache Lab 详解
Cache Lab [Updated 5/2/16] (README, Writeup, Release Notes, Self-Study Handout)
At CMU we use this lab in place of the Performance Lab. Students write a general-purpose cache simulator, and then optimize a small matrix transpose kernel to minimize the number of misses on a simulated cache. This lab uses the Valgrind tool to generate address traces.
Note: This lab must be run on a 64-bit x86-64 system.
前言
本篇博客将会介绍 CSAPP 之 CacheLab 的解题过程,分为 Part A 和 Part B 两个部分,其中 Part A 要求使用代码模拟一个高速缓存存储器,Part B ...
第7章 类
定义抽象数据类型
类背后的基本思想:数据抽象(data abstraction)和封装(encapsulation)。
数据抽象是一种依赖于接口(interface)和实现(implementation)分离的编程技术。
接口包括用户所能执行的操作;实现包括类的数据成员、负责接口实现的函数体以及定义类所需的各种私有函数。
类成员 (Member)
必须在类的内部声明,不能在其他地方增加成员。
成员可以是数据,函数,类型别名。
类的成员函数
成员函数的声明必须在类的内部。
成员函数的定义既可以在类的内部也可以在外部。
使用点运算符 . 调用成员函数。
必须对任何const或引用类型成员以及没有默认构造函数的类类型的任何成员使用初始化式。
ConstRef::ConstRef(int ii): i(ii), ci(i), ri(ii) { }
默认实参: Sales_item(const std::string &book): isbn(book), units_sold(0), revenue(0.0) { }
*this:
每 ...
CSAPP - Attack Lab详解
Attack Lab [Updated 1/11/16] (README, Writeup, Release Notes, Self-Study Handout)
Note: This is the 64-bit successor to the 32-bit Buffer Lab. Students are given a pair of unique custom-generated x86-64 binary executables, called targets, that have buffer overflow bugs. One target is vulnerable to code injection attacks. The other is vulnerable to return-oriented programming attacks. Students are asked to modify the behavior of the targets by developing exploits based on either code injection o ...
第6章 函数
函数基础
函数定义:包括返回类型、函数名字和0个或者多个形参(parameter)组成的列表和函数体。
调用运算符:调用运算符的形式是一对圆括号 (),作用于一个表达式,该表达式是函数或者指向函数的指针。
圆括号内是用逗号隔开的实参(argument)列表。
函数调用过程:
1.主调函数(calling function)的执行被中断。
2.被调函数(called function)开始执行。
形参和实参:形参和实参的个数和类型必须匹配上。
返回类型: void表示函数不返回任何值。函数的返回类型不能是数组类型或者函数类型,但可以是指向数组或者函数的指针。
名字:名字的作用于是程序文本的一部分,名字在其中可见。
局部对象
两个重要的概念:名字的作用域和对象的生命周期。
生命周期:对象的生命周期是程序执行过程中该对象存在的一段时间。
局部变量(local variable):形参和函数体内部定义的变量统称为局部变量。它对函数而言是局部的,对函数外部而言是隐藏的,还会隐藏在外层作用域中同名的其他所有声明。
自动对象:只存在于块执行期间的对象。当块的执行结束后,它的值就变成未定义 ...
CSAPP - Bomb Lab 详解
Bomb Lab [Updated 1/12/16] (README, Writeup, Release Notes, Self-Study Handout)
A “binary bomb” is a program provided to students as an object code file. When run, it prompts the user to type in 6 different strings. If any of these is incorrect, the bomb “explodes,” printing an error message and logging the event on a grading server. Students must “defuse” their own unique bomb by disassembling and reverse engineering the program to determine what the 6 strings should be. The lab teaches studen ...
第5章 语句
简单语句
表达式语句:一个表达式末尾加上分号,就变成了表达式语句。
空语句:只有一个单独的分号。
复合语句(块):用花括号 {}包裹起来的语句和声明的序列。一个块就是一个作用域。
条件语句
悬垂else(dangling else):用来描述在嵌套的if else语句中,如果if比else多时如何处理的问题。C++使用的方法是else匹配最近没有配对的if。
迭代语句
while:当不确定到底要迭代多少次时,使用 while循环比较合适,比如读取输入的内容。
for: for语句可以省略掉 init-statement, condition和 expression的任何一个;甚至全部。
范围for: for (declaration: expression) statement
跳转语句
break:break语句负责终止离它最近的while、do while、for或者switch语句,并从这些语句之后的第一条语句开始继续执行。
continue:终止最近的循环中的当前迭代并立即开始下一次迭代。只能在while、do while、for循环的内部。
...
Lab 1 MapReduce
课程网址:https://pdos.csail.mit.edu/6.824/schedule.html
以下内容来自课程课件,由于课件纯文本显示效果不佳,故对其排版整理并添加了部分个人笔记批注。

参考资料
【mit6.824分布式lab1-MapReduce(2)】 https://www.bilibili.com/video/BV1EZ4y1i7bX/?share_source=copy_web&vd_source=1e8c177289cfed3be80e766714c3f11f
https://blog.csdn.net/qq_35102066/article/details/110678699?spm=1001.2014.3001.5501
https://blog.csdn.net/qq_44766883/article/details/124475672
https://zhuanla ...