01 / 导读
导读
引用
Arpaci-Dusseau, R. H., & Arpaci-Dusseau, A. C. (2018–2023). Operating Systems: Three Easy Pieces (version 1.10). Arpaci-Dusseau Books. Free official edition: https://pages.cs.wisc.edu/~remzi/OSTEP/
章节概要
全书围绕三个主题组织:虚拟化、并发和持久性。每个主题由教授与学生之间的一段简短对话引入,随后的各章通常以一个方框标出的“问题症结”(crux)开头。书的最前面是导论;三大部分之后是分布式系统部分和 Peter Reiher(加州大学洛杉矶分校)撰写的安全章节;附录涉及虚拟机监控器、管程、C 语言教程和实验构想。
第1–2章:关于本书的对话;操作系统导论
开篇对话解释书名(向费曼的物理学讲义致敬)和三个主题。第2章从冯·诺依曼模型下运行的程序出发,说明操作系统如何虚拟化 CPU 和内存、应对并发并持久地存储数据。章末讨论抽象、性能、保护、可靠性等设计目标,并简述操作系统的历史。
第3–6章:进程与受限直接执行
在虚拟化对话之后,第4章定义进程及其状态、创建过程和相关数据结构。第5章是第一个“插曲”,讲 UNIX 进程 API:fork()、wait()、exec(),以及为什么要把它们分开。第6章解释受限直接执行:用户态与内核态、系统调用与陷入,以及时钟中断如何让操作系统夺回 CPU 以进行上下文切换。
第7–11章:CPU 调度
第7章从明确的负载假设和指标(周转时间与响应时间)出发,依次讲 FIFO、最短作业优先、最短完成时间优先和轮转,再加入 I/O。第8章分几次尝试逐步建立多级反馈队列。第9章讲彩票调度、步幅调度和 Linux 的完全公平调度器。第10章是关于多处理器调度的进阶章节(缓存亲和性、单队列与多队列)。第11章是总结对话。
第12–17章:地址空间、地址转换与空闲空间
第13章引入地址空间及其目标。第14章是关于 malloc() 和 free() 及常见内存错误的插曲。第15章介绍基址加界限的地址转换,第16章将其推广为分段,第17章讨论可变大小分配所需的空闲空间管理。
第18–24章:分页与虚拟内存
第18章引入分页和页表,第19章讲 TLB,第20章讲如何缩小页表(更大的页、混合方式、多级页表和反向页表)。第21、22章讲交换机制和置换策略,包括 OPT、FIFO、随机、LRU 及类似时钟算法的近似方法,并讨论抖动。第23章描述两个完整系统:VAX/VMS 和 Linux。第24章是总结对话。
第25–34章:并发
第26章说明线程的动机,并展示共享数据和不受控的调度如何产生竞态。第27章是线程 API 插曲。第28章从硬件支持(test-and-set、compare-and-swap、load-linked/store-conditional、fetch-and-add)出发构造锁,再加入让出 CPU 和队列。第29章把锁用于并发计数器、链表、队列和哈希表。第30、31章通过生产者/消费者、读写锁和哲学家就餐讲条件变量和信号量。第32章概览非死锁与死锁类缺陷,第33章用 select() 和异步 I/O 介绍基于事件的并发。第34章是总结。
第35–46章:持久性
第36章讲 I/O 设备、中断、DMA 和设备驱动;第37、38章讲硬盘(含磁盘调度)和 RAID。第39章是文件与目录的插曲。第40章用 inode 和目录构建一个简单的文件系统。第41章讲快速文件系统(FFS),第42章讲崩溃一致性(fsck 与日志),第43章讲日志结构文件系统。第44章解释基于闪存的固态硬盘,第45章讲用校验和与擦洗实现数据完整性。
第47–51章:分布式
关于分布式系统的一小组章节:通信层与 RPC(第48章),然后是两个分布式文件系统案例,NFS(第49章)和 AFS(第50章)——前者围绕无状态服务器和幂等操作,后者围绕整文件缓存和回调——以及总结对话(第51章)。
第52–57章:安全
Peter Reiher 撰写的章节依次介绍安全目标与策略(第53章)、认证(54)、基于 ACL 与能力的访问控制(55)、密码学,包括公钥方法、哈希和静态数据加密(56),以及用 TLS 保护分布式系统(57)。
附录
篇幅较短的附录讲虚拟机监控器(虚拟化 CPU 与内存)、作为更高层同步结构的管程(含 Java 示例)、关于编译、调试和构建 C 程序的教程,以及系统编程与 xv6 实验的构想。
核心概念
第1–11章:CPU 虚拟化
- 进程:正在运行的程序,其状态由操作系统保存和恢复。
- 受限直接执行:让程序直接在 CPU 上运行,同时操作系统通过特权模式、陷入和时钟中断保持控制。
- 调度指标:周转时间与响应时间,不同的策略分别优化其中之一。
- 多级反馈队列:根据历史推断作业行为的调度器。
第12–24章:内存虚拟化
- 地址空间:每个进程私有的内存视图。
- 分页与 TLB:固定大小的转换单位,以及使之变快的硬件缓存。
- 多级页表:避免为未使用的地址空间存储转换项的结构。
- 页面置换:内存已满时决定淘汰什么的策略。
第25–34章:并发
- 竞态条件与临界区:缺陷的模式,以及锁所保护的代码区域。
- 条件变量与信号量:等待并通知状态变化的原语。
- 死锁:由一圈相互等待构成,书中用其四个条件加以分析。
第35–46章:持久性
- inode:UNIX 式文件系统核心的每文件结构。
- 崩溃一致性与日志:先写日志,使元数据在崩溃后依然完好。
- 日志结构文件系统:把所有写入变为顺序写入。
- 校验和:发现静默损坏的基本手段。
第47–57章:分布式与安全
- 幂等操作与无状态服务器:NFS 为便于崩溃恢复而采用的设计。
- 访问控制列表与能力:记录“谁可以做什么”的两种方式。
- 公钥密码学与 TLS:保护机器之间通信的工具。
评析
优点
- 短小、以问题为驱动的章节。 几乎每章都先提出症结,分阶段构建解决方案(如多级反馈队列的三次尝试和一步步改进的锁设计),并以总结收尾。章节足够短,可以一次读完。
- 先讲虚拟化,后讲并发。 作者为把线程推迟到理解了地址空间、进程和上下文切换之后作了辩护;这一顺序使竞态的来源一目了然。
- 真实代码与可运行的作业。 示例用 C 而非伪代码,代码托管在 GitHub。许多章末有基于模拟器的作业,更换随机种子就能产生新题,部分章节还有测量或编程任务。
- 历史与出处。 各章指向原始论文并点出提出这些想法的人,适合接下来要读研究文献的读者。
- 免费阅读。 各章以 PDF 免费提供,用作教材或自学都没有费用负担。
局限
- 预设前置知识。 导论预期读者知道程序运行时发生什么(推荐以 Patt 和 Patel,或 Bryant 和 O’Hallaron 的书作为背景),代码使用 C。
- 示例偏重 UNIX。 进程、文件和线程 API 属于 UNIX/POSIX,完整系统案例涉及 VAX/VMS 和 Linux 的虚拟内存。
- 覆盖有所取舍。 本书遵循一种课程设计。网络协议栈、图形、移动与嵌入式系统等主题不在其中;分布式系统与安全部分与三大主题相比较为简短。
- 对话与幽默见仁见智。 对话可有可无,有些读者认为可以略过。
在课程中的定位
这是通读一门完整操作系统课程的一条精简路径:三个主题、短小的章节,配有相应的代码与作业。《Operating System Concepts》是篇幅较长、覆盖较广的教材,有来自多种商用系统的例子和编程项目;《Modern Operating Systems》是标准教材,含 Linux、Android 和 Windows 的扩展案例。二者对同一内容覆盖更广,而本书更侧重以叙述方式解释这些机制如何运作及其原因。
《How Linux Works》是一本面向真实 Linux 系统的实用指南,可作为在实机上观察这些概念的配套读物。《Principles of Computer System Design》并非严格意义上的操作系统教材,而是讲贯穿操作系统、网络和容错的设计原则;适合读完本书后希望做概括提升的读者。
如何使用本书
本书适合会用 C 编程、大致了解程序如何在处理器上执行的读者,通常用于二、三年级的操作系统课程或自学。
实用安排:
- 核心: 第2章、第4–9章(CPU 虚拟化)、第13–22章(内存)、第26–32章(并发),以及第36–40、42章(设备、文件系统与崩溃一致性)。作者指出,这门课程大致可以分配到 15 周的学期中。
- 选读或进阶: 第10章(多处理器调度)、第23章、第33章(基于事件的并发)、SSD、LFS 和数据完整性各章,以及分布式系统和安全部分。
- 对话: 可用来把握方向,也可以跳过。
建议把插曲中的代码敲进去运行,每章之后做模拟器作业,换新的随机种子,直到能稳定答对。想要更深入的练习,可以选做附录中列出的系统编程或 xv6 项目构想。对想深入研究的主题,回头阅读所引用的论文。
版本与来源
本导读依据 https://pages.cs.wisc.edu/~remzi/OSTEP/ 上的免费在线版本。作者给出的版本为 1.00(2018 年 8 月)、1.01(2019 年 7 月)和 1.10(2023 年 10 月);所读章节文件的页眉标注为 1.10 和 1.20。内容基于免费文本:前言、目录、对话、每章的开头与症结,以及所有章节(含安全章节和附录)的小节标题。
