当前位置: 首页 > ds >正文

MIT 6.5840 (Spring, 2024) 通关指南——入门篇

MIT 6.5840 (Spring, 2024) – Startup

👨‍💻 Charles​

🔗 实验手册:6.5840 Home Page: Spring 2024

文章目录

  • MIT 6.5840 (Spring, 2024) -- Startup
    • about test
    • about debug

今年学习了久仰大名的 MIT 6.5840 (Spring, 2024) (原 6.824),收获颇多,写几篇 note 记录一下各个 lab 的 受虐 实现过程。本篇会介绍一些开始实验前的准备工作。

考虑到这门课的难度,准备尝试这个 lab 的同学想必已经有了一定计算机基础,因此假设基础配置已经完成(代码编辑器,go 语言环境等)——你可以先检查是否配好了:

  • Linux 环境(虚拟机 or WSL)
  • go 语言环境
  • 代码编辑器(vscode 等)
  • Git

about test

6.5840 的各个 lab 都配备了非常多的测试样例,通过 go test 进行测试,即:

go test -run name_of_the_test

然而,在后期的分布式实验中,有些错误并不是每次测试都能遇到 (即 corner case) ,可能你跑几百甚至上千次才出现一两次——如果手动一次次的 go test 会累死😵。因此,就像本课助教 Jose Javier(亦是著名的 The Missing Semester of Your CS Education 的作者之一)说的,我们需要一个脚本来:

  • 执行 N 次某组测试
  • 保存测试失败时的日志以供后续检查
  • 并行跑测试以提升效率

为此,助教写了个 python 脚本方便我们跑测试,具体设计详见 Debugging by Pretty Printing 。我用的是一个网上大佬修改后的版本:Utility for running MIT 6.824 lab test in parallel and saving failed logs ,实测可用。具体地,你需要:

  1. 将这个 dstest.py 放到每个 lab 对应的 test_test.go 的相同路径下

  2. 安装对应 python package (主要是 typer)

    我用 conda 配置的环境,但是运行的时候出现报错:

    TypeError: TyperArgument.make_metavar() takes 1 positional argument but 2 were given
    

    后来发现是 conda installtyperclick 包版本不兼容,因此先:

    conda remove click typer
    

    然后:

    pip install click==8.1.3 typer==0.8.0
    

    就可以了。

  3. 添加执行权限:

    chmod +x dstest.py
    
  4. 运行:

    ./dstest.py --help
    

    正常情况下即可输出使用说明:

    在这里插入图片描述

实验手册 会告诉你每个 lab 各部分的测试该怎么跑,以内容最多的 lab3 为例,其 Part B 有很多测试点:

lab3b-test-intro

每个 lab 的具体测试点都可以在对应文件夹里面的 test_test.go 中找到。例如:
请添加图片描述

因此,当你卡在某(几)个测试点的时候,不妨来这里看看具体测试流程是什么(看不懂可以直接扔给 AI,它包看得懂的)。然后,结合上面的测试脚本,可以方便地针对某些测试点多次测试(这对于检查跑几十次才会遇到的 corner case 很有用),例如:
dstest_demo

./dstest.py 的可选参数可以通过 ./dstest.py --help 了解,上文亦有展示。比如,上图采用了:

  • -p 4 :4 个并行 worker,并发地跑测试
  • -n 50 :每个测试跑 50 次
  • -r :开启数据竞争检查

添加 -o <folder_path> 可以设置保存出错测试日志的文件夹:
dstest_demo2

💡 后面的分布式相关实验涉及大量并发,因此每个 lab 测试的时候都要记得用 -race 检查有无数据竞争:

  • go test -race xxx
  • ./dstest.py -r xxx

about debug

在后续的 lab 中,盯着日志找出错原因的时间很可能会远远大于写代码的时间,因此我觉得从一开始就确定(你自己看得懂、看得清楚的)日志形式蛮重要的。默认代码中的日志打印方式为:

import "log"// Debugging
const Debug = truefunc DPrintf(format string, a ...interface{}) {if Debug {log.Printf(format, a...)}
}

使用效果为:

func main() {n := 101DPrintf("this is a log output, %d", n)	
}>>> 2025/08/24 21:45:55 this is a log output, 101

如果按照助教的 Debugging by Pretty Printing 来,你的日志会是这样的:
colorful-log

确实 酷炫 清晰不少。但是具体还是看自己需求,我自己是仅仅加了根线和微秒级时间戳:

func DPrintf(format string, a ...interface{}) {if Debug {log.SetFlags(log.Ldate | log.Ltime | log.Lmicroseconds)log.Println(strings.Repeat("-", 100))log.Printf(format, a...)}
}

使用效果为:
my-log-demo

其中 R[x_y] 表示节点 x ,它当前 term 为 y 。对我而言这种形式就够用了。

http://www.xdnf.cn/news/18858.html

相关文章:

  • MYSQL-表的约束(下)
  • 【机器学习】5 Bayesian statistics
  • 46.【.NET8 实战--孢子记账--从单体到微服务--转向微服务】--扩展功能--集成网关--网关集成日志
  • 前端漏洞(上)- Django debug page XSS漏洞(漏洞编号:CVE-2017-12794)
  • 【C++组件】ODB 安装与使用
  • 春秋云镜 TOISEC 部分WP
  • 3.1 存储系统概述 (答案见原书 P149)
  • 鸿蒙中Frame分析
  • NLP:Transformer各子模块作用(特别分享1)
  • 网络编程socket-Udp
  • 互联网大厂Java面试模拟:深度解析核心技术
  • 100个实用小工具1.3历年股价分析小工具新增股价批量下载
  • 使用UE5开发2.5D开放世界战略养成类游戏的硬件配置指南
  • 电子厂静电释放检测误报率↓81%!陌讯多模态融合算法在安全生产监控的落地实践
  • imx6ull-驱动开发篇38——Linux INPUT 子系统
  • MATLAB 数值计算进阶:微分方程求解与矩阵运算高效方法
  • 从 Unity UGUI 到 Unreal UMG 的交互与高效实践:UI 事件、坐标系适配与性能优化
  • WinContig:高效磁盘碎片整理工具
  • 基于蓝牙的stm32智能火灾烟雾报警系统设计
  • Golang云端编程入门指南:前沿框架与技术全景解析
  • 访问控制基础与模型综述
  • Python自学笔记11 Numpy的索引和切片
  • Sui 主网升级至 V1.54.2
  • Lucene 与 Elasticsearch:从底层引擎到分布式搜索平台的演进
  • 虚幻引擎5(UE5)Android端游戏开发全流程指南:从环境配置到项目发布
  • Spring Boot测试陷阱:失败测试为何“传染”其他用例?
  • 在PC机上使用虚幻引擎5(UE5)开发第一款游戏的完整入门指南
  • HTTP请求中的CGI请求与登录注册机制
  • Golang云端编程深度指南:架构本质与高阶实践
  • 动态规划--编译距离