致所有读者
欢迎来到这本书!我们希望你阅读它时,能像我们写作它时一样享受其中的乐趣。本书名为《Operating Systems: Three Easy Pieces》(可在 http://www.ostep.org 获取),这个标题显然是在向 Richard Feynman 关于物理学主题的一套伟大讲义致敬 [F96]。当然,这本书无疑难以达到那位著名物理学家所树立的高度标准;不过,我们仍希望它足以帮助你踏上理解操作系统(以及更广义上的系统)本质的旅程。
所谓“三个简单部分”,指的是本书围绕组织起来的三大核心主题:虚拟化(virtualization)、并发(concurrency) 和 持久性(persistence)。在讨论这些概念的过程中,我们将涉及操作系统所完成的大多数重要工作;希望你在这个过程中也能获得一些乐趣。学习新知识是件有趣的事,对吧?至少,它本该如此。
每个主要概念都被划分为若干章节,其中大多数章节都会先提出一个具体问题,然后展示如何解决它。章节篇幅较短,并尽可能追溯这些思想真正来源于哪些原始资料。我们写这本书的目标之一,就是尽可能清晰地呈现历史脉络,因为我们认为,这有助于学生更清楚地理解什么是现在、什么是过去,以及未来可能走向何方。在这里,了解“香肠是怎么做出来的”,几乎和理解“香肠有什么用”一样重要。1
本书中有几种会反复出现的叙述手法,值得先在这里说明一下。第一种是 问题的关键(crux of the problem)。每当我们尝试解决一个问题时,都会先尽量指出其中最核心的难点;这个“关键点”会在正文中被明确标出,而后续介绍的技术、算法和思想,也基本都是围绕如何解决这个关键点展开的。
在很多地方,我们会通过展示一个系统随时间推移的行为方式,来解释它是如何工作的。这些时间线是理解系统本质的关键。如果你知道例如当一个进程发生页错误(page fault)时究竟会发生什么,那么你就已经走在真正理解虚拟内存如何运作的道路上;如果你理解了**日志文件系统(journaling file system)**向磁盘写入一个块时会发生什么,那么你就已经迈出了掌握存储系统的第一步。
正文中还穿插了大量的旁注(asides)和提示(tips),为主线叙述增添一些色彩。旁注通常讨论与主题相关、但未必是主线理解所必需的内容;提示则更倾向于总结一些可以应用到你所构建系统中的一般性经验教训。为了方便查阅,书末的索引列出了所有这些提示与旁注(以及多个 crux 的奇特复数形式 cruces)。
在整本书中,我们还采用了一种最古老的教学方法之一:对话(dialogue),以另一种角度来呈现部分内容。这些对话被用来引入主要的主题概念(而且会以一种“桃子味”的方式出现,后文你就会看到),也会不时用于回顾材料。它们同样给了我们一个机会,让写作风格稍微更幽默一些。至于你是否觉得它们有用,或者是否真的好笑,那就是另一回事了。
在每个主要部分的开头,我们会先介绍一个由操作系统提供的抽象(abstraction),然后在后续章节中逐步讨论为实现这一抽象所需的机制(mechanisms)、**策略(policies)**以及其他支撑内容。抽象是计算机科学各个方面的基础,因此它在操作系统中同样不可或缺,也就不足为奇了。
在各章中,只要可能,我们都会尽量使用**真实代码(real code)**而不是伪代码(pseudocode);因此,对于几乎所有示例,你都应该能够亲手把它们敲出来并运行。想要学习操作系统,在真实系统上运行真实代码是最好的方式,所以只要条件允许,我们都鼓励你这样做。我们也将相关代码放在了 https://github.com/remzi-arpacidusseau/ostep-code,供你查看与使用。
在正文的不同部分,我们还穿插了一些作业,以确保你真正理解了正在发生的事情。许多作业实际上是对操作系统某些部分的小型模拟;你应当下载这些作业并运行它们,用来自测。作业模拟器有一个很有用的特性:只要给定不同的随机种子,你就可以生成几乎无限多组题目;而模拟器也可以被要求直接给出解答。因此,你可以反复测试自己,直到你对相关内容形成扎实的理解。
本书最重要的补充内容,是一组项目。在这些项目中,你将通过设计、实现并测试自己的代码,来学习真实系统究竟是如何工作的。所有项目(以及前面提到的代码示例)都使用 C 编程语言 [KR88];C 是一种简单而强大的语言,大多数操作系统都建立在它之上,因此它绝对值得被加入你的“语言工具箱”。目前提供两类项目(具体可参见在线附录中的建议)。
第一类是系统编程项目(systems programming projects);对于刚接触 C 和 UNIX、想学习底层 C 编程的读者来说,这类项目非常合适。第二类则基于 MIT 开发的一个真实操作系统内核 xv6 [CK+08];这类项目很适合已经具备一定 C 基础,并希望真正深入操作系统内部动手实践的学生。在威斯康星大学,我们曾以三种不同方式开设这门课:要么全部采用系统编程项目,要么全部采用 xv6 项目,或者两者混合使用。
我们也在逐步公开项目说明以及测试框架。更多信息请参见 https://github.com/remzi-arpacidusseau/ostep-projects。即使你并非在正式课程中学习,这也能给你一个机会,让你独立完成这些项目,从而更好地掌握书中的内容。遗憾的是,当你卡住时,你没有助教可以去“骚扰”;不过,人生中也不是所有东西都能免费得到(但书可以!)。
-
提示:当然是“吃掉它”!如果你是素食主义者,那就“远离它”。 ↩