最适合初学者学习的操作系统书,没有理由不拿来读一读

新的一周开始了,今天给大家推荐一本最适合初学者学习的《操作系统导论》本书的作者讲解的思路非常清晰,从问题出发,一步步引导出解决方案,抽丝剥茧。本书围绕3个主题元素展开讲解:虚拟化(virtualization)、并发(concurrency)和持久性(persistence)。对于这些概念的讨论,最终延伸到讨论操作系统所做的大多数重要事情。希望你在这个过程中体会到一些乐趣。学习新事物很有趣,对吧?

本书围绕3个主题元素展开讲解:虚拟化(virtualization)、并发(concurrency)和持久性(persistence)。对于这些概念的讨论,最终延伸到讨论操作系统所做的大多数重要事情。

每个主要概念在若干章节中加以阐释,其中大部分章节都提出了一个特定的问题,然后展示了解决它的方法。这些章节很简短,尝试(尽可能地)引用作为这些想法真正来源的源材料。我们写这本书的目的之一就是厘清操作系统的发展脉络,因为我们认为这有助于学生更清楚地理解过去是什么、现在是什么、将来会是什么。在这种情况下,了解香肠的制作方法几乎与了解香肠的优点一样重要。

我们在整本书中采用了几种结构,值得在这里介绍一下。

无论何时,在试图解决问题时,我们首先要说明最重要的问题是什么。我们在书中明确提出关键问题(crux of the problem),并希望通过本书其余部分提出的技术、算法和思想来解决。

在许多地方,我们将通过显示一段时间内的行为来解释系统的工作原理。这些时间线(timeline)是理解的本质。如果你知道会发生什么,例如,当进程出现页故障时,你就可以真正了解虚拟内存的运行方式。如果你理解日志文件系统将块写入磁盘时发生的情况,就已经迈出了掌握存储系统的第一步。

整本书中有许多“补充”和“提示”,为主线讲解增添了一些趣味性。“补充”倾向于讨论与主要文本相关的内容(但可能不是必要的);“提示”往往是一般经验,可以应用于所构建的系统。

在整本书中,我们使用最古老的教学方法之一——对话(dialogue)。这些对话用于介绍主要的主题概念,并不时地复习这些内容。这也让我们得以用更幽默的方式写作。好吧,你觉得它们是有用还是幽默,完全是另一回事。

在每一个主要部分的开头,我们将首先呈现操作系统提供的抽象(abstraction),然后在后续章节中介绍提供抽象所需的机制、策略和其他支持。抽象是计算机科学各个方面的基础,因此它在操作系统中也是必不可少的。

在所有的章节中,我们尝试使用可能的真实代码(real code),而非伪代码(pseudocode)。因此书中几乎所有的示例,你应该能够自己输入并运行它们。在真实系统上运行真实代码是了解操作系统的最佳方式,因此建议你尽可能这样做。

在本书的各个部分,我们提供了一些作业(homework),确保你进一步理解书中的内容。其中许多作业都是对操作系统的一些模拟(simulation)程序。你应该下载作业,并运行它们,以此来测验自己。作业模拟程序具有以下特征:通过给它们提供不同的随机种子,你可以产生几乎无限的问题,也可以让模拟程序为你解决问题。因此,你可以一次又一次地自测,直至很好地理解了这些知识。

本书最重要的附录是一组项目(project),可供你通过设计、测试和实现自己的代码,来了解真实系统的工作原理。所有项目(以及上面提到的代码示例)都是使用C编程语言(C programming language)[KR88]编写的。C是一种简单而强大的语言,是大多数操作系统的基础,因此值得添加到你的工具库中。附录中含有两种类型的项目(请参阅在线附录中的想法)。第一类是系统编程(system programming)项目。这些项目非常适合那些不熟悉C和UNIX,并希望学习如何进行底层C编程的人。第二类基于在麻省理工学院开发的实际操作系统内核,称为xv6 [CK+08]。这些项目非常适合已经有一些C的经验并希望深入研究操作系统的学生。在威斯康星大学,我们以 3 种不同的方式开课:系统编程、xv6编程,或两者兼而有之。

从这本书中你可以学习到哪些内容?

  • 如何提供有许多CPU的假象?
  • 如何创建并控制进程
  • 如何高效、可控地虚拟化CPU
  • 如何执行受限制的操作
  • 如何在没有协作的情况下获得控制权
  • 如何重获CPU的控制权
  • 如何开发调度策略
  • 没有完备的知识如何调度?
  • 如何按比例分配CPU
  • 如何在多处理器上调度工作
  • 如何虚拟化内存
  • 如何分配和管理内存
  • 如何高效、灵活地虚拟化内存
  • 怎样支持大地址空间
  • 如何管理空闲空间
  • 如何通过页来实现虚拟内存
  • 如何加速地址转换
  • 如何让页表更小?
  • 如何超越物理内存
  • 如何决定踢出哪个页
  • 如何避免通用性“魔咒” 、
  • 如何创建和控制线程?
  • 怎样实现一个锁
  • 如何给数据结构加锁?
  • 如何使用信号量?
  • 如何处理常见的并发缺陷?
  • 不用线程,如何构建并发服务器?
  • 如何将I/O集成进计算机系统中?
  • 如何减少轮询开销?
  • 如何得到大型、快速、可靠的磁盘
  • 操作系统应该如何管理持久存储设备?都需要哪些API?实现有哪些重要方面?
  • 如何构建一个简单的文件系统?磁盘上需要什么结构?它们需要记录什么?它们如何访问?
  • 如何组织文件系统数据结构以提高性能?在这些数据结构之上,需要哪些类型的分配策略?如何让文件系统具有“磁盘意识”?
  • 考虑到崩溃,如何更新磁盘
  • 如何让所有写入变成顺序写入?
  • 系统应如何确保写入存储的数据受到保护?需要什么技术?如何在低空间和时间开销的情况下提高这些技术的效率?
  • 如何用无法一直正常工作的部件,来构建能工作系统?这个基本问题应该让你想起,我们在RAID存储阵列中讨论的一些主题。然而,这里的问题往往更复杂,解决方案也是如此。
  • 如何构建分布式文件系统?要考虑哪些关键方面?哪里容易出错?我们可以从现有系统中学到什么?
发布了481 篇原创文章 · 获赞 277 · 访问量 86万+
展开阅读全文

没有更多推荐了,返回首页

分享到微信朋友圈

×

扫一扫,手机浏览