01 / 导读
导读
引用
Saltzer, J. H., & Kaashoek, M. F. (2009). Principles of Computer System Design: An Introduction. Morgan Kaufmann.
章节概要
本书源自 MIT 6.033 课程“计算机系统工程”(Computer System Engineering)四十多年间积累的讲义。全书分两部分出版。第一部分(第1–6章)是摩根·考夫曼出版社的印刷本;第二部分(第7–11章)由作者和 MIT 开放课程(OpenCourseWare)作为开放教育资源提供。贯穿全书的主题是强制模块化:第一部分介绍防止一个模块中的偶然错误扩散到其他模块的方法,第二部分介绍抵御组件故障和恶意攻击的更强形式的模块化。书中为一些设计原则命名(如端到端论证),在使用处加以标示,并在书前汇总成表。
第1章:系统
开篇一章把复杂性当作系统的核心问题。1.1 节考察各领域系统的共同问题,系统、组件、接口与环境,以及复杂性本身;1.2 节讲复杂性的来源,即相互叠加和相互作用的需求,以及维持高利用率;1.3 节讲应对之道:模块化、抽象、分层和层次结构,以及用名字建立连接。1.4 节解释计算机系统为什么“相同而又不同”,即组合没有近处的边界,技术变化前所未有;1.5 节再回到通过迭代与保持简单来应对复杂性。
第2章:计算机系统组织的要素
第2章指出三种基本抽象:存储器、解释器和通信链路(2.1),然后建立计算机系统中命名的模型:默认与显式的上下文引用、路径名与递归名字解析、在分层上下文中查找、名字比较和名字发现(2.2)。2.3 节用名字和分层来组织系统,以总线为硬件层、以文件抽象为软件层。案例研究(2.5)逐层剖析 UNIX 文件系统,从块层直到符号链接层。
第3章:命名方案的设计
本章把命名模型转化为设计时的考虑:模块化共享、元数据与名字的重载、作为定位对象的名字的地址、生成唯一名字、用户友好的名字,以及名字、值与绑定的相对生命周期。案例研究讲统一资源定位符(URL),“战争故事”则收集了名字使用中的真实病症,从名字冲突到电话号码耗尽。
第4章:用客户与服务强制模块化
第4章从软模块化走向强制模块化,描述客户/服务组织、多个客户和服务、可信中介和远程过程调用,包括 RPC 与普通过程调用的不同。两个案例研究是互联网域名系统(名字解析、层次化的名字管理、响应的可信性)和网络文件系统(它定义的远程过程调用、扩展 UNIX 文件系统以支持它,以及一致性)。
第5章:用虚拟化强制模块化
第5章展示同样的客户/服务思想如何通过虚拟化在一台计算机内部得到强制实施。内容包括:使用 SEND 和 RECEIVE 与有界缓冲区的虚拟链路,涉及竞态条件、锁、先后(before-or-after)操作和死锁;用域、内核态与用户态以及门来强制内存中的模块化;用页映射和转换后备缓冲区(TLB)虚拟化内存,段作为进阶主题;用线程虚拟化处理器及其序列协调原语;以及 Intel x86 中强制模块化的演进。最后讲虚拟机。
第6章:性能
第一部分的最后一章讨论面向性能的设计:度量(容量、利用率、延迟、吞吐量)、处理瓶颈的系统方法、并发、排队与过载,以及批处理、拖延和推测。然后讲多级存储,包括访问局部性、工作集和页面移除策略,以及资源调度与调度策略,并以磁盘臂调度为案例。
第7–8章:网络;容错(第二部分)
第7章“作为系统及系统组件的网络”讲网络的性质、分层(链路层、网络层和端到端层)、拥塞控制,以及将互联网映射到以太网的案例研究。第8章“容错:用不可靠的组件构造可靠的系统”讲故障与失效、可靠性的度量、容忍活动故障、对软件和数据应用冗余,以及 CMOS RAM 的容错模型。
第9–11章:原子性;一致性;信息安全(第二部分)
第9章区分全有或全无(all-or-nothing)与先后(before-or-after)两种原子性,并分别从概念和实践两方面讨论,随后讲跨层和多站点的原子性。第10章“一致性”讲约束、缓存一致性、由地理上分隔的副本实现的持久存储,以及调和。第11章“信息安全”讲主体与消息的认证、机密性、安全协议、授权、TLS 的案例研究,以及安全事故的“战争故事”。
核心概念
第1–3章:系统、名字与分层
- 模块化、抽象、分层、层次结构:书中介绍的应对复杂性的四种技术。
- 命名模型:把名字、上下文和名字解析作为通用机制。
- 三种基本抽象:存储器、解释器和通信链路。
第4–6章:强制模块化与性能
- 客户/服务组织:模块只通过消息交互,使错误不会扩散。
- 虚拟化:线程、虚拟内存和有界缓冲区,是在一台计算机内强制模块化的手段。
- 瓶颈与调度:第6章的性能主题。
第7–11章:网络、可靠性、原子性、一致性与安全
- 端到端论证:设计原则列表中概括为“应用最了解”。
- 全有或全无与先后原子性:事务的两种性质。
- 最小特权与完全仲裁:书前列出的安全原则。
评析
优点
- 以原则为先的设计。 出版社称其为第一本采取基于原则的方法讲计算机系统设计的教材,使用操作系统、网络、数据库和分布式系统所共有的抽象。设计原则有名字,在定义处以粗体标出,在使用处加以标记,并汇总成表。
- 贯穿多个领域的案例研究。 案例的选择是为了在不同领域重复运用同样的思想:UNIX 文件系统、URL、DNS、NFS、x86、磁盘臂调度、TLS 等,并配有伪代码片段作为具体例子。
- 评论者的看法。 出版社援引加州大学圣迭戈分校的 Joe Pasquale 的评语,称这是一本关于计算机系统设计原则、而非通常的“事物如何运作”的机制的独特、有雄心而重要的书,并指出据他所知没有别的书把这么多原则明确提出来。
- 免费的配套材料。 第二部分、习题集、术语表和索引可从 MIT 开放课程免费获取,同时还有 6.033 的课程资料。
- 有来历的习题。 习题和习题集取自数十年的考试,每道题都标有年份、考试编号和题号。
局限
- 印刷本只有一半内容。 印刷版只含第1–6章;容错、原子性、一致性、网络和安全位于在线的第二部分。购买印刷本的读者应计划同时使用在线章节。
- 不是机制层面的操作系统教材。 本书通过选定的案例讲原则,并非对操作系统机制的完整巡礼,不能取代标准的操作系统教材。
- 案例研究反映 2009 年的情形。 例子(NFS、Intel x86、TLS、DNS)反映的是出版时这些系统的状态;原则的表述是一般性的,但细节需对照当前实践核实。
- 第二部分是单独的版本。 免费章节标注为 5.0 版(2009 年 6 月),勘误最晚更新到 2022 年 2 月,并以非商业用途许可发布。
在课程中的定位
这是一本系统设计书,而不是第一门操作系统课程。《Operating System Concepts》和《Modern Operating Systems》是传统教材,依次讲进程、内存、文件系统和 I/O,并配有真实系统的案例;《Operating Systems: Three Easy Pieces》是对虚拟化、并发和持久性的免费、叙述式讲解;《How Linux Works》是面向真实系统的实用指南。Saltzer 和 Kaashoek 的第2、4、5章与这些内容有所重叠,但其目的是提炼其中的设计思想(命名、分层、强制模块化),并把它们带入网络、容错和安全。
最好在读过其中一本教材之后,或与之并行阅读,适合想了解机制背后的设计词汇的读者。
如何使用本书
本书面向操作系统、分布式系统或计算机系统设计课程的大学三、四年级学生,以及专业的系统设计人员,出版社给出的读者对象也是如此。
实用安排:
- 核心: 第1章,掌握复杂性的词汇;第2–3章,学习命名;第4–5章,学习强制模块化。
- 随后: 第6章讲性能,再按兴趣读第二部分各章:第7章讲网络,第8–10章讲可靠性与事务,第11章讲安全。
- 进阶主题: 标明为进阶的小节(例如 5.4.5 的段和 11.7 的认证推理)可留到第二遍阅读。
- 参考材料: 手边备好设计原则列表和术语表;用习题和习题集检验理解。
