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

网友投稿 617 2022-05-28

本书围绕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存储阵列中讨论的一些主题。然而,这里的问题往往更复杂,解决方案也是如此。

如何构建分布式文件系统?要考虑哪些关键方面?哪里容易出错?我们可以从现有系统中学到什么?

本文转载自异步社区。

虚拟化 任务调度

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:【古月21讲】ROS入门系列(1)——ROS命令工具的使用及创建工作空间和功能包
下一篇:(精华)2020年9月10日 C#基础知识点 共享内存(即时通讯)
相关文章