CoderMrWu

生活诚可期,爱情价更高!

操作系统的结构设计以及结构层次

该文章转载于自考库,如有侵权,请联系删除!

三、操作系统的结构设计

任何事物都有其内部的结构。结构是构成一个事物内部的各种基本成份以及这些基本成份之间的关系。

软件同样有内部结构。为了设计和掌握一个复杂的大型软件系统,设计者总是要将它分解成若干个小的相对独立的成份。这样,对每一个成份就比较容易掌握,而且这种分解往往使得各个成份之间的联系较为简单。软件结构研究的对象主要是组成软件的各部分划分的原则以及它们之间的关系(即通信),简言之,就是软件的构成法则和组合方法。对软件结构的探讨是从 Dijkstra提出的结构化程序设计思想开始的,经过了若干年的研究及实践已经取得了很大进展。

1、操作系统结构设计的重要性

操作系统是一种大型软件,为了研制操作系统,必须研究分析它的结构,也就是要考虑如何把一个大型软件划分成若干较小的模块,以及这些模块之间怎样接口。操作系统是一个具有并发特性的大型程序,模块间的接口是相当复杂的,信息交换也是十分频繁的,因而对结构的研究就显得更加重要了。而任何一个软件开发出来投入运行之后,就进入了系统维护阶段。只有易读、易懂,维护人员才能真正了解操作系统的结构和工作原理,从而做好系统维护工作。

所谓操作系统的结构,是指操作系统各部分程序的存在方式及相互关系。若操作系统的各部分程序以程序模块方式存在,相互之间通过调用建立起关系,那么这种操作系统具有模块接口结构。若各部分程序以进程的方式存在,相互之间通过通信建立起关系,那么这种操作系统具有进程结构。若操作系统能按照诸模块的调用顺序或主进程的信息发送顺序把模块进程分层,各层之间只能单向依赖,这样就分别产生了模块层次结构的操作系统或进程层次 结构的操作系统。

在早期的操作系统设计中,由于计算机结构比较简单,系统规模也较小,逻辑关系较简单,设计者往往只注重功能设计和效率,而忽视了结构的设计。但随着计算机结构的复杂化,应用范围的不断扩大,使用要求的不断提高,人们不仅要求系统有较强的功能,而且要求系统有较强的可适应性和可靠性。比如,在容错的概念出现之后,人们希望设计一种在部分硬、软件失效的情况下仍能正常工作的系统,从事这种容错操作系统的设计,更加需要对操作系统的结构有深入的研究和认识。

可见,无论设计哪一种操作系统,都需要对操作系统的结构和结构设计方法进行研究。近年来,对操作系统的结构和结构设计方法的研究,已成为软件领域的一个重要研究方面。

2、操作系统结构研究的目标

可以用下面三条来概括操作系统结构研究的目标。

1)系统模块化

2)模块标准化

3)通信规范化

前文已经介绍过,对一个大系统来说,为了分解其复杂性,总是把它分解为相对独立的成份,这样对每一个小的成份就比较容易掌握(必要时再分解),而且要使每个成份之间的联系尽量简单,这些成份就是构成系统的“模块”。

究竟什么是模块呢?非形式化、直觉的认识就是具有一定功能的程序块,这个定义并不严格。把程序分解成模块是很自然的想法,一个模块中可以包含一个或多个程序段落,但是什么算一个模块,怎样分解系统为模块,定义并没有进一步的说明。

随着硏究的深入,模块的概念也进一步严格化,新的理解将模块看作一组数据结构以及定义在这组数据结构上的一组操作。对模块的访问只能通过这些操作来完成,这称之为信息隐蔽。如果模块具有并发的特性,那么这些操作将要互斥地执行。

具体来讲模块内的操作的对象就是模块内的数据结构,如同加减乘除一样,它们操作的对象不同,含义也不尽相同。从结构化方法的角度看,操作就是对一组数据进行加工,成为一组输出数据,所以一般来讲操作只有一个入口和一个出口。例如一个管理缓冲的模块,有两个操作:送操作和取操作。

目前的计算机语言大都是模块化的,它们反映了程序和数据的局部化,强调了功能对实现的抽象,模块的调用者只需要知道模块的功能,而不需要知道模块的实现细节。

模块标准化指两方面的内容:

一是标准设计,作到模块规格划一,遵循相同的模块构造准则符合一定的模块(构件)标准;

二是需要总结、提炼操作系统的基本成份,然后把这些基本成份定型化、模块化,即把反应操作系统本质的一些程序成份固定下来变成“标准件”“构件”或者说构建操作系统的“积木”。

通信规范化主要是指模块之间的接口应该清晰划一,模块的联系方式要统一,这是标准化的一种方式。例如,对于模块间的顺序关系,通信的方法一般使用直接调用;而对于并行的模块之间,通信通常使用原语。而通信的规范化表明系统各个并行的模块之间的通信联系只通过数目有限的原语来实现。

四、操作系统的结构

常见的操作系统结构有整体式结构、层次式结构、微内核(客户/服务器)结构等。下面对这些常见的操作系统结构做简要的介绍。

1、整体式结构

这是早期操作系统设计中所采用的方法,即首先确定操作系统的总体功能,然后将总功能分解为若干个子功能,实现每个子功能的程序称为模块。再按照功能将上述每个大模块分解为若干个较小的模块,如此下去,直至每个模块仅包含单一功能或紧密联系的小功能为止,即分解为最基本的模块为止。最后通过接口将所有模块连接起来形成一个整体。我们把这种操作系统的结构称之为模块组合结构。它的主要优点是,结构紧密,接口简单直接,系统效率较高。此时,操作系统是一个有多种功能的系统程序,可以看成是一个整体模块,也可看成是由若干个模块按一定的结构方式组成的。

模块组合法(或称无序模块法、模块接口法等)中,系统中的模块不是根据程序和数据本身的特性而是根据它们完成的功能来划分的,数据基本上作为全程量使用。在系统内部,不同模块的程序之间可以不加控制地互相调用和转移,信息的传递方式也可以根据需要随意约定,因而可能造成模块间的循环调用。

模块组合法的缺点有以下三点。

第一,模块间转接随便,各模块互相牵连,独立性差,系统结构不清晰。

第二,数据基本上作为全程量处理,系统内所有模块的任一程序均可对其进行存取和修改,从而造成了各模块间有着更为隐蔽的关系。要更换一个模块或修改一个模块都比较困难,因为要弄清各模块间的接口,按当初设计时随意约定的格式来给信息,这是一件相当复杂的事。

第三,由于模块组合结构常以大型表格为中心,为保证数据完整性,往往采用全局封中断办法,从而限制了系统的并发性。系统中实际存在的并发生也未能抽象出明确的概念,缺乏规格的描述方法。所以,这种结构的可适应性比较差。

模块组合法关键在于“接口”,因为把各基本模块之间的有机联结都推到“接口”上去了,所以无须太多的结构设计工作,很快就可进入编码阶段,而且模块之间转接的灵活性使得系统具有效率高的优点。但是,由于各基本模块之间可以任意相互调用,各模块之间相互依赖,甚至可能构成循环,形成一个复杂的网络。这种网络实际上是一种相当复杂的有向图,它使得难于对结构做岀综合性的观察,也难于对系统做局部性修改,因而可靠性、易读性和适应性都很难得到保证。随着系统规模的不断增大,采用这种结构构造的系统的复杂性迅速增长,以致人们难以驾驭,这就促使人们去寻求新的结构概念和新的结构设计方法。

2、层次式结构

从对整体式结构缺点的分析可以看到,要克服整体式结构的缺点,就必须减少各模块之间毫无规则地互相调用、相互依赖的关系,特别是循环调用现象。层次式结构正是从这点出发,力求使模块间调用的无序性变为有序性。因此所谓层次式结构就是把操作系统的所有功能模块,按功能流图的调用次序,分别将这些模块排列成若干层,各层之间的模块只能是单向依赖或单向调用(如只允许上层或外层模块调用下层或内层模块)关系。这样不但操作系统的结构清晰,而且不构成循环。

在一个层次结构的操作系统中,若不仅各层之间是单向调用的,而且每一层中的同层模块之间不存在互相调用的关系,则称这种层次结构关系为全序的层次关系

但是在实际的大型操作系统中,要建成一个全序的层次结构关系是十分困难的,往往无法完全避免循环现象,此时我们应使系统中的循环现象尽量减少。

层次结构法的优点是,它既具有模块接口法的优点——把复杂的整体问题分解成若干个比较简单的相对独立的成份,即把整体问题局部化,使得一个复杂的操作系统分解成许多多功能单一的模块。同时它又具有模块接口法不具有的优点,即各模块之间的组织结构和依赖关系清晰明了。这不但增加了系统的可读性和可适应性,而且还使我们对操作系统的每一步都建立在可靠的基础上。

因为层次结构是单向依赖的,上一层各模块所提供的功能(以及资源)是建立在下层的基础上的。或者说上一层功能是下一层的扩充和延续。最内层是硬件基础——裸机,裸机的外层是操作系统的最下面(或内层)的第一层。按照分层虚拟机的观点,每加上一层软件就构成了一个比原来机器功能更强的虚拟机,也就是说进行了一次功能扩充。而操作系统的第一层是在裸机基础上进行的第一次扩充后形成的虚拟机,以后每增加一层软件就是在原虚拟机上的又一次扩充,又成为一个新的虚拟机。因此只要下层的各模块设计是正确的,就为上层功能模块的设计提供了可靠基础,从而增加了系统的可靠性。

层次式结构的优点还在于很容易对操作系统增加或替换掉一层而不影响其他层次。不难理解,采用层次结构法设计的操作系统具有易于调试、易于修改、易于扩充、易于维护、易于保证正确性等优点。因而被广泛地采用。

层次式结构的操作系统的各功能模块应放在哪一层,系统一共应有多少层,这是一个很自然的会提出的问题。但对这些问题通常并没有一成不变的规律可循,必须要依据总体功能设计和结构设计中的功能流图和数据流图进行分层,大致的分层原则如下。

1)为了增加操作系统的可适应性,并且方便于将操作系统移植到其他机器上,必须把与机器特点紧密相关的软件,如中断处理、输入输出管理等放在紧靠硬件的最低层。这样经过这层软件扩充后的虚拟机,硬件的特性就被隐藏起来了,方便了操作系统的移植。为了便于修改移植,它把与硬件有关和与硬件无关的模块截然分开,而把与硬件有关的BIOS(管理输入输出设备)放在最内层。所以当硬件环境改变时只需要修改这一层模块就可以了。

2)对于一个计算机系统来说,往往具有多种操作方式(例如既可在前台处理分时作业,又可在后台以批处理方式运行作业,也可进行实时控制),为了便于操作系统从一种操作方式转变到另一种操作方式,通常把三种操作方式共同要使用的基本部分放在内层,而把随三种操作方式而改变的部分放在外层:如批作业调度程序和联机作业调度程序,键盘命令解释程序和作业控制语言解释程序等,这样操作方式改变时仅需改变外层,内层部分保持不变。

3)当前操作系统的设计都是基于进程的概念,进程是操作系统的基本成份。为了给进程的活动提供必要的环境和条件,因此必须要有一部分软件——系统调用的各功能,来为进程提供服务,通常这些功能模块(各系统调用功能)构成操作系统内核,放在系统的内层。内中又分为多个层次,通常将各层均要调用的那些功能放在更内层,如图1-12所示。

在操作系统的层次式结构研究和应用中,还演化出几种不同的层次式结构,如进程分层结构、层次管程结构、虚拟机结构等等,限于篇幅,就不在这里介绍了。

3、微内核(客户/服务器)结构

当前计算机技术发展的突出特点是要求广泛的信息和资源的共享。所以,分布式处理合乎客观实际和新的应用需要。

在这样的应用环境下,操作系统的体系结构也在发展和变化。采用客户/服务器结构的操作系统就适宜于应用在网络环境下分布式处理的计算环境中。由于这种体系结构所具有的些特征,它又被称为微内核体系结构。

采用客户/服务器结构模式的典型操作系统有卡内基·梅隆大学研制的Mach操作系统和 Windows NT的早期版本。它们的共同特点如下。

1)运行在核心态的内核:内核提供所有操作系统基本都具有的操作,如线程调度、虚拟存储、消息传递、设备驱动以及内核的原语操作集和中断处理等。这些部分通常采用层次结构并构成了基本操作系统。因为这时的内核只提供了一个很小的功能集合,所以通常又称为微内核。

2)运行在用户态的并以客户服务器方式运行的进程层:除内核部分外,操作系统所有的其他部分被分成若干个相对独立的进程,每一个进程实现一组服务,称为服务进程(用户应用程序对应的进程,虽然也以客户/服务器方式活动于该层,但不作为操作系统的功能构成成份看待)。这些服务进程可以提供各种系统功能、文件系统服务以及网络服务等。服务进程的任务是检查是否有客户机提出要求服务的请求,并在满足客户机进程的请求后将结果返回。而客户机可以是一个应用程序,也可以是另一个服务进程。客户机进程与服务器进程之间的通信是采用发送消息进行的,这是因为每个进程属于不同的虚拟地址空间,它们之间不能直接通信,必须通过内核进行,而内核则是被映射到每个进程的虚拟地址空间内的,它可以操纵所有进程。客户机进程发出消息,内核将消息传给服务进程。服务进程执行相应的操作,其结果又通过内核用发消息方式返回给客户机进程,这就是客户/服务器的运行模式。

这种模式的优点在于,它将操作系统分成若干个小的并且自包含的分支(服务进程),每个分支运行在独立的用户进程中,相互之间通过规范一致的方式接收发送消息而联系起来。操作系统在内核中建立起了最小的机制,而把策略留给用户空间中的服务进程,这带来了很大的灵活性,直接的好处如下。

1)可靠:由于每个分支是独立的自包含的(分支之间耦合最为松散),所以即使某个服务器失败或产生问题,也不会引起系统其他服务器和系统其他组成部分的损坏或崩溃。

2)灵活:便于操作系统增加新的服务功能,因为它们是自包含的,且接口规范。同时修改一个服务器的代码不会影响系统其他部分,可维护性好。

3)适宜于分布式处理的计算环境:因为不同的服务可以运行在不同的处理器或计算机上,从而使操作系统自然地具有分布式处理的能力。

当然这种体系结构也有它的缺陷,主要是对于效率的考虑。因为所有的用户进程只能通过微内核相互通信,微内核本身就成为系统的瓶颈,在一个通信很频繁的系统中,微内核往往不能提供很好的效率。例如高性能的图形用户界面系统中经常有大量的数据在不同的进程中来回复制,那么把图形引擎作为一个运行在用户态的服务进程对一个有着高性能图形需求的系统来说将是不明智的选择。

点赞