【OS原理系列 · 00】如何用OSTEP课程吃透操作系统原理
这是「OS 原理」系列的第一篇文章,也是整个系列的地图。
这个系列写给自己,也写给所有想把操作系统原理真正学透的工程师:不背面试题,不碎片化地收藏文章,花一个季度的时间,沿着一条经过验证的路线,把OS的主干知识完整地走一遍,并沉淀成自己能讲清楚、能用起来的体系。
全文约 9000 字,读完大约 25 分钟。建议收藏后按图索骥。
一、为什么工程师值得系统学一遍 OS 原理
先看三个工程师再熟悉不过的场景:
- 容器里跑的服务半夜被 OOM Kill,你盯着
dmesg里的日志,却说不清 RSS、page cache、swap 之间到底是谁把内存吃掉的; - 数据库写入延迟周期性抖动,你怀疑是"IO 问题",但从磁盘寻道、RAID 条带、文件系统日志到 fsync 语义,中间任何一环你都不敢下结论;
- 高并发服务上线后吞吐上不去,CPU 却没跑满——问题可能出在线程池大小、锁竞争、上下文切换开销,但你没有一套框架去定位。
这三个问题的共同点是:它们都发生在你写的代码之下。你写的每一行业务代码,最终都要经过进程调度、虚拟内存、文件系统、IO 栈这几层。上层框架越抽象,下层黑盒出现问题时,能往下看几层,就是普通工程师和系统工程师的分水岭。
碎片化学习的典型症状是:知道 TLB 是什么,但串不起"缺页 → 调度 → 磁盘 IO"的完整链路;能背出死锁四条件,却定位不了生产环境的一次线程 hang。碎片知识解决不了系统问题,只有体系可以。
操作系统、计算机网络、数据库,是计算机体系的三大支柱,而 OS 是另外两者的地基:网络的收发路径在内核,数据库的一切都建立在虚拟内存与持久化之上。把 OS 补上,另外两块的理解会顺带加深——这是我认为它性价比最高的原因。
二、为什么选 OSTEP 作为主线
市面上的 OS 书不少,先给一张对比表:
| 书 / 课程 | 特点 | 作为主线的问题 |
|---|---|---|
| OSTEP(本书) | 围绕三大主题组织;每章短小、聚焦;讲机制更讲权衡(mechanism/policy/tradeoff) | —— |
| 恐龙书(Operating System Concepts) | 教科书式大而全 | 900 页+,自学劝退率高,工程视角弱 |
| 现代操作系统(Tanenbaum) | 经典,覆盖广 | 同上,且没有配套动手体系 |
| CSAPP | 优秀,但主题是"程序员的系统视角" | 只深入虚拟内存等少数章节,不覆盖 OS 全貌 |
| xv6 book | 源码级讲解一个真实内核 | 需要先有概念框架再读,适合第二遍 |
| 深入理解 Linux 内核 | Linux 实现细节 | 是"实现字典",不是入门教材 |
OSTEP(《Operating Systems: Three Easy Pieces》,中文版《操作系统导论》)胜在四点:
- 一条主线讲透:全书围绕三个"容易的部分"——虚拟化(Virtualization)、并发(Concurrency)、持久化(Persistence),外加安全部分。CPU 和内存是"虚拟化"出来的,这是全书最漂亮的视角,一旦接受,很多孤立知识点会自动归位;
- 章节设计对自学者极其友好:每章 15~25 页、一次课的量;章首对话体引入问题,正文围绕一个个 CRUX(关键问题)展开,读起来像被老师带着做思维实验;
- 讲权衡而非结论:为什么有 SJF 还要有 MLFQ?为什么分段之后还要分页?每种机制都是在具体约束下对问题的回应——这正是工程师最需要的思维方式;
- 配套生态完整:这是它区别于所有其他教材的地方——作者亲自授课的全套课程视频、每章配套的模拟器作业、以及一整套带自动测试的项目。一门课,把"读、看、练、做"四件事全配齐了。
需要说清它的边界:OSTEP 讲的是原理与抽象机制,不含 Linux 内核实现细节。所以本系列的固定动作是:每学完一个模块,就对照 Linux 内核做一次"落地验证"(比如学完分页,去看 cr3、多级页表和 THP 的关系)。原理 + 实现对照,才是一个完整闭环。
三、资源全景图:一个主战场,四个配套库
自学最大的坑是"资源迷路":收藏了 50 个链接,一个没用上。下面这张表是这个系列的全部资源,不多不少。
3.1 核心资源
| 资源 | 地址 | 用途 |
|---|---|---|
| OSTEP 英文原版(v1.10) | https://pages.cs.wisc.edu/~remzi/OSTEP/ | 主教材,官方免费章节 PDF,永远以它为准 |
| OSTEP 官方中文版 | https://pages.cs.wisc.edu/~remzi/OSTEP/Chinese/ | 卡壳时的对照阅读;翻译由原书作者背书 |
| 纸质书《操作系统导论》 | 人民邮电出版社 | 通读标注用,通勤/睡前场景 |
| 课程视频(CS 537, Spring 2018) | https://pages.cs.wisc.edu/~remzi/Classes/537/Spring2018/ | 作者 Remzi 亲授,配套书的完整学期课 |
| 作业库 ostep-homework | https://github.com/remzi-arpacidusseau/ostep-homework | 30 个章节作业目录,绝大多数是 Python 模拟器 |
| 项目库 ostep-projects | https://github.com/remzi-arpacidusseau/ostep-projects | 17 个项目(C/Linux 应用线 + xv6 内核线),自带测试脚本 |
| 书中代码 ostep-code | https://github.com/remzi-arpacidusseau/ostep-code | 书里出现的示例代码,跟书目录一一对应 |
3.2 辅助资源
| 资源 | 用途与用法 |
|---|---|
| 社区习题解答(如 GitHub 上的 ostep-solutions 类仓库) | 先自己做,卡 30 分钟以上再看;看的是思路不是答案 |
| B 站字幕版课程视频 | 搜索 “OSTEP” 或 “CS537”,英语吃力时的平替;但笔记术语保留英文 |
| xv6 book & MIT 6.1810 | 学完 OSTEP 后的内核进阶线(本系列第二阶段) |
| jyy(南京大学 蒋炎岩)OS 课 | 拓宽视野的补充视角,适合第二遍学时交叉印证 |
| 《Linux 内核设计与实现》(LKD) | 每模块的 Linux 对照阅读首选,薄且聚焦 |
| APUE / TLPI | 系统编程手册,做项目时随查随用 |
3.3 三个使用原则
- 教材和视频二选一为主,另一个为辅(下节详述),不要两套都"完整刷一遍",那是双倍时间换一半深度;
- 作业(homework)必做,项目(projects)选做:作业是理解的一部分,跳过作业等于没学;项目是工程化训练,按需选择;
- 所有链接以官方仓库为准,警惕二手翻译和过时版本——书是 v1.10(2023 年 11 月),作业和项目库一直在更新。
四、核心方法论:单章学习闭环
这一节回答本系列最核心的问题:视频、教材、习题三者怎么结合?
答案是:不做"先看完视频再读书"或"先读完书再看视频"的串行安排,而是以章为单位,让三种资源各司其职:
视频 = 建立框架(知道这章在解决什么问题、有哪些方案)
教材 = 精确理解(机制如何工作、数字怎么算、权衡在哪里)
作业 = 验证理解(你以为懂了,模拟器会告诉你有没有)
项目 = 落到工程(把原理变成能跑、能测、能 debug 的代码)
输出 = 固化知识(写成文章,暴露理解漏洞,倒逼真实掌握)
4.1 单章 SOP(六步闭环)
以第 8 章《Multi-level Feedback Queue》为例:
Step 0 · 预习三问(5 分钟):读章首的对话和第一个 CRUX 框,合上书回答——这章解决什么问题?为什么已有方案不够?凭直觉猜一下解法会是什么样。带着预测去学,留存率完全不同。
Step 1 · 视频导览(25~50 分钟):在课程视频列表里找到对应 lecture,1.5 倍速看完。这一遍不求全懂,只要求回答三问:核心问题、核心机制、主要权衡。看不懂的地方记时间戳,不要暂停死磕。
Step 2 · 精读教材(45~90 分钟):逐节读英文原版(卡壳处对照中文版),重点抓三类内容:CRUX 问题的答案、带数字的例题(如响应时间/周转时间的计算)、"how to build"式的机制推导。随手画机制图——MLFQ 这章就应该画出优先级随时间衰减的规则表。
Step 3 · 模拟器作业(30~60 分钟):每章末的作业题配合官方模拟器完成。模拟器的标准用法是三步:
# 一次性把作业库克隆到本地
git clone https://github.com/remzi-arpacidusseau/ostep-homework.git
cd ostep-homework/cpu-sched-mlfq
# 第一步:看帮助,了解所有可调参数
python3 mlfq.py -h
# 第二步:生成题目(换 -s 种子 = 无限新题)
python3 mlfq.py -j 3 -s 42
# ...自己在纸上推演调度过程...
# 第三步:用 -c 验证(一定要先自己推完再跑!)
python3 mlfq.py -j 3 -s 42 -c
-c 是"对答案"模式。顺序错了,作业价值归零:先看答案再"理解",是自欺欺人的最高效形式。
Step 4 · 一页纸笔记(30 分钟):用固定模板收口(模板见 4.3)。
Step 5 ·(项目周才做)项目实战:见第六节的两条路线。
Step 6 ·(可选但强烈建议)写博客:把这一章按自己的话讲一遍——这就是本系列存在的意义。
一轮下来,一章约 2~3.5 小时(不含项目)。
4.2 两种学习模式,按章节特征切换
- 文本优先:概念密度高、机制需要逐步推导的章节——调度算法、分页地址翻译、文件系统布局。先读书,视频当答疑;
- 视频优先:抽象、反直觉、需要"看人推演"的章节——并发交织(第 26 章)、条件变量(第 30 章)、地址空间引入(第 13 章)。先看视频建框架,再回书上抠细节。
不必教条,连续卡壳 20 分钟就切换资源,这是自学的基本止损纪律。
4.3 一页纸笔记模板
# Ch.XX 章名
## 一句话:本章回答的核心问题是 ______
## 机制:手画一张图(进程状态机 / 页表结构 / 日志布局……)
## 权衡:这个设计的代价是什么?什么场景下会失效?
## 关键数字:TLB 命中率计算 / 寻道时间公式 / CRUX 例题的数字
## Linux 对照:这个机制在 Linux 里对应什么?(进程→task_struct,MLFQ→CFS……)
## 存疑:还没想明白的问题(下一篇写文章时优先解决)
"Linux 对照"一栏是工程师区别于学生的关键动作——它逼你把原理锚定在每天使用的系统上。
五、16 周学习路线图
假设每周投入 8 小时左右(工作日每天 1 小时 + 周末 3 小时),核心内容 16 周完成,总投入约 130 小时;若把分布式、安全和全部项目做完,约 200 小时。
| 阶段 | 周次 | 章节 | 核心内容 | 必做作业 | 里程碑 |
|---|---|---|---|---|---|
| W0 准备 | 第 0 周 | 序言、Ch1-2 | 搭环境、复习 C、理解三大主题视角 | —— | 环境就绪,能编译运行第一个程序 |
| 阶段一:CPU 虚拟化 | 第 1-3 周 | Ch3-11 | 进程、进程 API、受限直接执行、调度(FIFO→SJF→MLFQ→彩票→多核) | process-run.py、fork.py、scheduler.py、mlfq.py、lottery.py、multi.py | 能手推 MLFQ 调度过程;完成 Unix 工具项目 |
| 阶段二:内存虚拟化 | 第 4-7 周 | Ch13-24 | 地址空间、动态重定位、分段、分页、TLB、多级页表、交换与置换策略 | relocation.py、segmentation.py、malloc.py、paging-linear-translate.py、paging-multilevel-translate.py、paging-policy.py | 能手工完成虚拟地址→物理地址翻译全流程;完成 Shell 项目 |
| 阶段三:并发 | 第 8-11 周 | Ch25-34 | 线程、锁(自旋/互斥/两阶段)、条件变量、信号量、并发 bug、事件驱动 | x86.py(线程交织模拟)、threads 系列代码作业 | 能用锁+CV 实现生产者消费者;完成 Web Server 项目 |
| 阶段四:持久化 | 第 12-15 周 | Ch36-46 | IO 设备、磁盘、RAID、文件与目录、vsfs、FFS、日志与崩溃一致性、LFS、SSD、数据完整性 | disk.py、raid.py、vsfs.py、ffs.py、fsck.py、lfs.py、ssd.py、checksum.py | 能讲清一次 write() 从 page cache 到盘的完整路径;完成 FS Checker 项目 |
| 阶段五(选修) | 第 16 周+ | Ch47-57、附录 | 分布式(NFS/AFS)、安全(认证/加密/访问控制)、虚拟机 | afs.py 等 | 按需选学;进入 xv6/6.1810 进阶线 |
几个执行要点:
- 并发和内存两个阶段最容易拖慢,因为它们反直觉且作业量大。宁可放慢,不要跳过 x86.py 的交织推演——那是训练"交错执行"直觉的唯一途径;
- 每阶段结束写一篇阶段总结(对应本系列的一篇大文章),把该阶段所有机制串成一张大图;
- 断更不可耻,断更后从"当前章的 Step 0"重启即可,不要从第一页重读——这是自学弃坑的第二大原因(第一大是作业跳过导致后面听不懂)。
六、实践路线:应用线与内核线
项目库里的 17 个项目分两条线,按职业方向二选一为主线,另一条做种子:
Track A · C/Linux 应用线(推荐大多数工程师)
| 项目 | 对应章节 | 训练点 |
|---|---|---|
| Unix Utilities(wcat/wgrep/wzip/wunzip) | 阶段一前置 | C 热身、参数处理、IO 基本功 |
| Reverse | 阶段一 | 内存与文件操作 |
| Shell | Ch4-6 | fork/exec/wait、信号、进程管理——应用线的灵魂项目 |
| Web Server | Ch26-31 | 多线程、锁、socket——第二个灵魂项目 |
| Parallel Zip / MapReduce | 并发阶段 | 多线程协作、负载划分 |
| File System Checker | Ch40-45 | 直接读文件系统镜像、位图、inode 遍历 |
每个项目目录自带 test-*.sh 官方测试脚本,自测闭环不需要任何人批改:
git clone https://github.com/remzi-arpacidusseau/ostep-projects.git
cd ostep-projects/initial-utilities/wcat
vim wcat.c
gcc -o wcat wcat.c -Wall
./test-wcat.sh # 一行命令看到 pass/fail
Track B · xv6 内核线(目标内核/嵌入式/系统软件方向)
| 项目 | 对应章节 | 内容 |
|---|---|---|
| Intro to xv6 | 阶段一 | 编译启动 xv6、加系统调用 |
| Lottery Scheduling | Ch9 | 在内核里实现彩票调度 |
| Virtual Memory | Ch15-21 | 空指针保护、只读段 |
| Kernel Threads | Ch26-31 | 内核级线程实现 |
环境按仓库里 INSTALL-xv6.md 搭建(QEMU + RISC-V 工具链,WSL2 可行)。做完这条线,可以直接衔接 MIT 6.1810(xv6 labs)进入内核深水区——这也是本系列第二阶段的规划。
怎么选:日常写 Java/Go/Python 等应用的同学走 A 线,B 线挑一个 “Intro to xv6” 感受即可;想吃系统软件这碗饭的,A 线做 utilities + shell 后尽早转 B 线。
七、从输入到输出:本系列会怎么写
这个系列本身就是学习闭环的最后一环。规划如下,节奏约为每 1~2 周一篇,每篇对应路线图上的一个模块:
| 篇目 | 主题 | 对应章节 |
|---|---|---|
| 00 | 开篇总纲(本文) | —— |
| 01-03 | 进程与调度:进程抽象、系统调用与受限执行、调度算法演进 | Ch3-10 |
| 04-06 | 内存虚拟化:从地址空间到多级页表、TLB、交换与置换 | Ch13-24 |
| 07-10 | 并发:线程与交织、锁的实现哲学、CV 与信号量、并发 bug | Ch25-34 |
| 11-14 | 持久化:磁盘与 RAID、文件系统实现、崩溃一致性与日志、LFS 与 SSD | Ch36-46 |
| 15+ | 选修专题:分布式、安全、Linux 内核对照、xv6/6.1810 实录 | Ch47-57 及延伸 |
每篇的固定结构:一个真实工程问题引入 → 原理推演(含书中的权衡分析)→ 模拟器实验实录 → Linux 内核对照 → 面试与实战 FAQ。
写出来,是因为"能讲清楚"和"自以为懂"之间隔着一条鸿沟,而公开写作是检验前者的最低成本方式。如果这个系列能陪你走完这 16 周,它的目的就达到了。
八、避坑指南:十个常见问题
Q1:时间不够,学一半行不行?
可以,优先级是:虚拟化(CPU+内存)> 并发 > 持久化。前两者几乎是所有系统问题的高频根因;持久化对存储/数据库方向的同学再优先。
Q2:英语读起来慢怎么办?
中文版通读 + 英文版精读关键段落(CRUX、例题、图表)。术语必须记英文——page fault、turnaround time、journaling 这些词在中文资料里翻译混乱,英文反而更省事。
Q3:C 语言生疏怎么办?
W0 那一周专门复习指针、内存分配、字符串处理,然后直接用 utilities 项目热身,比看语法书有效。OSTEP 的代码风格简单,不要求高超的 C 技巧。
Q4:作业必须全做吗?
模拟器作业必做(每章 30-60 分钟,性价比极高);"写点代码"类作业(threads 系列)选做一半;项目按两条路线选 3~4 个。
Q5:先看答案再理解,不行吗?
不行。模拟器的 -c 必须在自己推演之后运行。自学没有考试,骗过的只有自己。
Q6:OSTEP 讲的是不是过时了?都 2026 年了。
机制不过时:分页、锁、日志、崩溃一致性,今天的 Linux、SQLite、RocksDB 依然建立在这些机制上。过时的只是部分参数和设备假设(HDD 章节快速读,SSD 章节精读)。补 Linux 现状正是本系列每篇的固定动作。
Q7:和 CSAPP 什么关系?要不要先学 CSAPP?
互补不冲突。CSAPP 第 9 章(虚拟内存)比 OSTEP 深,但只覆盖一个模块。建议以 OSTEP 为主线,学到内存部分时交叉读 CSAPP 对应章节。
Q8:学完能到什么水平?
诚实的预期:能看懂内核文档和源码的主路径;生产环境遇到调度/内存/IO 问题有分析框架;系统设计面试的 OS 层不再心虚;为深入内核(6.1810/LKD)扫清概念障碍。学完不会让你立刻写出内核,但会让你从"黑盒使用者"变成"白盒使用者"。
Q9:用什么系统学?Windows 行不行?
Linux 原生或 macOS 最佳;Windows 用 WSL2(Ubuntu 22.04+),跑模拟器、编译 C、包括 xv6 都没问题。本系列默认 WSL2/Ubuntu 环境。
Q10:怎么保证不弃坑?
三个机制:里程碑制(每周一个可验证产出,不是"看了"而是"做出/写出了");公开写作(系列断更的压力是真实的);搭子互助(评论区打卡,或拉个小组互查作业)。16 周、130 小时,拆到每周就是两次通勤加一个周末上午——难度从来不是内容,是节奏。
九、结语
操作系统是计算机体系里少数"越懂越有用"的学科:它不直接给你一个框架或一门语言,但给所有框架和语言提供解释框架。OSTEP 最打动我的地方,是它把 OS 讲成了一个个"约束下的设计问题"——而这正是工程师每天面对的东西。
下一篇,我们从第一个 CRUX 开始:如何制造"无限多"CPU 的假象?(Ch4:进程抽象)
参考资料
- OSTEP 官方站点(英文原版,v1.10):https://pages.cs.wisc.edu/~remzi/OSTEP/
- OSTEP 官方中文版:https://pages.cs.wisc.edu/~remzi/OSTEP/Chinese/
- CS 537 课程主页与视频(Spring 2018):https://pages.cs.wisc.edu/~remzi/Classes/537/Spring2018/
- 作业库(模拟器):https://github.com/remzi-arpacidusseau/ostep-homework
- 项目库(含测试框架):https://github.com/remzi-arpacidusseau/ostep-projects
- 书中配套代码:https://github.com/remzi-arpacidusseau/ostep-code
- xv6 与 MIT 6.1810:https://pdos.csail.mit.edu/6.1810/
- 《操作系统导论》(中文纸质版),人民邮电出版社
转载请注明出处,欢迎在评论区留下你的进度与疑问。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)