三条学习路线
全书 79 章 + 11 个项目,不需要按顺序从头读到尾。下面三条路线对应三类目标,选一条走通,再横向扩展。
0. 依赖关系
┌────────────── 第 0 篇 命令行与 Shell ──────────────┐
│ 0.1–0.6 基础 0.7–0.9 脚本/进程 0.10–0.14 系统 │
└───────────────┬───────────────────────────────────┘
│
┌───────────────────▼───────────────────┐
│ 第 1 篇 计算机系统 │
│ 1.2 表示 1.3 汇编 1.6 缓存 1.9 虚拟内存 │
│ 1.7 链接 1.8 异常 1.12 并发 1.13 OS 理论 │
└───────┬───────────────────────┬───────┘
│ │
┌────────────▼──────────┐ ┌────────▼─────────────────┐
│ 第 2 篇 系统编程 │ │ 第 3 篇 内核 │
│ 2.2–2.4 文件 I/O │ │ 3.3 中断 3.5 调度 │
│ 2.7–2.11 进程/信号 │ │ 3.7–3.10 内存 │
│ 2.12–2.13 线程/同步 │ │ 3.11 并发 3.12 VFS │
│ 2.16–2.18 socket/IO │ │ 3.15 调试 │
└────────────┬──────────┘ └────────┬─────────────────┘
│ │
└───────────┬───────────┘
│
┌────────────▼────────────┐
│ 第 4 篇 网络(4.8–4.12) │
│ 收包/发包/socket/epoll │
└────────────┬────────────┘
│
┌────────────▼────────────┐
│ 第 5 篇 云原生 + 第 6 篇 │
│ namespace/cgroups/项目 │
└─────────────────────────┘
1. 路线 A · 应用与运维(6–8 周)
目标:把 Linux 当生产环境用;能写自动化脚本;能定位服务、磁盘、网络问题;能交付容器化服务。
| 周 | 内容 | 必读 | 可后补 | 验收 |
|---|---|---|---|---|
| 1 | 命令行基本功 | 0.1–0.6 | 0.2 的 vim 细节 | 用管道统计 nginx 日志 Top 10 IP |
| 2 | Shell 工程 | 0.7–0.9 | 0.8 的数组高级用法 | 写一个带锁、超时、日志的备份脚本 |
| 3 | 系统与磁盘 | 0.10–0.12 | 0.10 的 RAID 细节 | 扩 LV、修 fstab、写 systemd unit |
| 4 | 网络与排障 | 0.13–0.14 | 0.14 的 eBPF | 用 ss/tcpdump 定位一次连接失败 |
| 5 | 协议与云原生 | 4.1–4.7, 5.1–5.6 | 4.4 的拥塞控制细节 | 手写 Dockerfile,搭 bridge 网络 |
| 6–8 | 项目 D | D1/D2/D3 选一 | — | 通过该项目的 Stage 验收 |
最小必读集:0.1–0.9、0.12–0.14、4.1–4.5、5.1–5.6。 可以跳过:1.3–1.5、2.12–2.18、3.5–3.13、4.8–4.12。
2. 路线 B · 系统编程(10–12 周)
目标:写出正确、可移植、可观测的系统程序;能读内核源码;能实现一个中型系统。
| 周 | 内容 | 必读 | 可后补 | 验收 |
|---|---|---|---|---|
| 1 | 系统底座 | 1.1–1.3, 1.7–1.8 | 1.4 流水线 | 能读 objdump -d 与崩溃栈 |
| 2 | 内存与性能 | 1.5–1.6, 1.9 | 1.9 的垃圾回收 | 用 perf 找出一个 cache 不友好循环 |
| 3 | I/O | 2.1–2.4 | 2.4 的 stdio 实现 | 写带 EINTR/短读处理的 cat |
| 4 | 文件与目录 | 2.5–2.6 | 2.5 的 xattr | 写 find 的简化版 |
| 5 | 进程 | 2.7–2.9 | 2.9 的 capability | 写带超时与回收的 timeout |
| 6 | 信号与定时器 | 2.10–2.11 | 2.11 的 POSIX timer | 写信号安全的日志轮转 |
| 7 | 线程 | 2.12–2.13 | 2.13 的 TLS | 写线程池 + 有界队列 |
| 8 | IPC 与 socket | 2.14–2.17 | 2.15 的 POSIX 共享内存 | 写一个多进程聊天室 |
| 9 | 高性能 I/O | 2.18–2.19 | 2.19 的 pty | 用 epoll 写 echo 服务器 |
| 10–12 | 项目 | A2 / B1 / B2 / C2 选一 | — | 通过 Stage 验收 + 压测报告 |
最小必读集:1.2–1.3、1.6–1.9、2.1–2.4、2.7–2.13、2.16–2.18。 可以跳过:0.10–0.12、3.5–3.6、4.2–4.3。
3. 路线 C · 内核与性能(12–16 周)
目标:读懂内核关键路径;能用证据定位 CPU/内存/I/O/网络瓶颈;能改内核模块或 eBPF 程序。
| 周 | 内容 | 必读 | 可后补 | 验收 |
|---|---|---|---|---|
| 1–2 | 系统底座 | 1.2–1.3, 1.6, 1.9 | 1.4 | 能手算页表翻译与 cache 组号 |
| 3 | OS 理论 | 1.13 | OSTEP 分布式部分 | 能画进程/内存/文件系统状态图 |
| 4 | 内核入门 | 3.1–3.3 | 3.2 的 ACPI | 编译内核、跑 QEMU、加一个 printk |
| 5 | 进程与调度 | 3.4–3.6 | 3.6 的 EAS | 用 perf sched 分析一次抖动 |
| 6–7 | 内存 | 3.7–3.10 | 3.10 的 KSM | 用 bpftrace 统计缺页与回收 |
| 8 | 并发 | 3.11 | 3.11 的 RCU 实现 | 写一个无锁队列并压测 |
| 9 | 文件系统 | 3.12–3.13 | 3.13 的 blk-mq | 用 ftrace 追一次 fsync |
| 10 | 调试 | 3.15 | 3.14 的驱动模型 | 用 crash/drgn 读一次 vmcore |
| 11 | 网络栈 | 4.8–4.12 | 4.6 的拥塞控制 | 用 bpftrace 追一次收包 |
| 12–16 | 项目 | A1/A3/C1 选一 | — | 通过 Stage 验收 + 性能报告 |
最小必读集:1.2–1.3、1.6、1.9、1.13、3.1–3.13、3.15、4.8–4.12。 可以跳过:0.7–0.9、2.5–2.6、5.6。
4. 每周节奏
无论哪条路线,建议每周固定四件事:
- 读:2–3 章正文,先看「本章回答」与图,再读细节;
- 做:每章至少跑通一个实验,记录命令与输出;
- 测:章末出口检查 + 回忆卡,错题回到对应小节;
- 写:一页笔记,只写「路径 + 边界 + 一个反例」,不抄书。
5. 检查点
| 检查点 | 时间 | 达标标准 |
|---|---|---|
| CP1 | 第 2 周 | 能不查手册完成 20 条命令行任务 |
| CP2 | 第 4 周 | 能写 200 行带错误处理的 Shell 脚本 |
| CP3 | 第 6 周 | 能解释一次 open() 到磁盘的完整路径 |
| CP4 | 第 8 周 | 能写线程池并通过 helgrind/TSan |
| CP5 | 第 10 周 | 能用 perf 定位一个真实瓶颈并给出优化前后数据 |
| CP6 | 第 12 周 | 项目 Stage 3 通过,有测试与压测报告 |
下一站:符号与命令约定告诉你本书的排版语言。