最适合初学者学习的操作系统书,没有理由不拿来读一读
新的一周开始了,今天给大家推荐一本最适合初学者学习的《操作系统导论》本书的作者讲解的思路非常清晰,从问题出发,一步步引导出解决方案,抽丝剥茧。本书围绕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存储阵列中讨论的一些主题。然而,这里的问题往往更复杂,解决方案也是如此。
如何构建分布式文件系统?要考虑哪些关键方面?哪里容易出错?我们可以从现有系统中学到什么?
本文转载自异步社区。
原文链接:https://www.epubit.com/articleDetails?id=02e514d24acc4598b69e53c6d6ee32b5
- 点赞
- 收藏
- 关注作者
评论(0)