操作系统的体系结构

操作系统体系结构概述

操作系统理论研究者有时把操作系统分成四大部分:

  1. 驱动程序 - 最底层的、直接控制和监视各类硬件的部分,它们的职责是隐藏硬件的具体细节,并向其他部分提供一个抽象的、通用的接口。
  2. 内核 - 操作系统之最内核部分,通常运行在最高特权级,负责提供基础性、结构性的功能。
  3. 支承库 - (亦作“接口库”)是一系列特殊的程序库,它们指责在于把系统所提供的基本服务包装成应用程序所能够使用的编程接口(API),是最靠近应用程序的部分。例如,GNU C运行期库就属于此类,它把各种操作系统的内部编程接口包装成ANSI C和POSIX编程接口的形式。
  4. 外围 - 所谓外围,是指操作系统中除以上三类以外的所有其他部分,通常是用于提供特定高级服务的部件。例如,在微内核结构中,大部分系统服务,以及UNIX/Linux中各种守护进程都通常被划归此列。

当然,本节所提出的四部结构观也绝非放之四海皆准。例如,在早期的微软视窗操作系统中,各部分耦合程度很深,难以区分彼此。而在使用外核结构的操作系统中,则根本没有驱动程序的概念。因而,本节的讨论只适用于一般情况,具体特例需具体分析。 操作系统中四大部分的不同布局,也就形成了几种整体结构的分野。常见的结构包括:简单结构、层结构、微内核结构、垂直结构、和虚拟机结构。

操作系统在整个计算机体系结构中处于裸机的上一层,也是第一层软件,是计算机系统的核心软件,它负责管理整个计算机系统的各种软、硬件资源,合理组织工作流程,并为用户提供方便使用的接口。那么,操作系统本身是如何组织的呢? 这则是操作系统体系结构解决的问题,不同体系结构的操作系统,又具有不同的实现及特点。 从操作系统的发展来看,采用的体系结构一般有4 种:

1. 整体结构

实质上是没有结构,整个操作系统由若干的具有一定独立功能的过程组成,过程和过程之间可以根据需要按事先定义的接口相互进行调用。这种结构虽然简单,但不利于操作系统的功能扩充。当用户程序请求系统服务时,进行系统调用,这时,系统工作状态从用户态转到核心态,接着核心根据系统调用的参数决定调用的系统服务过程,这个系统服务过程有可能还需要调用多个其他的系统公用例程,从而完成用户请求的服务。

2. 分层结构

操作系统按一定的功能模块分层组织,最高层为用户程序,最底层为处理机调度及实现多道程序,并且下一层是相邻上一层的基础,层与层之间有严格的接口定义,只在相邻层之间发生交互。这样组织的好处在于有利于操作系统的设计与实现,但困难之处在于每一层的划分不易,并且效率不如其他的结构好,由于相邻层间有很多交互,安全性很难得到保证。当用户程序进行系统调用时,如果请求的是较低层的服务,则这个系统调用会从最高层往下逐层进行相应的调用,每经过一层,参数都会被重新封装,直到能够完成相应功能的那层调用,最终实现系统服务。

3. 虚拟机结构

这种结构更倾向于是一种技术即虚拟机技术。它以运行在裸机上的核心软件(虚拟机监控软件/ 或某一种操作系统) 为基础,向上提供虚拟机的功能,每个虚拟机都像是裸机硬件的一个拷贝。在不同的虚拟机上可以安装不同的操作系统。这样的系统可以有更好的兼容性和安全性, 例如在网络应用中,只要装上J ava 虚拟机,就可以非常方便地运行J ava 的字节代码。当应用程序在虚拟机上运行并进行系统调用时,先由虚拟机的用户态转入虚拟机核心态,再进一步向虚拟机监控软件发出正常的系统调用加以执行,从而完成用户程序的服务请求。

4. C / S 结构(微内核结构)

这是基于网络的一种内核结构,适用于分布式操作系统的设计,而在单个计算机中,也可称作微内核结构。这种结构的思想是尽量减小运行于核心态下的内核,将操作系统的一些传统功能作为服务器进程在用户态下运行,内核更多的是在多个服务器进程间以及用户进程与服务器进程间进行消息传递。这样的系统具有更好的可扩展性、可移植性、可靠性及灵活性,由于消息传递需要时间,所以比单内核系统速度慢些。当用户进程进行系统调用请求系统服务时,用户进程转入核心态运行, 此时,内核将用户的请求以消息的形式发送给相应的服务器进程,并将服务器进程返回的信息以消息的形式传送给用户进程。

典型内核范例

1. 传统的UNIX 内核

传统的UNIX 内核采用整体式体系结构,用模块结构加以实现,其内核结构如图所示。

Os-schema.gif 图:传统的UNIX 内核体系结构

用户可以直接通过系统调用或库函数调用请求操作系统内核服务,即由系统调用接口提供对高层软件的支持,而在内核的最底层模块则提供与硬件交互的接口。在两个接口中间有两个重要的子系统:进程控制和文件管理,其中,进程控制子系统除对进程本身进行创建,阻塞,撤销,唤醒等控制外,还包含了进程高级,低级通信, 处理机调度及存储管理等功能模块;而文件管理子系统除实现本身的文件管理的功能外,还包含I/ O 管理模块,当然,要实现I/ O 功能,还需要相应的设备驱动程序的支持。这样的整体式内核,具有惟一地址空间,并且整个内核作为一个单独的进程运行,内核的所有功能模块都可以访问内部的所有数据结构及例程,如果操作系统的任何部分有所改变,整个内核都必须重新编译,链接,安装及重新启动,这样对于操作系统的扩充及改善都不方便,尤其随着硬件设备及文件系统的变化及发展,这个问题会显得特别突出,使得操作系统的内核体系结构不得不进行相应的调整,以适应现代操作系统的要求。

2. Linux 体系结构

随着操作系统的不断发展,其内核的设计也有了新的变化,因此,传统的UNIX 也出现了很多不同的实现版本,其中,Linux 就是其中一个具有很好的代表性以及广阔的发展前景的开放源码的操作系统,其内核结构如图2 所示

Linux.jpg

Linux 与大部分UNIX一样仍然采用单内核体系结构,即它是由几个逻辑功能上不同的部分组合而成的大程序,与UNIX 不同之处在于它使用“模块”来弥补纯粹的单一内核的缺点,即采用模块实现机制。这种机制进一步精简内核,内核只包括同步原语、简单的进程调度及进程间通信机制等功能,而将文件系统,设备驱动程序等属于内核上层的功能用模块加以实现。

在此,模块是在运行时能够被动态链接到内核的目标文件,当然,它也可从内核中动态地移出,一旦对系统进行修改或扩充,无须重新编译整个内核,只需对模块进行修改或添加。与Windows 2000 采用的微内核体系结构不同之处在于,这些模块不是作为独立的进程在用户态下运行,而是与其他静态链接到内核的功能一样在核心态下运行,这样,就可以无须花费在微内核体系结构中所需的消息传递的时间及相应的系统开销,避免了由于缩小内核而带来的性能损失。既然模块与内核一样都运行在核心态下,那么,哪些功能放在内核实现,哪些又放在模块中实现呢?

在Linux 系统中,重要的功能如进程管理、内存管理等都放在内核加以实现;而如各种驱动程序、文件系统等则用模块加以实现。当然,模块机制的引入也会带来一些问题。 #首先,运行在核心态的内核是不会换出的,所以链接进内核的模块就会占用一定的内存和花费一定的系统开销; #其次,由于链接入内核的模块可以访问内核的所有资源,并且该模块有可能请求其他模块的功能,这样,内核就必须维护符号表及模块之间的依赖性; #最后,链入内核的模块也会成为内核的一部分,也可以对内核进行修改,因此,使用不当会导致系统瘫痪。

3. Windows 2000 体系结构

Windows 2000 采用基于微内核的体系结构,微内核体系结构基本思想遵循C/ S 的体系结构,将最基本的服务和应用放在微内核中,而其他如:设备驱动程序、文件系统、虚拟存储、窗口系统和安全系统则放在内核之外以服务进程的形式加以实现。但是,由于微内核要对消息进行构造、发送和接收、解析,因此花费的时间比进行一次系统调用的时间还多,性能也有损失,为了解决这个问题, Windows 2000 把一些较关键的服务程序的驱动程序放在内核加以实现,这样即使增大了微内核,但换来了性能的提高。其结构如图 所示。

win2000.gif

在图 中,首先来看运行于核心态下的扩充了的内核。它包括4 个组成部分:

  1. 管理进程,它用以完成操作系统的普通功能,如存储管理、进程和线程管理、I/ O 管理、安全机制及进程间通信;第二,内核,它完成操作系统的线程调度、中断及陷入处理、多处理机同步等最基本的功能,除此以外,还要为上层软件(管理进程) 提供可调用的例程及对象;第三,硬件抽象层,它负责使内核及管理进程与具体的硬件独立开来,实现硬件平台的无关性,从而使系统具有更好的可移植性和兼容性;第四,窗口管理及图形驱动,负责向用户提供一个图形化的交互界面。接着,运行于用户态的系统组成部分:第一,系统支撑进程,对用户登陆及交互进行管理,它不是一个服务进程,它可以通过特定的一些接口与运行于内核态的管理进程交互,以实现系统的安全机制;
  2. 进行Win32 服务的服务进程,它可以进行任务调度,一些Windows 2000 的服务器应用程序,如MS SQL服务器及交换服务器都包含了这样的服务进程;
  3. 用户的应用进程,它是运行于用户态下的按用户需要编制的应用程序;
  4. 环境子系统,通过一系列的可调用功能向应用程序提供本地的操作系统服务,即实现在Windos 2000 上能够运行在其他不同的操作系统上开发的应用程序的功能,Windos 2000 装载有3 个环境子系统:Win32 、POSIX 和OS/ 2 ,它们分别以独立的进程运行于用户态下。另外,环境子系统利用Windows 2000 的本地过程调用(L PC) 为用户进程请求内核服务,但它禁止应用程序交叉调用不同环境子系统的API 函数。这些实现都保证了Windos 2000 的可靠性和高效性。
  5. Win32 子系统,它也是运行于用户态下的一个独立的进程,它是一个特殊的环境子系统,它提供若干的动态链接库,是系统提供给用户态执行进程请求系统服务的系统接口。如上所述的Windows 2000 的内核体系结构,虽然内核比起纯的微内核体系结构有所扩充,系统效率却有了很大的提高,并且在安全性,可靠性,兼容性,可移植性等方面比Windows 2000 以前版本的操作系统也有所改善。

操作系统的体系结构 (2008-07-01 06:09:22由czk编辑)