大部分计算机的架构(指令集,内存组织,I/O,总线结构)在机器语言层面看,是非常原始并且难以编程的,输入输出尤甚。为了使这一点更具体,考虑下广泛使用的现代SATA(Serial ATA)硬盘,一本描述接口早期版本(By Anderson, 2007)——包含使用磁盘的必要知识——长达450页。之后,SATA接口经过多次修订,变得比2007年的早期版本越来越复杂。很明显的,没有任何理智的程序员会选择在硬件层面上处理磁盘。而是使用被称为磁盘驱动程序的软件处理磁盘,并且提供读写磁盘块的界面,程序员不需要关心细节。操作系统包含许多处理I/O的驱动程序。
但是即使是这种水平,对于大部分程序来说还是太低级。因此,所有的操作系统都提供 文件 作为磁盘系统的另一层抽象。通过这层抽象,程序可以创建,写入,读取文件,而不需要考虑硬件如何工作的混乱细节。
这种抽象是管理所有这类复杂性的关键。良好的抽象可以把一个几乎不可能完成的工作变成两个可管理的工作。首先是定义并且实现抽象,第二步是通过抽象来解决手头的问题。之前提到的文件是几乎所有计算机用户都能够理解的抽象。它是一片有用的信息,可能是照片,或者保存的E-mail,或者歌曲,或者网页。处理照片,E-mail,歌曲或者网页明显比处理SATA(或者其他)磁盘要来的容易。操作系统的任务就是创建良好的抽象,然后实现并且管理由此产生的抽象对象。在这本书,我们会讨论很多抽象,它们是理解操作系统的重点。
这一点是非常重要的,值得反复重复。对所有的设计Macintosh的工程师表示极高的尊敬。真实的硬件是丑陋的,真正的处理器,内存,磁盘和其他设备非常复杂并且难以使用,对于程序员来说很难使用这些混乱并且不一致的接口。有时这是为了和老旧硬件兼容,有时是纯粹为了省钱。然而,通常情况下硬件设计师并没有意识到(也许是不关心)他们给软件带来了多少麻烦。操作系统的主要任务之一就是掩盖硬件丑陋的设计,向运行的程序(以及它们的程序员)提供一个漂亮,干净,优雅,一致,抽象的接口。操作系统化丑陋为美丽,如图Fig. 1-2.
应当注意的是,操作系统真正的客户是应用程序(通过应用程序编写者)。它们是直接与操作系统及其抽象打交道的。与此相反,终端用户处理用户界面提供的抽象,用户界面可能是一个命令行程序或者图形界面。虽然用户界面的抽象可能和操作系统提供的抽象非常相似,但是这仅仅是特例。例如Windows的图形界面及命令提示符,二者均为Windows上的应用程序并且使用了同样的抽象层,然而它们对用户提供的接口却风格迥异。与此相似的是,Linux用户使用的KDE或Gnome桌面环境尽管运行在相同的抽象层之上,但是二者的体验区别也很大。
在这本书,我们将会深入研究提供给应用程序的抽象层的细节,而不是用户界面。这是一个庞大并且重要的主题,然而与操作系统的联系不甚明显。
1:译者注:原文为Extended Machine,结合文意应当为扩展硬件系统之意,或者抽象机