何为操作系统
现代计算机系统由一个或多个处理器、主存、磁盘、打印机、键盘、鼠标、显示器、网络接口以及其他各种输入/输出设备组成。一般而言,现代计算机系统是一个复杂的系统。若每位程序员都不得不掌握系统的所有细节,那就不可能再进行编码了。并且,管理这些部件并加以优化使用,是一件挑战性极强的工作。所以,计算机安装了一层软件,称为操作系统。
作为扩展机器的操作系统
抽象是管理复杂性的一个关键。好的抽象可以把一个几乎不可能管理的任务划分为两个可管理的部分。其第一部分是有关抽象的定义和实现。第二部分是随时用这些抽象来解决问题。
真实的处理器、内存条、磁盘和其他装置都是非常复杂的,对于那些为使用某个硬件而不得不编写软件的人们而言,他们使用的是困难、可怕和不一致的接口。有时这是需要兼容旧的软件,有时是为了节省成本,但是,有时硬件设计师们并没有意识到(或在意)他们给软件设计带来了多大的麻烦。操作系统的一个主要任务就是隐藏硬件,呈现给程序(以及程序员)良好、清晰、优雅、一致的抽象。操作系统将”丑陋“变成了”美丽“。
将操作系统看做向应用程序提供基本抽象的概念,是一种自顶向下的观点。
作为资源管理者的操作系统
按照另外一种自底向上的观点,操作系统则用来管理一个复杂系统的各个部分。现代计算机包含处理器、存储器、时钟、磁盘、鼠标、网络接口、打印机以及许多其他设备。从这个角度看,操作系统的任务是在相互竞争的程序之间有序地控制对处理器、存储器、以及其他I/O接口设备的分配。
操作系统的这种观点认为,操作系统的主要任务是记录哪个程序在使用什么资源,对资源请求进行分配,评估使用代价,并且为不同的程序和用户调解互相冲突的资源请求。
资源管理包括用以下两种方式实现多路复用(共享)资源:在时间上和在空间上复用。
当一种资源在时间上复用时,不同的程序或用户轮流使用它。
当一种资源在空间上复用时,每个客户都获得了资源的一部分,从而取代了客户排队。
计算机硬件
操作系统与运行该系统的计算机硬件联系密切。操作系统扩展了计算机指令集并管理计算机的资源。从概念上讲,一台简单的个人计算机可以抽象为类似下图的模型:
简单个人计算机的一些部件
CPU、内存以及I/O设备都由一条系统总线连接起来并通过总线与其他设备通信,现代个人计算机结构更加复杂,包含多重总线。
处理器
CPU是计算机的”大脑“,它从内存中取出指令并执行之。在每个CPU基本周期中,首先从内存中取出指令,解码以确定其类型和操作数,接着执行之,然后取指、解码并执行下一条指令。
每个CPU都有一套可执行的专门指令集。所以x86处理器不能执行ARM程序,而ARM处理器也不能执行x86程序。由于用来访问内存以得到指令或数据的时间比执行指令花费的时间长得多,因此,所有的CPU内部都有一些用来保存关键变量和临时数据的寄存器。
除了用来保存关键变量和临时结果的通用寄存器之外,多数计算机还有一些对程序员可见的专用寄存器。其中之一是程序计数器,它保存了将要取出的下一条指令的内存地址。在指令取出之后,程序计数器就被更新指向后继的指令。
另一个寄存器是堆栈指针,它指向内存中当前栈的顶端。该栈包含了每个执行过程的栈帧。一个过程的栈帧中保存了有关的输入参数、局部变量以及那些没有保存在寄存器中的临时变量。
还有程序状态字(Program Status Word,PSW)寄存器。这个寄存器包含了条件码位(由比较指令设置)、CPU优先级、模式(用户态或内核态),以及各种其他控制位。用户程序通常读入整个PSW,但是,只对其中的少量字段写入。在系统调用和I/O中,PSW的作用很重要。
操作系统必须知晓所有的寄存器,在时间多路复用(time multiplexing)CPU中,操作系统经常会中止正在运行的某个程序并启动(或再启动)另一个程序。每次停止一个运行着的程序时,操作系统必须保存所有的寄存器值,这样在稍后该程序再次被运行时,可以把这些寄存器重新装入。
存储器
在理想情形下,存储器应该极为快速(快于执行一条指令,这样CPU不会受到存储器的限制)、充分大、并且非常便宜,但是目前的技术无法同时满足这三个目标,于是出现了不同的处理方式。
典型的存储器层次结构(图中的数据是非常粗略的估计):
顶层的存储器速度较高,容量较小,与底层的存储器相比每位成本较高,其差别往往是十亿数量级。
存储器系统的顶层是CPU中的寄存器。他们用与CPU相同的材料制成,所以和CPU一样快。其典型的存储容量是,在32位CPU中为32×32位,而在64位CPU中为64×64位。在这两种情形下,其存储容量都小于1KB。
下一层是高速缓存,它多数由硬件控制。主存被分割成高速缓存行(cache line),其典型大小为64字节,地址0至63对应高速缓存行0,地址64至127对应高速缓存行1,以此类推。
在任何缓存系统中,都有若干需要尽快考虑的问题,包括:
1. 何时把一个新的内容放入缓存
2. 把新内容放在缓存的哪一行上
3. 在需要时,应该把哪个内容从缓存中移走
4. 应该把新移走的内容放在某个较大存储器的何处
再下一层是主存。这是存储器系统的主力。主存通常称为随机访问存储器(Random Access Memory,RAM)。
磁盘
下一个层次是磁盘(硬盘)。磁盘同RAM相比,每个进制位的成本低了两个数量级,而且经常也有两个数量级大的容量。磁盘唯一的问题是随机访问数据时间大约慢了三个数量级。其低速的原因是因为磁盘是一种机械装置。
磁盘驱动器的构造
在一个磁盘中有一个或多个金属盘片,它们以5400rpm、7200rpm、10800rpm或更高的速度旋转。从边缘开始有一个机械臂悬横在盘面上,这个类似于老式播放塑料唱片33转唱机上的拾音臂。信息写在磁盘的一系列同心圆上。在任意一个给定臂的位置,每个磁头可以读取一段环形区域,称为磁道(track)把一个给定臂的位置上的所有磁道合并起来,组成了一个柱面。
每个磁道划分为若干扇区,扇区的典型值是512字节。在现代磁盘中,较外部的柱面比较内部的柱面有更多的扇区。机械臂从一个柱面移到相邻的柱面大约需要1ms。而随机移到一个柱面的典型时间为5ms到10ms,其具体时间取决于驱动器。一旦磁臂到达正确的磁道上,驱动器必须等待所需扇区旋转到磁头之下,就开始读写,低端硬盘的速率是50MB/s,而高速磁盘的速率是160MB/s。
I/O设备
I/O设备一般包括两个部分:设备控制器和设备本身。
控制器是插在电路板上的一块芯片或一组芯片,这块电路板物理地控制设备。它从操作系统接收命令,例如,从设备读数据,并且完成数据的处理。控制器的任务是为操作系统提供一个简单的接口。
另一个部分是设备本身,设备本身有个相对简单的接口,这是因为接口既不能做很多工作,又已经标准化了。
每类设备控制器都是不同的,所以需要不同的软件进行控制。专门与控制器对话,发出命令并接收响应的软件,称为设备驱动程序(device drver)。
为了能够使用设备驱动程序,必须把设备驱动程序装入操作系统中,这样其可以在核心态运行。设备驱动程序也可以在内核外运行,现代的Linux和windows操作系统也的确对这种方式提供了一些支持。
将设备驱动程序装入操作系统,有三个途径。第一个途径是将内核与设备驱动程序重新链接,然后重启系统。第二个途径是在操作系统文件中设置一个入口,并通知该文件需要一个设备驱动程序,然后重启系统。在系统启动时,操作系统去找寻所需的设备驱动程序并装载之。第三种途径是,操作系统能够在运行时接受新的设备驱动程序并且立即将其安装好,无需重启系统。热插拔设备都需要动态可装载设备驱动程序。
实现输入和输出的方式有三种。在最简单的方式中,用户程序发出一个系统调用,内核将其翻译成一个对应设备驱动程序的过程调用。然后设备驱动程序启动I/O并在一个连续不断的循环中检查该设备,看该设备是否完成了工作(一般有一些二进制位用来指示设备仍在忙碌中)。当I/O结束后,设备程序把数据送到指定的地方(若有此需要),并返回。然后操作系统将控制返回给调用者。这种方式称为忙等待(busy waiting),其缺点是要占据CPU,CPU一直轮询设备直到对应的I/O操作完成。
第二种方式是设备驱动程序启动设备并且让该设备在操作完成时发出一个中断。设备驱动程序在这个时刻返回。操作系统接着在需要时阻塞调用者并安排其他工作进行。当设备驱动程序检测到该设备的操作完毕时,它发出一个中断通知操作完成。
第三种方式是,为I/O使用一种特殊的直接存储器访问(Direct Memory Access,DMA)芯片,它可以控制在内存和某些控制器之间的位流,而无需持续的CPU干预。CPU对DMA芯片进行设置,说明需要传送的字节数、有关的设备和内存地址以及操作方向,接着启动DMA。当DMA芯片完成时,它引发一个中断,其处理方式如前所述。
总线
随着处理器和存储器速度越来越快,到了某个转折点时,单总线就很难处理总线的交通流量了,只有放弃。其结果是导致其他的总线出现,他们处理I/O设备的以及CPU到存储器的速度都更快。这种变化的结果是,目前一台大型x86系统的结构如图所示:
一个大型x86系统的结构
图中的系统有很多总线(例如高速缓存、内存、PCIe、PCI、USB、SATA和DMI),每条总线的传输速度和功能都不同。操作系统必须了解所有总线的配置和管理。其中主要的总线是PCIe(Peripheral Component Interconnection Express)总线。
Intel发明的PCIe总线是陈旧的PCI总线的继承者,而PCI总线则是为了取代原来的ISA(Industry Standard Architecture)总线。数十Gb/s的传输能力使得PCIe比它的前身快得多。它们在本质上也十分相同。直到发明PCIe总线的2004年,大多数总线都是并行且共享的。共享总线架构(shared bus architecture)表示多个设备使用一些相同的导线传输数据。因此,当多个设备同时需要发送数据时,需要仲裁器决定哪个设备可以使用总线。而PCIe恰好相反,它使用分离的端到端的链路。传动PCI使用的并行总线架构(parallel bus architecture)表示通过多条导线发送数据的每一个字。例如,在传统的PCI总线上,一个32位数据通过32条并行的导线发送。与之相反,PCIe使用串行总线架构(serial bus architecture),通过一条被称为数据通路的链路传递集合了所有位的一条消息。这非常像网络包。这样做简单了很多,因为不用再确保所有32位在同一时刻精确地到达目的地。通过将多个数据通路并行起来,并行性仍可得到有效利用。例如,可以通过32条数据通路并行传输32条消息。随着网卡和图形适配器这些外围设备速度迅速增长,PCIe标准每3~5年进行一次更新。例如PCIe 2.0规格的16个数据通路提供64Gb/s的速度,升级PCIe 3.0后会提速2倍,而PCIe 4.0会再提速2倍。
在图中,CPU通过DDR3总线与内存对话,通过PCIe总线与外围图形设备对话,通过DMI(Direct Medie Interface)总线经集成中心与所有其他设备对话。而集成中心通过串行总线与USB设备对话,通过SATA总线与硬盘和DVD驱动器对话,通过PCIe传输以太网帧。其他PCI设备可能连接到另一个集成中心,这些中心再连接到主集成中心,从而形成总线树。
不仅如此,每一个核不仅有独立的高速缓存,而且还共享一个大得多的高速缓存。每一种高速缓存都引入了又一条总线。
USB(Universal Serial Bus)是用来将所有慢速I/O设备(如键盘和鼠标)与计算机连接的。
SCSI(Small Computer System Interface)总线是一种高速总线,用在高速硬盘、扫描仪和其他需要较大带宽的设备上。
启动计算机
简要启动过程如下。
在每台计算机上有一块双亲板(其实就是主板)。在主板上有一个称为基本输入输出系统(Basic Input Output System,BIOS)的程序。在BIOS内有底层I/O软件,包括读键盘、写屏幕、进行磁盘I/O以及其他过程。现在这个程序存放在一块闪速RAM中,它是非易失性的,但是在发现BIOS有错时可以通过操作系统对它进行更新。
在计算机启动时,BIOS开始运行。它先检查所安装的RAM数量,键盘和其他基本设备是否已安装并正常响应。接着,它开始扫描PCIe和PCI总线并找出连在上面的所有设备。即插即用设备也被记录下来。如果现有的设备和系统上一次启动时的设备不同,则新的设备将被配置。
然后,BIOS通过尝试存储在CMOS存储器中的设备清单决定启动设备。用户可以在系统刚启动后进入一个BIOS配置程序,对设备清单进行修改。典型地,如果存在CD-ROM(有时是USB),则系统试图从中启动;如果失败,系统将从硬盘启动。启动设备上的第一个扇区被读入内存并执行。这个扇区中包含一个对保存在启动扇区末尾的分区表检查的程序,以确定哪个分区是活动的。然后,从该分区读入第二个启动装载模块。来自活动分区的这个装载模块被读入操作系统,并启动之。
然后,操作系统询问BIOS,以获得配置信息。对于每种设备,系统检查对应的设备驱动程序是否存在,如果没有,系统要求用户插入含有该设备驱动程序的CD-ROM(由设备供应商提供)或者从网络上下载驱动程序。一旦有了全部的设备驱动程序,操作系统就将他们调入内核。然后初始化相关表格,创建需要的任何后台进程,并在每个终端上启动登录程序或GUI。
CMOS是一类存储器,它是易失性的。许多计算机利用CMOS存储器保持当前时间和日期。CMOS存储器和递增时间的时钟电路由一块小电池驱动,所以,即使计算机没有上电,时间也仍然可以正确的更新。CMOS存储器还可以保存配置参数,如哪一个是启动磁盘等。之所以采用CMOS是因为它消耗的电能非常少,一块工厂原装的电池往往能使用若干年。但是,当电池开始失效时,计算机就会出现“Alzheimer病症”——计算机会忘掉记忆多年的事物,比如应该由哪个磁盘启动等。
操作系统大观园
1. 大型机操作系统
操作系统的高端是用于大型机的操作系统。这些计算机与个人计算机的主要差别是其I/O处理能力。大型机在高端的web服务器、大型电子商务服务站点和事务-事务交易服务器上有某种程度的卷土重来。
用于大型机的操作系统主要面向多个作业的同时处理,多数这样的作业需要巨大的I/O能力。系统主要提供三类服务:批处理、事务处理和分时。批处理系统处理不需要交互式用户干预的周期性作业。保险公司的索赔处理或连锁商店的销售报告通常就是以批处理的方式完成。事务处理系统负责大量小的请求,例如,银行的支票处理或航班预订。每个业务量都很小,但是系统必须每秒处理成百上千个业务。分时系统允许多个远程用户同时在计算机上运行作业,如在大型数据库上的查询。大型机操作系统正在逐渐被诸如Linux这类UNIX的变体所替代。
2. 服务器操作系统
服务器操作系统在服务器上运行,服务器可以是大型的个人计算机、工作站,甚至是大型机。他们通过网络同时为若干个用户服务,并且允许用户共享硬件和软件资源。典型的服务器操作系统有Solaris、FreeBSD、Linux和Windows Server 201x。
3. 多处理器操作系统
获得大量联合计算能力的常用方式是将多个CPU连接成单个的系统。依据连接和共享方式的不同,这些系统称为并行计算机、多计算机或多处理器。它们需要专门的操作系统,不过通常采用的操作系统是配有通信、连接和一致性等专门功能的服务器操作系统的变体。许多主流操作系统,包括Windows和Linux,都可以运行在多核处理器上。
4. 个人计算机操作系统
现代个人计算机操作系统都支持多道程序处理,在启动时,通常有几十个程序开始运行。它们的功能是为单个用户提供良好的支持。这类系统广泛用于字处理、电子表格、游戏和Internet访问。常见的例子是Linux、FreeBSD、Windows7、Window8、Windows10和苹果公司的OSX。
5. 掌上计算机操作系统
随着系统越来越小型化,我们看到了平板电脑、智能手机和其他掌上计算机系统。掌上计算机或者PDA(个人数字处理,Personal Digital Assistant)是一种可以握在手中操作的小型计算机。这部分市场已经被谷歌的Android系统和苹果的iOS主导。
6. 嵌入式操作系统
嵌入式操作系统在用来控制设备的计算机中运行,这种设备不是一般意义上的计算机,并且不允许用户安装软件。典型的例子有微波炉、电视机、汽车、DVD刻录机、移动电话以及MP3音乐播放器一类的设备。
区别嵌入式系统与掌上设备的主要特征是,不可信的软件肯定不能在嵌入式系统上运行。
7. 传感器节点操作系统
传感器是一种内建有无线电的电池驱动的小型计算机。每个传感器节点是一个配有CPU、RAM、ROM以及一个或多个环境传感器的实实在在的计算机。节点上运行一个小型但是真实的操作系统,通常这个操作系统是事件驱动的,可以响应外部事件,或者基于内部时钟进行周期性的测量。该操作系统必须小且简单,因为这些节点的RAM很小,而且电池寿命是一个重要问题。TinyOS是一个用于传感器节点的知名操作系统。
8. 实时操作系统
这类操作系统的特征是将时间作为关键参数。如果某个动作必须绝对地在规定的时刻(或规定的时间范围)发生,这就是硬实时系统。可以在工业过程控制、民用航空、军事以及类似应用中看到很多这样的系统。这些系统必须提供绝对保证,让某个特定的动作在给定的时间内完成。
另一类实时系统是软实时系统,这种系统中,虽然不希望偶尔违反最终时限,但仍可以接受,并且不会引起任何永久性的损耗。数字音频或多媒体系统就是这类系统。智能手机也是软实时系统。
由于在(硬)实时系统中满足严格的时限是关键,所以操作系统就是一个简单的与应用程序链接的库,各个部分必须紧密耦合且彼此之间没有保护。这种实时系统的例子有eCos。
掌上、嵌入式以及实时系统的分类之间有不少是彼此重叠的。几乎所有这些系统至少存在某种软实时场景。嵌入式和实时系统只运行系统设计师安装的软件,用户不能添加自己的软件,这样就使得保护工作很容易。掌上和嵌入式系统是给普通消费者使用的,而实时系统则更多用于工业领域。无论如何,这些系统确实存在一些共同点。
9. 智能卡操作系统
最小的操作系统运行在智能卡上。智能卡是一种包含一块CPU芯片的信用卡。它有非常严格的运行能耗和存储空间的限制。其中有些智能卡只具有单项功能,如电子支付,但是其他的智能卡则拥有多项功能,它们有专用的操作系统。
有些智能卡是面向Java的。这意味着在智能卡的ROM中有一个Java虚拟机解释器。Java小程序被下载到卡中并由JVM解释器执行。有些卡可以同时处理多个Java小程序,这就是多道程序,并且需要对它们进行调度。在两个或多个小程序同时运行时,资源管理和保护就成为突出的问题。这些问题必须由卡上的操作系统(通常是非常原始的)处理。
操作系统概念
多数操作系统都使用某些基本概念和抽象,比如进程、地址空间以及文件等。
进程
在所有的操作系统中,一个重要的概念就是进程(prodess)。进程本质上是正在执行的一个程序。与每个进程相关的是地址空间(address space),这是从某个最小值的存储位置(通常是零)到某个最大值的存储位置的列表。在这个地址空间中,进程可以进行读写,该地址空间中存放有可执行程序、程序的数据以及堆栈。与每个进程相关的还有资源集,通常包括寄存器(含程序计数器和堆栈指针)、打开文件的清单、突出的报警、有关进程清单,以及运行该程序所需要的所有其他信息。进程基本上是容纳运行一个程序所需要所有信息的容器。
地址空间
每个进程都有一些可以使用的地址集合,典型值从0开始知道某个最大值,这就是地址空间。
文件
文件也是操作系统的一个关键概念。操作系统的一项主要功能是隐藏磁盘和其他I/O设备的细节特性,给程序员提供一个良好、清晰的独立于设备的抽象文件模型。在文件可以读取之前,必须先在磁盘上定位和打开文件,在文件读过之后应该关闭文件,有关的系统调用可用来完成这类操作。为了提供保存文件的地方,大多数操作系统支持目录(directory)的概念,从而可以把文件分类成组。
在读写文件前,首先要打开文件,检查其访问权限。若权限许可,系统将返回一个小整数,称作文件描述符(file descriptor)供后续操作使用。若禁止访问,系统则返回一个错误码。
在UNIX中有一个重要概念是安装文件系统。UNIX允许把外部设备的文件系统接到主文件树上。mount系统调用允许把外部设备上的文件系统连接到所希望的根文件系统上。
在UNIX中,另一个重要的概念是特殊文件(special file)。提供特殊文件是为了使I/O设备看起来像文件一般。这样,就像使用系统调用读写文件一样,I/O设备也可以通过同样的系统调用进行读写。有两类特殊文件:块特殊文件(block special file)和字符特殊文件(character special file)。块特殊文件指那些可随机存取的块组成的设备,如磁盘等。类似地,字符特殊文件用于打印机、调制解调器和其他接收或输出字符流的设备。
还有一种虚文件:管道(pipe)。管道可以连接两个进程。如图所示。若进程A和B希望通过管道对话,它们必须提前设置该管道。当进程A想对进程B发送数据时,它把数据写到管道上,仿佛管道就是输出文件一样。进程B可以通过读取管道而得到数据,仿佛管道就是一个输入文件一样。
输入/输出
所有的计算机都有用来获取输入和产生输出的物理设备。所以,每个操作系统都有管理其I/O设备的I/O子系统。某些I/O软件是设备独立的,即这些I/O软件部分可以同样应用于许多或者全部的I/O设备上。I/O软件的其他部分,如设备驱动程序,是专门为特定的I/O设备设计的。
保护
计算机中有大量的信息,用户经常希望对其进行保护,并保守秘密。考察UNIX可发现,UNIX操作系统通过对每个文件赋予一个9位的二进制保护代码,对UNIX中的文件实现保护。该保护代码有3个位字段,一个用于所有者,一个用于与所有者同组(用户被系统管理员划分成组)的其他成员,一个用于其他人。每个字段中有一位用于读访问,一位用于写访问,一位用于执行访问。这些位就是知名的rwx位。对一个目录而言,x的含义是允许查询。
shell
操作系统是进行系统调用的代码。编辑器、汇编器、汇编程序、链接程序、效用程序以及命令解释器等。尽管非常重要,也非常有用,但是它们确实不是操作系统的组成部分。UNIX的命令解释器,称为shell。尽管shell本身不是操作系统的一部分,shell体现了许多操作系统的特性,并很好地说明了系统调用的具体用法。shell同时也是终端用户与操作系统之间的接口,除非用户使用的是图形界面。有许多种shell,如sh、csh、ksh以及bash等。
系统调用
我们已经看到,操作系统具有两种功能:为用户程序提供抽象和管理计算机资源。在多数情形下,用户程序和操作系统之间的交互处理的是前者,例如,创建、写入、读出和删除文件。对用户而言,资源管理部分主要是透明和自动完成的。这样,用户和操作系统之间的交互主要就是处理抽象。
任何单CPU计算机一次只能执行一条指令。如果一个进程正在用户态运行一个用户程序,并且需要一个系统服务,比如从一个文件读数据,那么它必须执行一个陷阱或系统调用指令,将控制转移到操作系统。操作系统接着通过参数检查找出所需要的调用进程。然后,它执行系统调用,并把控制返回给在系统调用后面跟随着的指令。在某种意义上,进行系统调用就像一个特殊的过程调用,但是只有系统调用可以进入内核,但过程调用则不能。
操作系统结构
下面将讨论六种操作系统结构设计:单体系统、层次式系统、微内核、客户端-服务器模式、虚拟机和外核。
单体系统
在大多数组织中,整个操作系统在内核态以单一程序的方式运行。整个操作系统以过程集合的方式编写,链接成一个大型可执行二进制程序。
层次性系统
一个层次式结构的操作系统,它的上层软件都是在下一层软件的基础之上构建的。如图所示。该系统分为六层。
处理器分配在第0层中进行,当中断发生或定时器到期时,由该层进行进程切换。在第0层之上,系统由一些连续的进程所组成,编写这些进程时不用再考虑再单处理器上多进程运行的细节。也就是说,第0层提供了基本的CPU多道程序设计功能。
内存管理在第1层中进行,它分配进程的主存空间,当内存用完时则在一个512k字的磁鼓上保留进程的一部分(页面)在第1层上,进程不用考虑它是在磁鼓上还是在内存中运行。第1层软件保证一旦需要访问某一页面,该页面必定已在内存中,并在页面不再需要时将其移除。
第2层处理进程与操作员控制台(即用户)之间的通信。在这层的上部,可以认为每个进程都有自己的操作员控制台。第3层管理I/O设备和相关的信息流缓冲区。在第3层上,每个进程都与有良好特性的抽象I/O设备打交道,而不必考虑外部设备的物理细节。第4层是用户程序层。用户程序不用考虑进程、内存、控制台或I/O设备管理等细节。系统操作员进程位于第5层中。
微内核
在分层方式中,设计者要确定在哪里划分内核-用户的边界。传统上,所有的层都在内核中,但是这样做没有必要。事实上,尽可能减少内核中的功能的做法更好,因为内核中的错误会快速拖累系统。相反,可以把用户进程设置为具有较小的权限,这样,某个错误的后果就不会是致命的。
在微内核设计背后的思想是,为了实现高可靠性,将操作系统划分成小的、良好定义的模块,只有其中一个模块——微内核——运行在内核态,其余的模块由于功能相对弱些,则作为普通用户进程运行。
一个与小内核相关联的思想是内核中的机制和策略分离的原则。比如进程调度。一个简单的调度算法是,对每个进程赋予一个优先级,并让内核执行具有最高优先级的进程。这里,机制(在内核中)就是寻找最高优先级的进程并运行之。而策略(赋予进程优先级)可以由用户态中的进程完成。在这种方式中,机制和策略是分离的,从而使系统内核变的更小。
客户端-服务器模式
一个微内核思想略微变体是将进程划分为两类:服务器,每个服务器提供某种服务;客户端,使用那些服务。这个模式就是所谓的客户端-服务器模式。通常,在系统最底层是微内核,但并不是必须这样。这个模式的本质是存在客户端进程和服务器进程。
虚拟机
外核
在底层中,一种称为外核(exokernel)的程序在内核态运行。它的任务是为虚拟机分配资源,并检查使用这些资源的企图,以确保没有机器会使用他人的资源。
小结
考察操作系统有两种观点:资源管理观点和扩展的机器观点。在资源管理观点中,操作系统的任务是有效地管理系统的各个部分。在扩展的机器观点中,系统的任务是为用户提供比实际机器更便于运用的抽象。这些抽象包括进程、地址空间以及文件。
操作系统的历史很长,从操作系统开始替代操作人员的那天开始到现代多道程序系统,主要包括早期批处理系统、多道程序系统以及个人计算机。
由于操作系统同硬件的交互密切,掌握一些硬件知识对于理解它们是有益的。计算机由处理器、存储器及I/O设备组成。这些硬件通过总线连接。
所有操作系统构建所依赖的基本概念是进程、存储管理、I/O管理、文件管理和安全。
任何操作系统的核心是它可处理的系统调用集,这些系统调用真实地说明了操作系统所做的工作。