操作系统设计与实现

操作系统设计与实现

操作系统结构

整体结构

​ 整体结构是一组函数的集合,其中每个函数在需要时可以取调用任意其他函数而不受任何约束。

​ 操作系统通过的服务(系统调用)的请求过程:向将参数放入预先确定的地方(如寄存器或栈),然后执行一条特殊的陷阱指令,即访管程序调用(supervisor call)指令或内核调用(kernel call)指令。该指令将CPU从用户态切换到内核态,并将控制权交给操作系统。

​ 大多数CPU有两种状态,即用户态和内核态。内核态供操作系统使用,在该状态下可以执行所有指令;用户态供用户程序使用,在该状态下不能执行I/O操作和其他一些操作。

​ 举例系统调用执行过程:

1
count = read(fd, &buffer, nbytes);

1.16

​ 整体结构组织结构提出了操作系统的一种基本结构:

  1. 一个主程序,用来调用被请求的服务例程。

  2. 一组服务例程,用来实现相应的系统调用。

  3. 一组工具函数,用来帮助服务例程的实现。

    ​ 该模型结构如下:

    Nr5vXd.png

分层结构

​ 分层结构将整个系统组织成一个层次结构,每一层软件都是在它的下层软件的基础上构造起来的。

虚拟机

​ 时分系统应该提供两个特性:

​ (1)多道程序;

​ (2)应该扩展机,其提供比裸机更方便的编程接口。

​ 系统核心是一个虚拟机监控程序,它在裸机上运行并具备多道程序功能。它向上层提供了若干台虚拟机。虚拟机不是具有文件等良好特性的扩展机,而仅仅是裸机的精确拷贝,包含有内核态/用户态、I/O功能、中断以及真实硬件所具有的所有内容。每台虚拟机与裸机完全一样,所以每台虚拟机上都可以运行任意一种操作系统。

​ 如下图:

Nys2NQ.png

​ 其中CMS是会话监控系统,VM/370是虚拟机系统。当一个CMS程序执行一条系统调用时,该调用陷入到其虚拟机的操作系统(即CMS),而不是VM/370,然后CMS发出正常的硬件I/O指令来读取它的虚拟磁盘或者做其他事情来完成此次系统调用。这些I/O指令被VM/370捕获,随后VM/370执行这些指针,作为对真实硬件的模拟的一部分。

外核

​ 在内核态下运行的最底层软件是一个称为外核的程序,其任务是为虚拟机分配资源并确保资源的使用不会发生冲突。每台用户层的虚拟机可以运行自己的操作系统。

客户-服务器模型

​ 为了获得某项服务,客户进程将请求发送给服务器进程,服务器进程随后完成此次操作并应答信息送回。如下图:

Ny6qp9.png

​ 内核的全部工作就是处理客户和服务器间的通信。操作系统被分割成许多部分,每一部分只处理一方面的功能,如文件服务、进程服务、终端服务或内存服务。

​ 这样带来的好处有三点:

​ (1)每一部分变得更小、更易于管理。

​ (2)所有服务器都是以用户进程形式运行,不是运行在内核态,所以不直接访问硬件。此时,如果在文件服务器中发生错误,那么文件服务可能崩溃,但不会导致整个系统的崩溃。

​ (3)适用于分布式系统。

​ 有些操作系统功能(如向物理I/O设备寄存器写入命令字)靠用户空间的程序是很难完成的。解决方式有两种:

​ (1)设立一些运行于内核态的专用服务器进程(如I/O设备驱动程序),它们能够访问所有的硬件设备,仍通过平常的消息机制与其他进程通信。

​ (2)在内核中设立一套最小的机制,而将策略留给用户空间中的服务器进程。如,内核可能将发往某个特定地址的消息理解为:取出该消息内容,并将其装入某个磁盘的I/O设备寄存器,从而启动一次读盘操作。此时,内核甚至不对消息的内容进行合法性检测,只是机械地复制到磁盘设备寄存器。驱动程序运行在用户空间,然后通过特殊的内核调用来请求读写i/O寄存器,或是访问内核消息。