调研与整理日期:2026-08-15。面向本科阶段学过数据结构、组成原理、操作系统和 编译原理,但现在需要为 Agent 工程重新建立系统直觉的开发者。建议投入 20 周、每周 8~10 小时;Rust 另算 1~2 小时兴趣时间。
不建议按课程目录把六门课从头到尾重修。对 Agent 开发,最有效的安排是:
诊断现状
→ CSAPP:恢复程序员视角的系统全景
→ CS61C 精选:补 RISC-V / Cache / 页表先修
→ MIT 6.1810 精选:深入进程、隔离、并发、文件系统与恢复
→ 按真实瓶颈选一个专项:网络 / 数据库 / 分布式系统
CS61B:主线中按需插入
Rust:全程低压并行,不阻塞主线
编译原理:仅在 Coding Agent / DSL / 静态分析方向开启
贯穿主线的不是课程完成率,而是一个用日常主力语言实现的 Agent Runtime Lab。 每学到一个系统主题,就把它转成可运行、可注入故障、可测量的 Agent 基础设施能力。
完整的课程证据、版本、实验取舍和环境说明见调研依据与课程取舍。
“哪门课最有价值”和“实际先学什么”不是同一个问题。
| 优先级 | 内容 | 为什么现在值得学 | 处理方式 |
|---|---|---|---|
| P0 | CSAPP / 15-213 | 一次串起进程、信号、I/O、内存、Cache、网络和并发,是定位底层问题的最短入口 | 精选章节 + Shell/Proxy 两个核心实验 |
| P0 | MIT 6.1810(原 6.S081) | 深入系统调用、隔离、页表、锁、文件系统与崩溃恢复;sandbox 实验与工具执行直接相关 | 精选 xv6 讲义与 5~6 个实验 |
| P1 | 状态或网络专项 | Agent 常见难点其实是幂等、恢复、背压、超时和重试,不完全包含在原六门课中 | 在 15-445 与 CS144 中二选一 |
| P1 | CS61C | 为 RISC-V xv6 补先修,并恢复代码到硬件的因果链 | 只学 2 周桥梁内容 |
| P1 | CS61B | 调度队列、DAG、缓存和索引会反复用到,但本科基础足够按需唤醒 | 10~15 小时即时复习包 |
| P2 | 编译原理 | 对通用工作流 Agent 回报有限;对 Coding Agent、代码重写、DSL 很关键 | 满足触发条件后再做 6~8 周专项 |
| 支线 | Rust / CS110L | 能用所有权和类型系统重新观察并发、进程与资源生命周期,但不是工作必需 | 每周 1~2 小时,可随时暂停 |
CS61C 的整体价值低于 6.1810,但它在学习顺序中必须位于 6.1810 前面,因为 xv6 使用 RISC-V,页表、调用约定和特权级也需要最低限度的体系结构基础。CS61B 则不占固定大阶段, 只在实现优先队列、依赖图或缓存时插入。
先独立完成下面的诊断,不查资料,也不要让 AI 直接回答。不会是正常结果;它用来决定 哪些内容可以跳过。
- 画出一次工具调用从父进程到
fork/exec、管道读写、退出和wait回收的生命周期。 - 解释为什么父进程关闭了写端,读端仍可能永远收不到 EOF。
- 解释 timeout、deadline、cancel、
SIGTERM、SIGKILL和进程组各自解决什么问题。 - 从一段函数调用画出栈帧、寄存器、虚拟地址、页表、Cache 和物理内存之间的路径。
- 给出一个 race、一个 deadlock、一个 lost wakeup,以及各自可观测的症状。
- 解释“请求重试”为什么可能造成重复副作用,幂等键和事务边界分别保护什么。
- 用主力语言在 60 分钟内写一个最小工具执行器:并发读取 stdout/stderr,限制运行时间, 终止后回收子进程,并为“大量输出”和“子进程再派生子进程”各写一个失败测试。
记录结果:完全正确记 2 分,方向正确但细节不稳记 1 分,不会记 0 分。不要用总分决定 “我基础好不好”,只标记薄弱主题。若 1~3 已经稳定,可压缩 CSAPP 的进程部分;若 4 稳定,可压缩 CS61C;若 5~6 不稳,则保留并发、文件系统和数据库专项。
每周 8~10 小时建议这样分:
- 2 小时:带着问题读教材/讲义,不追求从第一页读到最后一页;
- 4~5 小时:实验或最小复现;单个卡点到 6 小时必须写下假设并缩小问题;
- 2 小时:Agent Runtime Lab,把本周概念迁移到真实工程;
- 1 小时:闭卷回忆、画图、复盘和制定下周停止条件;
- 可选 1~2 小时:Rust 兴趣支线,不计入主线进度。
建议保持 60% 动手、25% 阅读、15% 回忆与复盘。视频只是遇到概念断点时的解释器, 不是进度单位。每周复制一次学习进度模板。
目标:拿到基线,确保后续时间花在知识而不是工具安装上。
- 完成上面的诊断并保存答案;
- 准备一台 x86-64 Linux VM 或远程 Linux 环境,用于 CSAPP、GDB、信号和
ptrace; - 按 MIT Tools 页面准备 QEMU、RISC-V GCC/Binutils 和 GDB;
- 创建 Agent Runtime Lab,先只提交失败测试、架构草图和观测指标;
- 课程解答放私有目录/私有仓库,本仓库只保存概念笔记、复盘和自研贯穿项目。
退出条件:能够编译一个 C 程序、用 GDB 断点和查看寄存器,并启动 xv6 的 make qemu。
若环境超过一个晚上仍未打通,优先使用 Linux VM,不继续修补跨架构兼容层。
| 周 | 学习主题与课程动作 | Agent Runtime Lab 交付 | 闭卷检查 |
|---|---|---|---|
| 1 | 机器级程序、栈、调用约定;完成 Bomb Lab 核心阶段或等价 GDB 练习 | v0:启动一个工具子进程,记录 PID、退出码、耗时 | 从源代码画出调用栈;解释一次函数调用保存了什么 |
| 2 | 存储层次、局部性、Cache;Cache Lab 与 Malloc Lab 二选一,性能瓶颈优先 Cache | 为输出缓冲和事件队列做基准,区分吞吐、延迟与内存占用 | 预测两种访问模式的 Cache 行为,再用测量验证 |
| 3 | 异常控制流、进程、信号、fork/exec/wait;启动 Shell Lab |
v0.5:并发流式读取 stdout/stderr,支持 timeout、cancel、进程组终止和回收 | 画出正常退出、超时、父进程崩溃三条生命周期 |
| 4 | 虚拟内存、地址空间、动态分配;完成 Shell Lab | 加入输出上限、临时工作目录和资源使用观测;测试 10 MB 输出与孙进程泄漏 | 解释 page fault、copy-on-write 和内存泄漏为何不是同一问题 |
| 5 | 系统 I/O、文件描述符、网络、并发;启动 Proxy Lab | v1:加入有界 worker pool、队列长度和 backpressure | 解释 EOF、短读/短写、阻塞和 readiness 的区别 |
| 6 | 完成 Proxy Lab 的最小正确版本;只在有余力时做缓存/并发扩展 | 给执行器加 deadline 传播、结构化错误和压测;写一份故障复盘 | 从一次工具请求追到 socket、线程、进程与日志,并指出资源所有者 |
阶段取舍:Shell Lab 和 Proxy Lab 是必做;Cache/Malloc 二选一;Bomb 只做恢复调试能力所需 的部分。Data Lab、Attack Lab 和完整考试默认跳过。
Checkpoint A:不用查资料,能解释并演示 fork → exec → pipe → signal → wait;故意制造
僵尸进程、管道不结束、输出撑爆内存和进程取消不彻底,执行器测试都能稳定捕获。未通过时
只补相关章节和最小复现,不重看整套视频。
| 周 | 学习主题与课程动作 | Agent Runtime Lab 交付 | 闭卷检查 |
|---|---|---|---|
| 7 | C 内存模型复习;RISC-V 指令、寄存器和 calling convention;完成对应短 Lab | 选执行器的一条热路径,观察编译结果和系统调用边界 | 手工跟踪一次函数调用的参数、返回值、栈和保存寄存器 |
| 8 | datapath 理解即可;重点学习 pipeline hazard、Cache 和虚拟内存 | 为关键队列或序列化路径做 profile,给出一个“测量后才优化”的改动 | 从 load 指令追到 TLB、页表、Cache 与内存,并区分缺失发生在哪一层 |
默认不做完整数字逻辑、Logisim CPU 和全部大型项目。若两周后仍不能阅读简单 RISC-V、 解释调用约定或页表地址转换,额外加一周;否则立即进入 OS,不为“课程完整”停留。
Checkpoint B:能够在 xv6 中从用户函数追到系统调用入口,并解释用户态/内核态切换前后 PC、栈和权限发生了什么变化。
| 周 | 学习主题与建议实验 | Agent Runtime Lab 交付 | 闭卷检查 |
|---|---|---|---|
| 9 | xv6 结构、system call;做 syscall Lab,包含 sandbox 练习 | v2:定义工具 policy(命令、目录、环境变量、资源预算)并写逃逸测试 | 从用户调用追到 trap、dispatcher 和返回路径 |
| 10 | 页表、地址空间;做 pgtbl Lab | 明确每次任务的隔离边界,记录可见文件、环境和凭据 | 画三级页表遍历,解释 TLB 与权限位 |
| 11 | trap、lazy allocation、copy-on-write;做 cow Lab,trap Lab 按诊断结果选做 | 让大输入/大输出不必整份复制,测量峰值内存 | 解释 COW 的 fault、引用计数和并发释放风险 |
| 12 | 中断、线程切换、锁;做 lock Lab | v2.5:有界调度器,含优先队列、取消竞态和饥饿监控 | 给出锁不变量,区分 race、deadlock、starvation |
| 13 | 文件系统、buffer cache、inode 和 logging;启动 fs 或 mmap Lab | v3:append-only event log、原子状态转换和幂等键 | 解释崩溃发生在写数据/元数据/commit 各阶段的可见结果 |
| 14 | 完成 fs/mmap 二选一;阅读 crash recovery | 加 checkpoint/replay 和 crash injection;验证恢复后不重放副作用 | 给出至少三种崩溃点及其恢复不变量 |
| 15 | 阅读网络驱动、容器/VM、隔离与安全材料;内核 net Lab 默认跳过 | 运行威胁建模:不可信工具、恶意输出、路径穿越、子进程树、凭据泄漏 | 说明 syscall 过滤、文件权限、容器和 VM 各能/不能隔离什么 |
| 16 | 回看 xv6 源码,把 syscall、进程、VM、锁、FS 串成完整路径 | 完成 v3 压测与故障报告,列出尚未满足的生产安全边界 | 在白板上讲清“一次持久化工具调用”的完整系统路径 |
必做实验:syscall(含 sandbox)、pgtbl、cow、lock;fs 与 mmap 二选一。若 trap/特权级 仍不稳,把 traps 升为必做。内核 net driver 默认跳过。
Checkpoint C:随机选择一个 xv6 系统调用,能从用户代码追踪到内核数据结构、锁、页表或 文件系统,再返回用户态;Agent Runtime Lab 在任意一次状态写入前后被强制终止,恢复后 都不会丢失已确认任务或重复外部副作用。
只选一条。三条都学会把复习再次变成没有反馈的课程收集。
适合:流式响应经常中断、连接管理混乱、吞吐/延迟不稳、重试风暴或背压问题明显。
- 第 17 周:byte stream 与 backpressure;
- 第 18 周:TCP receiver、重组与乱序;
- 第 19 周:TCP sender、重传、RTT 与超时;
- 第 20 周:把 deadline、指数退避+jitter、连接断开和 load shedding 加入 Runtime Lab。
完成标准:能用故障注入复现丢包、延迟、半开连接和消费者变慢,并用指标解释系统为何 恢复;不是只让 happy path 请求成功。
适合:Agent memory、任务状态、幂等、checkpoint、并发写入和断点恢复是当前瓶颈。
- 第 17 周:页式存储、buffer pool、B+Tree/Hash/向量索引的取舍;
- 第 18 周:事务、隔离级别和 MVCC;
- 第 19 周:WAL、checkpoint、recovery;
- 第 20 周:用 SQLite/PostgreSQL 实现 durable task queue,压测重复消费和崩溃恢复。
完成标准:能明确每个状态转换的事务边界、幂等键、唯一约束和恢复策略;通过 kill -9、 重复投递、两个 worker 竞争和磁盘写入失败测试。
仅适合:已经确认问题需要跨进程或跨机器协调,而不是单机并发或数据库事务即可解决。
- 第 17~18 周:MapReduce Lab;
- 第 19~20 周:KV server Lab,学习线性一致性、版本和客户端重试;
- Raft 和分片 KV 不纳入这 20 周,作为下一阶段独立决策。
完成标准:worker 崩溃、重复 RPC 和网络延迟下任务仍能收敛,并能说明交付语义是 at-most-once、at-least-once 还是 effectively-once。
请使用日常生产主力语言,不必用 Rust。项目的最小边界如下:
| 版本 | 能力 | 必须验证的失败场景 |
|---|---|---|
| v0 进程执行器 | 子进程、流式 stdout/stderr、退出码、timeout、cancel、回收 | 大输出、永不退出、孙进程残留、stdout/stderr 同时写满 |
| v1 有界调度器 | 优先队列、依赖 DAG、并发上限、backpressure、retry budget | 队列爆满、依赖失败、取消竞态、饥饿、重试风暴 |
| v2 策略边界 | 工作目录、环境 allowlist、命令/路径 policy、资源预算 | 路径穿越、继承敏感变量、fork bomb 雏形、恶意日志 |
| v3 持久化执行 | event log、幂等键、checkpoint/replay、原子状态转换 | 每个写入点前后崩溃、重复投递、两个 worker 竞争 |
| v4 专项扩展 | 网络可靠性、数据库事务或多机容错三选一 | 由阶段 4 的完成标准决定 |
每个版本都要包含:一张状态机图、至少一个故障注入器、结构化日志、4 个核心指标、自动化 测试和一页复盘。建议指标是队列等待时间、执行延迟、超时/取消率、孤儿进程数、重试次数、 恢复耗时和重复副作用数,按版本选最相关的四个。
重要边界:上述练习能建立隔离直觉,但工作目录、allowlist、容器甚至 syscall filter 都不能 自动等价为可承受任意敌手的生产 sandbox。真正执行不可信代码时仍需独立威胁模型、最小 凭据、内核/VM 边界、网络出口策略、资源限制和安全评审。
不要预留一个月重做 Java 课程。Runtime Lab 遇到对应结构时,先独立实现,再回看课程材料:
| 触发问题 | 复习内容 | 最小交付 |
|---|---|---|
| 任务优先级、公平性、超时队列 | Heap / Priority Queue,复杂度 | 支持优先级与稳定次序的有界队列 |
| 工具/步骤依赖、循环依赖 | Graph、DFS/BFS、DAG、拓扑排序 | 能检测 cycle、传播失败的执行图 |
| session/cache/tool registry | Hashing、Trie、LRU/TTL 思想 | 带容量和过期策略的缓存,报告命中率 |
| 动态连通或资源分组 | Union-Find | 只有真实需求出现时实现 |
闭卷标准:能说出操作复杂度、内存代价、不变量和退化场景,并用基准或属性测试验证;仅能 背 API 不算完成。
Rust 的目的不是替换工作语言,而是用所有权、生命周期和类型系统重新观察资源管理。 以每周 1~2 小时为上限,忙时直接暂停。
- Rust Book + Rustlings 同步进行;
- ownership/borrowing、
Option/Result、错误传播、enum/match、迭代器; - 做一个读取 JSONL、统计工具执行结果的 CLI。
退出条件:能解释一个值何时 move、borrow、drop;错误用 Result 传播而不是到处 unwrap。
- trait、generic、模块、测试、智能指针;
- 把 CLI 重构为可替换的 parser/store 接口;
- 用线程安全类型表达共享/不共享状态。
- thread、channel、
Arc<Mutex<_>>、std::process::Command; - 实现一个小型并发工具执行器,与主线版本对照错误模型和资源生命周期;
- 先理解同步版本,再决定是否学习 async/Tokio。
- 对进程、调试器和
ptrace感兴趣:选 DEET;需要 x86-64 Linux; - 对网络、并发和负载均衡感兴趣:选 Balancebeam;
- 遇到旧 crate/API 时升级依赖或缩小范围,不为复刻旧课程固定旧工具链。
停止条件:Rust 连续两周挤占主线,立即暂停;主线 Checkpoint C 完成后再恢复。async 不是 入门勋章,只有同步并发、取消和错误传播已经清楚时才进入。
满足以下任一条件,再启动 PKU 编译实践或同类课程:
- Agent 必须理解、修改或验证代码结构,而文本搜索已明显不足;
- 正在设计 DSL、工作流语言、静态分析器、代码索引或 Coding Agent;
- 需要可靠处理 scope、symbol、type、control/data flow,而不是只调用现成 parser。
建议 6~8 周:lexer/parser 与 AST → 语义分析 → IR → 优化基础 → RISC-V 后端。可以用 Rust 实现,将兴趣支线、CS61B 数据结构和 CS61C RISC-V 汇合。通用 Agent/RAG/工作流 场景默认跳过;调用 Tree-sitter/LSP 并不要求先完整实现编译器。
AI 很适合做即时教练,但必须保留“先形成自己的系统模型”这一步:
- 实验前先写预测、关键不变量和失败条件;
- 卡住 30~45 分钟后,让 AI 用问题缩小范围,先不给完整实现;
- 让 AI 生成边界测试、故障注入点、代码审查清单和反例;
- 修复后闭卷解释根因,再让 AI 挑错;
- 不向公开仓库提交课程解答,也不让 AI 生成可直接提交的完整实验答案。
真正的学习证据是:能预测、能复现、能测量、能解释、能迁移。提示后“看懂了”只算一次 暴露,不算掌握。
- 继续:本周产出了可运行实验、失败证据或一页因果复盘,并且它推进了当前检查点。
- 压缩:闭卷正确率至少 80%,且能在 Runtime Lab 中迁移,就跳过同层级重复内容。
- 补课:连续两次无法解释同一因果链,只补对应章节和最小实验,不回到课程开头。
- 降载:连续两周没有可验证产物,把下一阶段范围砍半,不靠延长计划自我安慰。
- 暂停专项:现实项目没有对应问题,或专项连续三周不能改变设计/调试判断。
- 主线完成:通过 Checkpoint A~C、Runtime Lab v3 故障测试,并完成一个阶段 4 专项; 不要求看完所有视频或做完所有作业。
- 完成 90 分钟诊断,保留原始答案;
- 选择一台稳定的 x86-64 Linux 环境并跑通 GDB;
- 用主力语言建立 Agent Runtime Lab,只写 v0 的接口、状态机和失败测试;
- 开始 CSAPP 机器级程序与 Bomb Lab 核心阶段;
- Rust 只安装当前 stable 工具链,完成 Rustlings 的第一小组练习。
四周后第一次复盘。如果执行器已经能正确处理进程树、并发输出、timeout 和回收,允许 提前进入 CS61C;如果仍主要在看视频,则暂停新内容,先完成 Shell Lab 与 v0 验收。
- 权威课程资料与实验调研
- 区分价值优先级与实际学习顺序
- 每门课程给出必学、选学和跳过项
- 20 周主线、时间预算与停止规则
- Agent Runtime Lab 贯穿项目与故障验收
- 闭卷 Checkpoint A~C
- Rust 独立兴趣支线
- 使用进度模板跑完第一周并按真实反馈调整