书 · 1992 · 安德鲁·S. 塔能鲍姆(Andrew S. Tanenbaum)

《现代操作系统》

计算机与 AI书单第 27 名

一句话结论

操作系统把复杂硬件变成程序能够使用的抽象,同时解决资源有限、执行交错和机器故障带来的协调问题。

值不值得读完整本?

值得读完整本的核心论述,尤其不要漏掉初版后半部的分布式系统;它能教你从机制和代价理解系统,但部分硬件细节与案例需要放回1992年的背景。

  • 先读第一章,建立“提供抽象”和“管理资源”两条主线,再细读第二至第六章的进程、存储、文件、输入/输出和死锁。
  • 第九至第十三章应作为另一组重点:通信、同步、线程与处理器分配、分布式文件系统共同构成初版的重要内容,不能用新版的阅读范围替代。
  • 第七、八、十四、十五章分别用 UNIX、MS-DOS、Amoeba、Mach 检查前面的概念;第一遍可略读历史沿革和旧设备操作细节,重点比较系统怎样组织资源与服务。
  • 配合手算和画图:追踪并发交错、比较调度结果、计算缺页、判断安全状态,再画出 RPC 失败和文件缓存更新的消息过程。只记术语不足以应对理解题。

核心观点

1. 操作系统同时提供抽象和管理资源

操作系统一方面把硬件包装成进程、文件和地址空间等较易使用的对象,另一方面决定谁在什么时候使用处理器、内存和设备。这两个角色必须一起理解。

为什么:硬件接口包含大量设备细节,让每个应用自行处理会造成重复劳动,也容易出错。稳定的抽象把这些细节集中起来,使程序可以围绕较统一的接口工作。但多个程序会争用同一批物理资源,仅有接口并不能解决冲突。操作系统还必须分配资源、限制访问,并在效率、公平和保护之间作出选择。

2. 并发要同时解决执行顺序和处理器分配

把程序看成独立进程有助于组织计算,但共享数据必须用同步机制协调;调度则要根据响应、公平和开销等目标选择策略。

为什么:即使只有一个处理器,进程切换也能让多段操作交错执行。一次看似简单的共享数据更新可能包含读取、计算和写回,交错后就可能覆盖别人的结果。临界区、信号量、管程和消息传递通过约束访问或交换信息来协调执行。调度解决的是另一个问题:让谁运行以及运行多久;时间片太短会增加切换开销,太长又会拖慢交互响应,因此不存在脱离目标的最佳策略。

3. 虚拟内存依靠局部性,不能消除容量约束

虚拟内存通过地址映射,让程序不必把全部内容同时放入物理内存;它能否高效运行,取决于留下的页面是否覆盖程序近期的主要访问。

为什么:程序通常只在一段时间内集中访问部分代码和数据,这给按需装入提供了机会。页表把虚拟页映射到物理页框,访问尚未驻留的页面时再触发缺页处理。物理内存不足时,系统必须选择页面换出,因此置换策略会影响后续缺页次数。如果多个进程所需的活跃页面长期装不下,系统就可能反复调页而难以推进计算;工作集思路正是用近期访问需求帮助理解这种问题。

4. 文件与输入/输出要兼顾统一接口、性能和保护

文件系统组织可长期保存的数据,输入/输出软件协调具体设备;两者都需要把易用的接口落实为有权限边界、能处理错误的实现。

为什么:文件名和目录让程序通过逻辑对象寻找数据,底层仍须记录数据块位置、空闲空间和访问权限。设备驱动与设备无关的软件分工,可以把不同设备的细节限制在较小范围内。缓存和缓冲减少慢速设备访问,并调节程序与设备之间的速度差。代价是系统要维护更多中间状态,处理更新未落盘、元数据不一致和设备错误等风险。共享数据还需要访问控制,因为知道一个文件在哪里,并不意味着应该获准读取或修改它。

5. 死锁处理是在限制、检查和恢复成本之间选择

死锁来自一组进程之间无法自行解除的等待关系,不能仅靠增加运行机会解决。预防、避免、检测后恢复以及在特定场景下忽略,分别承担不同代价。

为什么:在书中讨论的资源死锁模型里,互斥、占有并等待、不可抢占和循环等待共同构成死锁发生的必要条件。预防通过破坏其中某项条件排除死锁,但可能限制资源使用方式。避免则在分配前检查是否仍能保证存在一条完成路径,通常需要知道进程的最大资源需求。检测与恢复允许系统先运行,再寻找死锁并通过终止或回收等方式处理,因此要承担检查和损失工作的成本。选择方法时,必须比较死锁发生的可能性、后果和长期防范开销。

6. 分布式系统必须为通信、协调和共享语义付费

把服务分散到多台机器,可以共享资源和增加处理能力,但必须明确通信失败、事件顺序、任务分配和文件共享分别意味着什么。远程资源不能只按本地资源的方式理解。

为什么:机器通过消息通信,调用者看到的超时可能对应请求丢失、服务尚未完成或回复丢失,因而重试可能带来重复执行。各机器的时钟也不能直接当作共同的精确时间,协调事件需要时钟同步、逻辑时钟或互斥协议等机制。增加处理器可以分担工作,但任务分配还要计算通信、协调和负载信息收集的成本。文件缓存与副本能减少访问延迟,却要求系统说明更新何时对其他使用者可见。初版后半部因此把透明使用的目标与实现它所付出的代价放在一起讨论。

反对意见

架构上的整洁不足以决定工程优劣(Linus Torvalds)

Torvalds 在1992年的塔能鲍姆—托瓦兹论战中承认微内核在理论与结构上的吸引力,但强调 Linux 当时已经能够使用,并能利用现有硬件。其核心分歧是评价权重:可用性、实际功能与性能,不能仅凭内核是否符合某种理想结构来判断。这是对作者同期架构立场的反驳,并非对本书全部内容的书评。

统一抽象也可能限制应用优化(Engler、Kaashoek、O’Toole)

三人在 Exokernel 论文中认为,传统操作系统预先规定的地址空间、通信等抽象,会隐藏应用需要的资源信息,并限制专门优化。他们主张内核主要负责安全地保护和分配资源,由应用侧的库操作系统实现管理方式。论文明确比较了 Amoeba、Mach 等系统,因此可用于追问本书抽象路线的边界;它不是针对教材准确性的批评。

DOS 是否适合作为“现代”案例(Michael K. Johnson)

Johnson 在《Linux Kernel Hackers’ Guide》的注释书目中,肯定初版补充虚拟内存等内容的价值,同时直接质疑为何把 DOS 纳入一本讨论现代操作系统的书。这项批评针对案例选择与读者期待之间的落差,没有否定本书关于进程、内存等基础概念的讲解。资料所列1996年是现存页面的最晚版权年份,不能据此认定评论首次发表于1996年。

相关推荐

导读由 AI 根据公开资料整理,没有读取原书全文,一切以原著为准。导读 Primer 首页