1 操作系统的基本概念
操作系统(operating system,OS)是配置在计算机硬件上的第一层软件,是对硬件系统的首次扩充,其主要作用是管理硬件设备,提高它们的利用率和系统吞吐量,并为用户和应用程序提供一个简单的接口,以便于用户和应用程序使用硬件设备。OS是现代计算机系统中最基本和最重要的系统软件,而其他的诸如编译软件、数据库管理软件等系统软件以及大量的应用软件,都直接依赖于OS的支持,并须取得OS所提供的服务。事实上OS已成为现代计算机系统、多处理机系统、计算机网络等都必须配置的系统软件。
在计算机系统上配置OS,其主要目标是实现:方便性、有效性、可扩充性、开放性。
OS 作为用户与计算机硬件系统之间的接口
OS作为用户与计算机硬件系统之间的接口,其含义是

2 操作系统的发展历程
1 未配置OS的计算机系统
人工操作。缺点,用户独占全机,CPU等待人工操作。
脱机操作。优点,减少CPU空闲时间。提高I/O。

2 单道批处理系统
脱机I/O后处理。 处理过程:首先由监督程序将磁带上的第一个作业装入内存,并把运行控制权交给该作业;当该作业处理完成时,又把运行控制权交还给监督程序
内存中始终只保持一道作业,故称之为单道批处理系统。

从图中可以看出,在 、 时间间隔内CPU空闲。
3 多道批处理系统
在该系统中,用户所提交的作业会被先存放在外存上,并排成一个队列,称为“后备队列”。然后由作业调度程序按一定的算法从后备队列中选择若干个作业调入内存,使它们共享CPU和系统中的各种资源。

资源利用率高。系统吞吐量大。平均周转时间长。无交互能力。
问题
争用处理机问题,内存分配与保护问题,I/O设备分配问题,文件的组织与管理问题,作业管理问题,用户与系统的接口问题
4 分时系统
5 实时系统
6 微机操作系统
7 嵌入式操作系统
8 网络操作系统
9 分布式操作系统
分布式系统是利用软件系统方式构建在 上的一种多处理机系统。
分布式系统是一些独立的计算机的集合, 但是对这个系统的用户来说,系统就像一台计算机一样。
(1)分布性:分布式系统由多台计算机组成,地理位置的分布性,功能的分布性,资源的分布性,控制的分布性。资源和控制的分布性也称为自治性。
(2)透明性:分布式系统的系统资源被所有计算机共享。
(3)同一性:分布式系统中的若干台计算机可以通过互相协作来完成同一任务,或者说程序可以分布在几台计算机上并行地运行。
(4)全局性:系统具备一个全局性的进程通信机制
分布式OS是配置在分布式系统上的公用OS,其以全局的方式对分布式系统中的所有资源进行统一管理,可以直接对系统中地理位置分散的各种物理和逻辑资源进行动态分配和调度, 有效地协调和控制各个任务的并行执行,协调和保持系统内的各个计算机间的信息传输与协作运行,并向用户提供一个统一的、方便的、透明的使用系统界面和标准接口。
与网络OS不同,分布式OS的用户在使用系统资源时,不需要了解诸如网络中各个计算机的功能与配置、OS的差异、软件资源、网络文件的结构、网络设备的地址、远程访问的方式等情况,即系统对用户屏蔽了其内部实现的细节。
1 通信管理功能。分布式OS通过提供一些通信原语的方式,实现了系统内的进程通信。
2 资源管理功能。所有资源实施统一管理、统一分配和统一调度, 以提高资源利用率,方便用户共享和使用。
3 进程管理功能。
平衡各节点负载,提供进程或计算迁移功能,
提高进程的并行程度,提供分布式的同步和互斥机制以及应对死锁的措施等
3 程序运行环境
4 操作系统结构
4.0 简单结构
简单结构OS的一个典型例子是MS-DOS系统。
该系统并没有很好地区分功能的接口和层次。例如,应用程序能访问基本的I/O程序,并能将数据直接写到显示器和磁盘。这种自由度使MS-DOS系统易受错误(或恶意)程序的伤害,进而可能会导致整个系统崩溃。
4.1 分层
4.2 模块化
模块化程序设计技术,基于“分解”和“模块化”原则来控制大型软件的复杂度。
将OS按其功能精细地划分为若干个具有一定独立性和大小的模块。每个模块具有某方面的管理功能,如进程管理、存储器管理、文件管理等,并仔细地规定好各模块间的接口,使各模块之间能通过该接口实现交互。
这种设计方法称为模块-接口法。

划分模块时将模块划分得太小,则虽然可以降低模块本身的复杂性,但也会导致模块之间的联系过多,进而导致系统比较混乱;如果将模块划分得过大,则又会增加模块内部的复杂性。因此在划分模块时,应在“两者”之间进行权衡。
衡量模块的独立性有以下两个标准:1内聚性,指模块内部各部分间联系的紧密程度,内聚性越高,模块独立性越强;2耦合度,指模块间相互联系和相互影响的程度,显然,耦合度越低,模块独立性越强。
优点:1提高了OS设计的正确性、可理解性和易维护性;2增强了OS的可适应性;3加速了OS的开发过程。
问题:1在设计OS时,对各模块间接口的规定,很难满足划分完成后模块对接口的实际需求。2各模块的设计齐头并进,进而造成了各种决定的“无序性”
目前,设计OS的常用方法是采用可加载的内核模块(loadable kernel module)。内核提供核心服务,而其他服务可在内核运行时动态实现
。动态链接服务优于直接添加新功能到内核,这是因为对于每次更改,后者都需要重新编译内核
。
4.3 宏内核
4.4 微内核
在分层方式中,设计者要确定在哪里划分内核一用户的边界。传统上,所有的层都在内核中,但是这样做没有必要。事实上,尽可能减少内核态中功能的做法更好,因为内核中的错误会快速拖累系统。 相反,可以把用户进程设置为具有较小的权限,这样,某个错误的后果就不会是致命的。
在微内核设计背后的思想是,为了实现高可靠性,将操作系统划分成小的、良好定义的模块,只有其中一个模块—微内核——运行在内核态,其余的模块由于功能相对弱些,则作普通用户进程运行。 特别地,由于把每个设备驱动和文件系统分别作为普通用户进程,这些模块中的错误虽然会使这些模块崩溃,但是不会使得整个系统死机。
在内核的外部,系统的构造有三层进程,它们都在用户态运行。最底层中包含设备驱动器。由于它们在用户态运行,所以不能物理地访向1/O端口空间,也不能直接发出1/O命令。相反,为了能够对1/O设备编程,驱动器构建了一个结构,指明哪个参数值写到哪个1/O端口,并生成一个内核调用,通知内核完成写操作。这个处理意味着内核可以检查驱动正在对1/O的读(或写)是否是得到授权使用的。这样, (与单体设计不同)一个有错误的音频驱动器就不能够偶发性地在硬盘上进行写操作。
在驱动器上面是另一用户态层,包含有服务器,它们完成操作系统的多数工作。由一个或多个文件服务器管理着文件系统,进程管理器创建、销毁和管理进程等。通过给服务器发送短消息请求POSIX系统调用的方式,用户程序获得操作系统的服务。例如,一个需要调用read的进程发送一个消息给某个文件服务器,告知它需要读什么内容。

有一个有趣的服务器,称为再生服务器 (reincarnation server),其任务是检查其他服务器和驱动器的功能是否正确。一旦检查出一个错误,它自动取代之,无须任何用户的干预。这种方式使得系统具有自修复能力,并且获得了较高的可靠性。
OS的微内核(microkernel)结构,由于它能有效地支持多处理机运行,故非常适用于分布式系统环境。
基于客户/服务器模式的微内核结构,将OS划分为两大部分:微内核和多个服务器。
足够小的核
微内核并不是一个完整的OS,而只是OS中最基本的部分。它通常包含:1用于处理与硬件紧密相关的部分;2一些最基本的功能;3客户和服务器之间的通信。它们只是为构建通用OS提供了一个重要基础。这样就可以确保把OS内核做得很小。
基于客户/服务器模式
将OS中最基本的部分放入内核中,而把OS的绝大部分功能都放在微内核外面的一组服务器(进程)中实现。
客户与服务器之间是借助微内核提供的消息传递机制来实现信息交互的。

采用策略与机制分离原则
所谓机制,是指实现某一功能的具体执行机构;而策略,则是指在机制的基础上,借助于某些参数和算法来实现该功能的优化或达到不同的功能目标。通常,机制处于系统的基层,而策略则处于系统的高层。在传统OS中,将机制放在OS内核的较低层,将策略放在OS内核的较高层。而在微内核OS 中,通常将机制放在OS的微内核中。正因为如此,才有可能将内核做得很小。
面向对象
面向对象技术被广泛应用于现代OS的设计中。
优点 (1)提高了系统可扩展性。 (2)增强了系统的可靠性。 (3)增强了系统的可移植性。 (4)提供了对分布式系统的支持。 (5)融入了面向对象技术。
缺点 效率降低最主要的原因是,在完成一次客户对OS提出的服务请求时,需要利用消息实现多次交互,以及进行用户/内核模式和上下文的多次切换。 实际情况往往还会引起更多的上下文切换。

4.5 外核
外核(exokernel)或外内核OS的基本思想是:内核不提供传统OS中的进程、虚拟存储器等抽象事物,而是专注于物理资源的隔离(保护)与复用。
在基于外核结构的OS中, 一个非常小的内核负责保护系统资源,而硬件资源的管理职责则委托给应用程序。这样,OS就可以做到在保证资源安全的前提下,减少对应用程序的限制,充分满足应用程序对硬件资源的不同需求。

库OS的实现思想是:基于应用程序的需求来定制OS内核,将原本属于OS内核的功能以库的形式提供给用户。
5 操作系统引导
6 虚拟机
- 1 现代操作系统
- 1 现代操作系统
虚拟化的主要思想是虚拟机监控程序(Virtual Machine Monitor, VMM)在同一物理硬件上创建出有多台虚拟机器的假象。VMIM又称作虚拟机管理程序(hypervisor)。

第一类和第二类虚拟机管理程序的真正区别在于,后者利用宿主操作系统(host operating system)并通过其文件系统创建进程、存储文件等。第一类虚拟机管理程序没有底层支持,所以必须自行实现所有功能。
当第二类虚拟机管理程序启动时,它从CD-ROM安装盘中读入供选择的客户操作系统(guest operating system),并安装在一个虚拟盘上,该盘实际上只是宿主操作系统的文件系统中的一个大文件。 由于没有可以存储文件的宿主操作系统,因此第一类虚拟机管理程序不能采用这种方式。它们必须在原始的硬盘分区上自行管理存储。
6.1 虚拟机基础

图a展示了第一类虚拟机管理程序。从技术上讲,第一类虚拟机管理程序就像一个操作系统,因为它是唯一个运行在最高特权级的程序。它的工作是支持真实硬件的多个虚拟机(virtual machine)拷贝,类似于普通操作系统支持的进程。
图b展示的第二类虚拟机管理程序则不同。它是一个依赖于Windows、Linux等操作系统分配和调度资源的程序,很像一个普通的进程。当然,第二类虚拟机管理程序仍伪装成具有CPU和各种设备的完整计算机。两类虚拟机管理程序都必须以一种安全的方式执行机器指令。例如,运行在虚拟机管理程序上的一个操作系统可能修改甚至弄乱自己的页表,但不能影响其他虚拟机操作系统。
运行在两类虚拟机管理程序上的操作系统都称作客户操作系统(guest operating system)。对于第二类虚拟机管理程序,运行在底层硬件上的操作系统称作宿主操作系统(host operating system)。
第二类虚拟机管理程序有时又称作托管型虚拟机管理程序,依赖Windows、Linux、OS X等宿主操作系统提供的大量功能。首次启动时,第二类虚拟机管理程序像一个刚启动的计算机那样运转,期望找到一个包含操作系统的DVD、U盘或CD-ROM。这些驱动器可以是虚拟设备,例如,可以将包含操作系统的镜像保存为宿主机硬盘上的ISO文件,让虚拟机管理程序伪装成从正常DVD驱动器中读取。接下来, 虚拟机管理程序运行DVD上的安装程序,将操作系统安装到虚拟磁盘(virtual disk,其实只是宿主操作系统中的一个文件)上。客户操作系统安装完成后,就能启动并运行了。
第一类VMM | 第二类VMM | |
---|---|---|
对物理资源的控制权 | 直接运行在硬件之上,能直接控制和分配物理资源 | 运行在Host OS之上,依赖于Host OS为其分配物理资源 |
资源分配方式 | 在安装Guest OS时,VMM要在原本的硬盘上自行分配存储空间 | GuestOS 拥有自己的虚拟磁盘,该盘实际上是Host OS 文件系统中的一个大文件。GuestOS分配到的内存是虚拟内存 |
性能 | 性能更好 | 性能更差,需要HostOS作为“中介” |
可支持的虚拟机数量 | 更多,不需要和 Host OS 竞争资源,相同的硬件资源可以支持更多的虚拟机 | 更少,Host OS 本身需要使用物理资源,Host OS 上运行的其他进程也需要物理资源 |
虚拟机的可迁移性 | 更差 | 更好,只需导出虚拟机镜像文件即可迁移到另一台HostOS 上,商业化应用更广泛 |
运行模式 | 第一类VMM运行在最高特权级(Ring O),可以执行最高特权的指令。 | 第二类VMM部分运行在用户态、部分运行在内核态。GuestOS 发出的系统调用会被 VMM 截获, 并转化为 VMM 对 HostOS 的系统调用 |
6.2 虚拟化(选)
- 1 CPU虚拟化
- 2 内存虚拟化
- 3 I/O虚拟化
6.2.1 CPU虚拟化
虚拟机作为用户态的一个进程运行,不允许执行(Popek-Goldberg意义上的)敏感指令。然而,虚拟机上的操作系统认为自己运行在内核态(实际上不是)。我们称之为虚拟内核态(virtual kernel mode)。虚拟机中也运行用户进程,这些用户进程认为自己运行在用户态(实际上确实是的)。

当(认为自己处于内核态的)客户操作系统执行了一条只有CPU真正处于内核态才允许执行的指令时, 发生了什么?通常,在不支持VT的CPU上,这条指令执行失败并导致操作系统崩溃。在支持VT的CPU上, 客户操作系统执行敏感指令时,会陷人虚拟机管理程序。虚拟机管理程序可以检查这条指令是由虚拟机中的客户操作系统执行的还是用户程序执行的。如果是前者,虚拟机管理程序将安排这条指令功能的正确执行。否则,虚拟机管理程序将模拟真实硬件面对用户态执行敏感指令时的行为。
虚拟机管理程序确保客户操作系统中的敏感指令不再执行,具体做法是代码改写,一次改写一个基本块。基本块(basic block)是以转移指令结尾的一小段顺序指令序列,除最后一条指令外,内部不含跳转、调用、陷人、返回或其他改变控制流的指令。在执行一个基本块之前,虚拟机管理程序扫描该基本块以寻找(Popek-Goldberg意义上的)敏感指令,如果存在,就替换成调用虚拟机管理程序中处理例程的指令。最后一条转移指令也会被替换成调用虚拟机管理程序的指令,以确保下一基本块能重复此过程。
6.2.2 内存虚拟化
对每台虚拟机,虚拟机管理程序都需要创建一个影子页表(shadow page table),将虚拟机使用的虚拟页映射到它分配给虚拟机的实际物理页上。
为了避免处理影子页表的巨大开销,芯片生产商添加了嵌套页表(nested page table)的硬件支持。 嵌套页表是AMD使用的术语,Intel将其称作EPT (extended page table,扩展页表)。两者目的相似,都是在无需陷入的情况下由硬件处理虚拟化引发的额外页表操作,以降低开销。有趣的是,Intel x86硬件的第一代虚拟化扩展不支持内存虚拟化。虽然VT避免了很多CPU虚拟化中的瓶颈,但页表操作仍然有很大开销。AMD和Intel花了几年时间才生产出能有效虚拟化内存的硬件。
即使没有虚拟化,操作系统仍然维护虚拟页与物理页之间的映射。硬件在这些页表查找虚拟地址对应的物理地址。加入虚拟机之后只需额外增加一层映射。例如,假设需要将Xen或VMware ESX Server 等第一类虚拟机管理程序上运行的Linux进程的虚拟地址翻译成物理地址。除了客户机虚拟地址(guest virtual address)之外,还有客户机物理地址(guest physical address)和宿主机物理地址(host physical address,又作machine physical address)。我们已经看到,如果没有EPT,虚拟机管理程序负责显式维护影子页表。有了EPT,虚拟机管理程序仍然有一套额外的页表,但CPU能处理其中的大量中间操作。在我们的例子中,硬件首先查找客户机虚拟地址到客户机物理地址的“普通”页表,就像没有虚拟化时的做法那样。区别是硬件还查找扩展(或嵌套)页表以找到宿主机物理地址,而无须软件干预。每次访问客户机物理地址时都要进行此操作。

内存回收
称作气球(ballooning)的技术。一个小的气球模块作为伪设备驱动程序加载到每个虚拟机中,与虚拟机管理程序通信。气球模块在虚拟机管理程序的请求下可以通过申请锁定页面来膨胀,也可以通过释放这些页面而紧缩。气球膨胀,客户机的实际可用物理内存减少,客户操作系统将以换出最不重要页面的方式响应这一变化,正如期望的那样。反过来,气球紧缩,客户机可用内存增加。虚拟机管理程序让操作系统来帮它作决定。
参考资料
计算机操作系统慕课版 汤小丹 王红玲 姜华 汤子瀛 编著
现代操作系统(原书第4版)/(荷)安德鲁 S.塔嫩鲍姆(Andrew S. Tanenbaum),(荷) 赫伯特•博斯(Herbert Bos)著;陈向群等译,一北京:机械工业出版社,2017.7 (计算机科学丛书) 书名原文
Operating Systems, Fourth Edition