01 这本书回答什么问题 — 引言与全书拆解¶
1. 这一章讲什么¶
这本书从一个朴素的问题出发:一台只有几个 CPU、一块内存、一个磁盘的机器, 凭什么让你觉得「所有程序都在同时跑、每人都有一大块自己的内存、文件永远丢不了」? 答案是操作系统造的一连串幻觉——虚拟化——以及为维持幻觉不得不解决的 两个后遗症:并发(多件事真的同时发生时怎么办)和持久化(断电了怎么办)。
本章在全书链条里的位置:这是总纲的总纲。机制与策略的两分法、 「效率 vs 控制」和「性能 vs 保护」这两对基本矛盾,都是在这里立起来、 后面五十章逐个展开的。
2. 顶层全景:一张图看懂操作系统在干什么¶
你看到的:浏览器 + 音乐 + 编辑器「同时在跑」,各用各的内存,文件存了不丢
│
操作系统的三个动作
│
├─ 虚拟化 ── 把 1 个 CPU 变成「无数个 CPU」(分时:这个跑几毫秒,换那个)
│ 把 1 块内存变成「每人一块私有内存」(地址翻译)
│ 把 1 个磁盘变成「一个共享的文件仓库」(文件系统)
│
├─ 并发 ──── 当「同时」变成真的同时(多核),怎么保证各算各的互不踩?
│
└─ 持久化 ── 内存一断电就清空;磁盘慢且会坏。怎么让数据活得比断电久?
图说:上图每一个箭头,后面都跟着书里的一大篇。虚拟化回答「怎么用」, 并发和持久化回答「怎么不出事」。
3. 核心原理¶
3.1 主线例子:三个小程序,看见三桩怪事¶
书里不用定义开场,而是让你运行三个真实的小程序。我们原样接住这个教法, 把它们串成一条主线——注意,以下输出都是书里真实记录的运行结果1。
程序一,cpu.c:死循环,每秒打印一次命令行传进来的字符串。
单独跑 ./cpu "A",屏幕一秒一个 A。然后连开四个:
怪事一桩:这台机器明明只有一个处理器,四个程序却都「在跑」,
你按 Ctrl+C 之前谁也停不下来。操作系统和硬件联手造出了这个错觉——
书里叫「系统拥有数量极多的虚拟 CPU」的错觉2。
程序二,mem.c:分配一小块内存,把它的地址打出来,然后每秒往里面加一。
单独跑,它打印自己分到的地址(书里那台机器是 0x200000)。
然后连开两个:
(24113) address pointed to by p: 0x200000
(24114) address pointed to by p: 0x200000
(24113) p: 1
(24114) p: 1
(24113) p: 2
(24114) p: 2
怪事二桩:两个程序分到了同一个地址 0x200000,却各加各的,互不干扰——
仿佛每人有一块私有内存3。这就是虚拟内存:每个进程活在自己的
「地址空间」里,它看见的地址不是物理地址,是操作系统翻译过的。
程序三,threads.c:两个线程各把一个共享计数器加 1000 次,你该期望
结果是 2000——跑小数字确实如此。把次数提到 10 万,书里记录的真实输出是:
prompt> ./threads 100000
Initial value : 0
Final value : 143012 // huh??
prompt> ./threads 100000
Initial value : 0
Final value : 137298 // what the??
怪事三桩:结果既不是 20 万,两次跑还不一样。这就是并发问题的首次现身:
counter++ 看着是一句话,机器实际分三步执行——从内存把值取进寄存器、
加一、写回内存。三步之间随时可能被硬件插进来换成另一个线程,
两个线程各取到 5、各加成 6、先后写回,一加就丢了4。
三个程序,三桩怪事,正好对应全书三大部分:CPU 虚拟化、内存虚拟化、并发 ——再加上程序三引出的那个更朴素的问题:为什么计数的值断电重启就没了? 那是第四大部分持久化。
3.2 虚拟化:一个动词,一套世界观¶
书里给操作系统下的定义很直白:它把处理器、内存、磁盘这样的物理资源, 「变成更通用、更强大、更好用的虚拟形式」5。做好这件事靠两个不同层面的东西:
- 机制(mechanism):低层的方法或协议,回答「怎么做」——怎么把一个程序 停下、把另一个换上(上下文切换),怎么把地址翻译一遍。
- 策略(policy):高层的判断,回答「做哪个」——两个程序都想跑,先跑谁? 内存满了,踢谁出去?
书里把这句话写得很死:「低层的机器叫机制」,高层做决策的是策略6。 这个两分法是全书骨架:每一章几乎都是先把机制讲到能用, 再在机制之上讨论策略的权衡。
3.3 系统调用:操作系统的门,与两扇门后的两个世界¶
程序想动用操作系统的能力(开文件、分内存、发网络包),不能直接函数调用, 要走一道特殊的门:系统调用。系统调用和普通过程调用的区别在于, 它跳进操作系统的同时,把硬件的特权级别也抬高了7。
这引出两个必须记住的词:
- 用户态(user mode):应用程序平时的状态。硬件在这里面限制它—— 不能直接发磁盘 I/O、不能摸任意物理内存、不能直接发网络包。
- 内核态(kernel mode):操作系统的状态。硬件在这里放行一切。
程序通过一条叫 trap(陷阱)的专用硬件指令进门,操作系统办完事再用一条
「从陷阱返回」的指令回到用户态。Atlas 系统在 1960 年代初率先造出了这套安排8。
为什么非要分两级?因为操作系统里跑着所有程序的文件;
如果任何程序都能随便读磁盘,「隐私」这个词就不存在了9。
3.4 一段极简史:每个时代解决上一时代的懒¶
书里用四段历史解释「操作系统为什么长成今天这样」10:
| 时代 | 形态 | 逼出来的东西 |
|---|---|---|
| 最早 | 只是一组常用函数库,一次跑一个作业,人工操作员排队 | 「批处理」这个词 |
| 1960s | 机器太贵,要装进多个作业来回切 | 内存保护、并发概念、系统调用 |
| 小型机 | PDP 系列让小型团队买得起机器;UNIX 诞生 | 简单即强大;C 语言;BSD 分支 |
| PC 时代 | 单机单用户,厂商以为 protections 不重要 | 一次大倒退:恶意程序可以涂改全部内存11,之后又把小型机的教训捡了回来 |
图说:这张表的意思是——你现在觉得理所当然的每个功能,都是被具体的亏损逼出来的。 内存保护不是聪明人的洁癖,是「不保护就互相踩」的代价付过之后的产物。
4. 作者的判断与证据¶
书里给了证据的判断:
- 三个小程序的运行结果是实测的,可以直接复现——这是全书的基本风格: 先让你看见怪事,再解释怪事。
- 「机制与策略分离」作为方法论贯穿全书,是作者明写的组织原则6。
- 设计目标一节列的清单(抽象、高性能、保护、可靠、节能、安全)里, 保护和可靠被作者标成「核心」:隔离(isolation)是保护的根基12。
作者的推测或取舍:
- 书名向费曼的《Six Easy Pieces》致敬,自称「操作系统大约只有物理一半难」—— 这是开场玩笑,也是全书的自我定位:不求全,求讲透主干13。
- 历史叙述是高度浓缩的(四段),UNIX 的重要性那则旁注明显带作者偏好—— 他俩的研究与 UNIX 传统同源。读这段时记住:这是「胜者的历史」。
5. 边界与局限¶
- 本章明说不覆盖网络和图形——「网络代码很多,留给网络课」14。 安全也只覆盖到「进程间保护、文件保护」这一层,深的不碰(全书最后一部分 后来补了五章安全,是另一位作者写的,见本库第 20–22 章)。
- 三个演示程序要求关掉地址随机化才能看到
0x200000这个整齐地址—— 书里用脚注交代了15,但你要自己复现时会被这一步绊一下。 - 「并发问题」在这里只是惊鸿一瞥(三步不原子),真正的展开在全书第二部分;
同样,「持久化」在本章只有
open()/write()/close()三个系统调用的惊鸿一瞥。
6. 可带走的¶
- 操作系统 = 幻觉制造机 + 资源管家。它把少的变成「看起来多的」, 并且负责在争抢中维持秩序。
- 机制 vs 策略是拆任何系统的第一刀:说不清「怎么做」的是机制没讲透, 说不清「为什么选它」的是策略没立住。
- 用户态/内核态是理解一切「为什么这个操作要权限」的根:系统调用不是 普通的函数调用,它是换特权级别的一跳。
- 「同时跑」从来都是错觉,连多核也不是真同时——
counter++丢更新 这个例子值得背下来,它是并发部分的全部动机。 - 每个 OS 功能都对应一笔付过的代价:内存保护 ← 互相踩;日志 ← 断电; 权限 ← 恶意程序。读后面每一章都问一句:它防的代价是什么?
- 书的组织方式值得抄:先跑程序看见怪事,再讲原理——比先下定义好得多。
7. 原文地图¶
| 主题 | 原书章 | 原文位置 |
|---|---|---|
| 三个主题的名目(虚拟化/并发/持久化) | 1. A Dialogue on the Book | text/03-ch01-1-a-dialogue-on-the-book.txt:20(搜「virtualization, concurrency」) |
| 虚拟桃子:共享而自以为独占 | 3. Dialogue on Virtualization | text/05-ch03-3-dialogue-on-virtualization.txt:23(搜「virtual peaches」) |
| 全书难题:如何虚拟化资源 | 2. Introduction to Operating Systems | text/04-ch02-2-introduction-to-operating-systems.txt:34(搜「crux of our」) |
| 一个 CPU 变多个的错觉 | 2. Introduction to Operating Systems | text/04-ch02-2-introduction-to-operating-systems.txt:139(搜「illusion that the system」) |
| 同一地址、各加各的 | 2. Introduction to Operating Systems | text/04-ch02-2-introduction-to-operating-systems.txt:243(搜「own private memory」) |
| counter 丢更新的运行记录 | 2. Introduction to Operating Systems | text/04-ch02-2-introduction-to-operating-systems.txt:338(搜「143012」) |
| 三步不原子 | 2. Introduction to Operating Systems | text/04-ch02-2-introduction-to-operating-systems.txt:369(搜「execute atomically」) |
| 机制与策略两分 | 2. Introduction to Operating Systems | text/06-ch04-4-the-abstraction-the-process.txt:29(搜「low-level machinery」)与text/06-ch04-4-the-abstraction-the-process.txt:29(搜「high-level intelligence」) |
| 系统调用抬高特权级别 | 2. Introduction to Operating Systems | text/04-ch02-2-introduction-to-operating-systems.txt:573(搜「privilege level」) |
| 批处理时代 | 2. Introduction to Operating Systems | text/04-ch02-2-introduction-to-operating-systems.txt:553(搜「batch processing」) |
| PC 时代忘了内存保护 | 2. Introduction to Operating Systems | text/04-ch02-2-introduction-to-operating-systems.txt:670(搜「memory protection」) |
| 不覆盖网络与图形 | 2. Introduction to Operating Systems | text/04-ch02-2-introduction-to-operating-systems.txt:655(搜「networking」) |
-
出处:「2. Introduction to Operating Systems」第 104–132 段(
text/04-ch02-2-introduction-to-operating-systems.txt:104–:132,搜「gcc -o cpu」)。三个程序的代码与输出分别在该章图 2.1–2.6 及配套正文。 ↩ -
出处:「2. Introduction to Operating Systems」第 139 段(
text/04-ch02-2-introduction-to-operating-systems.txt:139,搜「illusion that the system」)。 ↩ -
出处:「2. Introduction to Operating Systems」第 243 段(
text/04-ch02-2-introduction-to-operating-systems.txt:243,搜「own private memory」)。 ↩ -
出处:「2. Introduction to Operating Systems」第 367–371 段(
text/04-ch02-2-introduction-to-operating-systems.txt:367–:371,搜「execute atomically」)。原文:这三条指令不原子地执行,怪事由此发生。 ↩ -
出处:「2. Introduction to Operating Systems」第 50–52 段(
text/04-ch02-2-introduction-to-operating-systems.txt:51,搜「virtual form of itself」)。 ↩ -
出处:「4. The Abstraction: The Process」第 29 段(
text/06-ch04-4-the-abstraction-the-process.txt:29,搜「low-level machinery」)。原文:低层的方法叫机制,高层做决策的部分称策略。 ↩↩ -
出处:「2. Introduction to Operating Systems」第 573 段(
text/04-ch02-2-introduction-to-operating-systems.txt:573,搜「privilege level」)。 ↩ -
出处:「2. Introduction to Operating Systems」第 568–571 段(
text/04-ch02-2-introduction-to-operating-systems.txt:568,搜「Atlas」)。 ↩ -
出处:「2. Introduction to Operating Systems」第 563–567 段(
text/04-ch02-2-introduction-to-operating-systems.txt:565,搜「privacy goes out the window」)。 ↩ -
出处:「2. Introduction to Operating Systems」第 531–705 段(
text/04-ch02-2-introduction-to-operating-systems.txt:531,搜「Some History」)。 ↩ -
出处:「2. Introduction to Operating Systems」第 670 段(
text/04-ch02-2-introduction-to-operating-systems.txt:670,搜「memory protection」)。 ↩ -
出处:「2. Introduction to Operating Systems」第 511–514 段(
text/04-ch02-2-introduction-to-operating-systems.txt:513,搜「isolation」)。 ↩ -
出处:「1. A Dialogue on the Book」第 18 段(
text/03-ch01-1-a-dialogue-on-the-book.txt:18,搜「half as hard」)。教授的原话:操作系统「大约只有物理一半难」。 ↩ -
出处:「2. Introduction to Operating Systems」第 655 段(
text/04-ch02-2-introduction-to-operating-systems.txt:655,搜「networking」)。 ↩ -
出处:「2. Introduction to Operating Systems」第 254 段(
text/04-ch02-2-introduction-to-operating-systems.txt:254,搜「randomization」)。 ↩