常见的操作系统结构有整体式结构、层次式结构、微内核(客户/服务器)结构等。下面对这些常见的操作系统结构做简要的介绍。
整体式结构
这是早期操作系统设计中所采用的方法,即首先确定操作系统的总体功能,然后将总功能分解为若干个子功能,实现每个子功能的程序称为模块。再按照功能将上述每个大模块分解为若干个较小的模块,如此下去,直至每个模块仅包含单一功能或紧密联系的小功能为止,即分解为最基本的模块为止。最后通过接口将所有模块连接起来形成一个整体。我们把这种操作系统的结构称之为模块组合结构。它的主要优点是,结构紧密,接口简单直接,系统效率较高。此时,操作系统是一个有多种功能的系统程序,可以看成是一个整体模块,也可看成是由若干个模块按一定的结构方式组成的。模块组合法(或称无序模块法、模块接口法等)中,系统中的模块不是根据程序和数据本身的特性而是根据它们完成的功能来划分的,数据基本上作为全程量使用。在系统内部,不同模块的程序之间可以不加控制地互相调用和转移,信息的传递方式也可以根据需要随意约定,因而可能造成模块间的循环调用。
模块组合法的缺点有以下三点。
第一,模块间转接随便,各模块互相牵连,独立性差,系统结构不清晰。
第二,数据基本上作为全程量处理,系统内所有模块的任一程序均可对其进行存取和修改,从而造成了各模块间有着更为隐蔽的关系。要更换一个模块或修改一个模块都比较困难,因为要弄清各模块间的接口,按当初设计时随意约定的格式来给信息,这是一件相当复杂的事。
第三,由于模块组合结构常以大型表格为中心,为保证数据完整性,往往采用全局封中断办法,从而限制了系统的并发性。系统中实际存在的并发生也未能抽象出明确的概念,缺乏规格的描述方法。所以,这种结构的可适应性比较差模块组合法关键在于“接口”,因为把各基本模块之间的有机联结都推到“接口”上去了,所以无须太多的结构设计工作,很快就可进入编码阶段,而且模块之间转接的灵活性使得系统具有效率髙的优点。但是,由于各基本模块之间可以任意相互调用,各模块之间相互依赖,甚至可能构成循环,形成一个复杂的网络。这种网络实际上是一种相当复杂的有向图,它使得难于对结构做出综合性的观察,也难于对系统做局部性修改,因而可靠性、易读性和适应性都很难得到保证。随着系统规模的不断增大,采用这种结构构造的系统的复杂性迅速增长,以致人们难以驾驭,这就促使人们去寻求新的结构概念和新的结构设计方法。
层次式结构
从对整体式结构缺点的分析可以看到,要克服整体式结构的缺点,就必须减少各模块之间毫无规则地互相调用、相互依赖的关系,特别是循环调用现象。层次式结构正是从这点出发,力求使模块间调用的无序性变为有序性。因此所谓层次式结构就是把操作系统的所有功能模块,按功能流图的调用次序,分别将这些模块排列成若干层,各层之间的模块只能是单向依赖或单向调用(如只允许上层或外层模块调用下层或内层模块)关系。这样不但操作系统的结构清晰,而且不构成循环。
在一个层次结构的操作系统中,若不仅各层之间是单向调用的,而且每一层中的同层模块之间不存在互相调用的关系,则称这种层次结构关系为全序的层次关系。
但是在实际的大型操作系统中,要建成一个全序的层次结构关系是十分困难的,往往无法完全避免循环现象,此时我们应使系统中的循环现象尽量减少。
层次结构法的优点是,它既具有模块接口法的优点—把复杂的整体问题分解成若干个比较简单的相对独立的成份,即把整体问题局部化,使得一个复杂的操作系统分解成许多多功能单一的模块。同时它又具有模块接口法不具有的优点,即各模块之间的组织结构和依赖关系清晰明了。这不但增加了系统的可读性和可适应性,而且还使我们对操作系统的每一步都建立在可靠的基础上。
因为层次结构是单向依赖的,上一层各模块所提供的功能(以及资源)是建立在下一层的基础上的。或者说上一层功能是下一层的扩充和延续。最内层是硬件基础——裸机,裸机的外层是操作系统的最下面(或内层)的第一层。按照分层虚拟机的观点,每加上一层软件就构成了一个比原来机器功能更强的虚拟机,也就是说进行了一次功能扩充。而操作系统的第一层是在裸机基础上进行的第一次扩充后形成的虚拟机,以后每增加一层软件就是在原虚拟机上的又一次扩充,又成为一个新的虚拟机。因此只要下层的各模块设计是正确的,就为上层功能模块的设计提供了可靠基础,从而增加了系统的可靠性。层次式结构的优点还在于很容易对操作系统增加或替换掉一层而不影响其他层次。不难理解,采用层次结构法设计的操作系统具有易于调试、易于修改、易于扩充、易于维护、易于保证正确性等优点。因而被广泛地采用。分层次式结构的操作系统的各功能模块应放在哪一层,系统一共应有多少层,这是一个很自然的会提出的问题。但对这些问题通常并没有一成不变的规律可循,必须要依据总体功能设计和结构设计中的功能流图和数据流图进行分层,大致的分层原则如下。
- 为了增加操作系统的可适应性,并且方便于将操作系统移植到其他机器上,必须把与机器特点紧密相关的软件,如中断处理、输入输出管理等放在紧靠硬件的最低层。这样经过这层软件扩充后的虚拟机,硬件的特性就被隐藏起来了,方便了操作系统的移植。为了便于修改移植,它把与硬件有关和与硬件无关的模块截然分开,而把与硬件有关的BIOS(管理输入输出设备)放在最内层。所以当硬件环境改变时只需要修改这一层模块就可以了。
- 对于一个计算机系统来说,往往具有多种操作方式(例如既可在前台处理分时作业,在后台以批处理方式运行作业,也可进行实时控制),为了便于操作系统从一种操作方式转变到另一种操作方式,通常把三种操作方式共同要使用的基本部分放在内层,而把随三种操作方式而改变的部分放在外层:如批作业调度程序和联机作业调度程序,键盘命令解释程序和作业控制语言解释程序等,这样操作方式改变时仅需改变外层,内层部分保持不变。
- 当前操作系统的设计都是基于进程的概念,进程是操作系统的基本成份。为了给进程的活动提供必要的环境和条件,因此必须要有一部分软件—系统调用的各功能,来为进程提供服务,通常这些功能模块(各系统调用功能)构成操作系统内核,放在系统的内层。内中又分为多个层次,通常将各层均要调用的那些功能放在更内层。
在操作系统的层次式结构研究和应用中,还演化出几种不同的层次式结构,如进程分层结构、层次管程结构、虚拟机结构等等,限于篇幅,就不在这里介绍了。
微内核(客户/服务器)结构
当前计算机技术发展的突出特点是要求广泛的信息和资源的共享。所以,分布式处理合乎客观实际和新的应用需要。在这样的应用环境下,操作系统的体系结构也在发展和变化。采用客户/服务器结构的操作系统就适宜于应用在网络环境下分布式处理的计算环境中。由于这种体系结构所具有的一些特征,它又被称为微内核体系结构。
采用客户/服务器结构模式的典型操作系统有卡内基·梅隆大学研制的Mach操作系统和 Windows NT的早期版本。它们的共同特点如下
- 运行在核心态的内核:内核提供所有操作系统基本都具有的操作,如线程调度、虚拟存储、消息传递、设备驱动以及内核的原语操作集和中断处理等。这些部分通常采用层次结构并构成了基本操作系统。因为这时的内核只提供了一个很小的功能集合,所以通常又称为微内核。
- 运行在用户态的并以客户/服务器方式运行的进程层:除内核部分外,操作系统所有的其他部分被分成若干个相对独立的进程,每一个进程实现一组服务,称为服务进程(用户应用程序对应的进程,虽然也以客户/服务器方式活动于该层,但不作为操作系统的功能构成成份看待)。这些服务进程可以提供各种系统功能、文件系统服务以及网络服务等。服务进程的任务是检查是否有客户机提出要求服务的请求,并在满足客户机进程的请求后将结果返回。而客户机可以是一个应用程序,也可以是另一个服务进程。客户机进程与服务器进程之间的通信是采用发送消息进行的,这是因为每个进程属于不同的虚拟地址空间,它们之间不能直接通信,必须通过内核进行,而内核则是被映射到每个进程的虚拟地址空间内的,它可以操纵所有进程。客户机进程发出消息,内核将消息传给服务进程。服务进程执行相应的操作,其结果又通过内核用发消息方式返回给客户机进程,这就是客户/服务器的运行模式。
这种模式的优点在于,它将操作系统分成若干个小的并且自包含的分支(服务进程),每个分支运行在独立的用户进程中,相互之间通过规范一致的方式接收发送消息而联系起来。操作系统在内核中建立起了最小的机制,而把策略留给用户空间中的服务进程,这带来了很大的灵活性,直接的好处如下。
- 可靠:由于每个分支是独立的自包含的(分支之间耦合最为松散),所以即使某个服务器失败或产生问题,也不会引起系统其他服务器和系统其他组成部分的损坏或崩溃。
- 灵活:便于操作系统增加新的服务功能,因为它们是自包含的,且接口规范。同时修改一个服务器的代码不会影响系统其他部分,可维护性好。
- 适宜于分布式处理的计算环境:因为不同的服务可以运行在不同的处理器或计算机上,从而使操作系统自然地具有分布式处理的能力。
当然这种体系结构也有它的缺陷,主要是对于效率的考虑。因为所有的用户进程只能通过微内核相互通信,微内核本身就成为系统的瓶颈,在一个通信很频繁的系统中,微内核往往不能提供很好的效率。例如高性能的图形用户界面系统中经常有大量的数据在不同的进程中来回复制,那么把图形引擎作为一个运行在用户态的服务进程对一个有着高性能图形需求的系统来说将是不明智的选择。