早期OS的规模很小,完全可以由一个人以手工方式,用几个月的时间编制出一个OS。此时,编制程序基本上是一种技巧,OS是否是有结构的并不那么重要,重要的是程序员的程序设计技巧。但随着OS规模的逐渐扩大,其所具有的代码也越来越多,往往需要由数十人或数百人甚至更多的人参与,分工合作,共同完成操作系统的设计。这意味着,应采用工程化的开发方法来对大型软件进行开发。由此,产生了“软件工程学”。软件工程的目标是十分明确的,所开发出的软件产品应具有良好的软件质量和合理的费用,整个费用应能为用户所接受。软件质量可用功能性、有效性、可靠性、易使用性、可维护性和易移植性等来评价。为此,先后产生了多种操作系统的开发方法,如模块化方法、结构化方法和面向对象的方法等。利用不同的开发方法所开发出的操作系统将具有不同的操作系统结构。
1.5.1 传统操作系统结构
软件开发技术的不断发展,促进了OS结构的更新换代。这里,把早期的无结构OS(第一代)、模块化结构OS(第二代)和分层式结构OS(第三代)统称为传统结构OS,而把微内核结构OS称为现代结构OS。
1.无结构OS
在早期开发操作系统时,设计者只是把注意力放在功能的实现和获得高的效率上,缺乏首尾一致的设计思想。此时的OS是为数众多的一组过程的集合,每个过程可以任意地相互调用其他过程,致使操作系统内部既复杂又混乱。因此,这种OS是无结构的,也有人把它称为整体系统结构。
此时程序设计的技巧,只是如何编制紧凑的程序,以便于有效地利用内存。当系统不太大时,在一个人能够完全理解和掌握的情况下,问题还不是太大,但随着系统的不断扩大,所设计出的操作系统就会变得既庞大又杂乱。这一方面会使所编制出的程序错误很多,给调试工作带来很多困难;另一方面也使程序难以阅读和理解,增加维护人员的负担。
2.模块化结构OS
1)模块化程序设计技术的基本概念
模块化程序设计技术是20世纪60年代出现的一种结构化程序设计技术。该技术是基于“分解”和“模块化”原则来控制大型软件的复杂度。为使OS具有较清晰的结构,OS不再由众多的过程直接构成,而是将OS按其功能精心地划分为若干个具有一定独立性和大小的模块;每个模块具有某方面的管理功能,如进程管理模块、存储器管理模块、I/O设备管理模块等,并仔细地规定好各模块间的接口,使各模块之间能通过该接口实现交互。然后,再进一步将各模块细分为若干个具有一定功能的子模块,如把进程管理模块又分为进程控制、进程同步等子模块,同样也要规定好各子模块之间的接口。若子模块较大时,可再进一步将它细分。这种设计方法称为模块-接口法,由此构成的操作系统就是具有模块化结构的操作系统。图1-8所示为由模块、子模块等组成的模块化结构OS。
图1-8 模块化结构OS
2)模块的独立性
在模块-接口法设计方法中,关键问题是模块的划分和规定好模块之间的接口。如果在划分模块时,将模块划分得太小,虽然可以降低模块本身的复杂性,但会引起模块之间的联系过多,而会造成系统比较混乱;如果将模块划分得过大,又会增加模块内部的复杂性,使内部的联系增加。因此,在划分模块时,应在两者间进行权衡。另外,在划分模块时,必须充分注意模块的独立性问题。因为模块的独立性越高,各模块间的交互就越少,系统的结构也就越清晰。衡量模块的独立性有以下两个标准:
(1)内聚性。指模块内部各部分间联系的紧密程度。内聚性越高,模块的独立性越强。
(2)耦合度。指模块间相互联系和相互影响的程度。显然,耦合度越低,模块的独立性越好。
3)模块接口法的优缺点
利用模块-接口法开发的OS,较之无结构OS具有以下明显的优点:
(1)提高OS设计的正确性、可理解性和可维护性。
(2)增强OS的适应性。
(3)加速OS的开发过程。
模块化结构设计仍存在下述问题:
(1)在OS设计时,对各模块间的接口规定很难满足在模块完成后对接口的实际需求。
(2)在OS设计阶段,设计者必须做出一系列的决定(决策),每一个决定必须建立在上一个决定的基础上。但在模块化结构设计中,各模块的设计齐头并进,无法寻找到一个可靠的决定顺序,造成各种决定的“无序性”,这将使程序设计人员很难做到“设计中的每一步决定都是建立在可靠的基础上”,因此模块-接口法又被称为“无序模块法”。
3.分层式结构OS
1)分层式结构的基本概念
为了将模块-接口法中“决定顺序”的无序性变为有序性,引入了有序分层法。分层法的设计任务是,在目标系统A n和裸机系统(又称宿主系统)A0之间,铺设若干个层次的软件A1、A2、A3、…、A n-1,使A n通过A n-1、A n-2、…、A2、A1层,最终能在A0上运行。在操作系统中,常采用自底向上法来铺设这些中间层。
自底向上的分层设计的基本原则是:每一步设计都是建立在可靠的基础上。为此规定,每一层仅能使用其底层所提供的功能和服务,这样可使系统的调试和验证都变得更容易。例如,在调试第一层软件A1时,由于它使用的是一个完全确定的物理机器(宿主系统)所提供的功能,在对A1软件经过精心设计和几乎是穷尽无遗的测试后,可以认为A1是正确的,而且它与其所有的高层软件A2、…、A n无关;同样在调试第二层软件A2时,它也只使用了软件A1和物理机器所提供的功能,而与其高层软件A3、…、A n无关;如此一层一层地自底向上增添软件层,每一层都实现若干功能,最后总能构成一个能满足需要的OS。在用这种方法构成操作系统时,已将一个操作系统分为若干个层次,每层又由若干个模块组成,各层之间只存在单向的依赖关系,即高层仅依赖于紧邻它的低层。
2)分层结构的优缺点
分层结构的主要优点有:
(1)易保证系统的正确性。自下而上的设计方式,使所有设计中的决定都是有序的,或者说是建立在较为可靠的基础上的,这样比较容易保证整个系统的正确性。
(2)易扩充和易维护性。在系统中增加、修改或替换一个层次中的模块或整个层次,只要不改变相应层次间的接口,就不会影响其他层次,这必将使系统维护和扩充变得更加容易。
分层结构的主要缺点是:系统效率降低了。由于层次结构是分层单向依赖的,因此必须在相邻层之间都要建立层次间的通信机制,OS每执行一个功能,通常要自上而下地穿越多个层次,这无疑会增加系统的通信开销,从而导致系统效率的降低。
1.5.2 客户/服务器模式
客户/服务器(client/server)模式可简称为C/S模式,在20世纪90年代已风靡全球,不论是LAN,还是企业网,以及Internet所提供的多种服务,都广泛采用了客户/服务器模式。
1.客户/服务器模式的组成
客户/服务器系统主要由客户机、服务器和网络系统三个部分组成。
(1)客户机。通常在一个LAN网络上连接有多台网络工作站(简称客户机),每台客户机都是一台自主计算机,具有一定的处理能力,客户进程在其上运行,平时它处理一些本地业务,也可发送一个消息给服务器,以请求某项服务。
(2)服务器。通常是一台规模较大的机器,在其上驻留有网络文件系统或数据库系统等,它应能为网上所有的用户提供一种或多种服务。平时它一直处于工作状态,被动地等待来自客户机的请求,一旦检查到有客户提出服务请求,便去完成客户的请求,并将结果送回客户。这样,工作站中的用户进程与服务器进程便形成了客户/服务器关系。
(3)网络系统。用于连接所有客户机和服务器,实现它们之间通信和网络资源共享的系统。
2.客户/服务器之间的交互
在采用客户/服务器的系统中,通常是客户机和服务器共同完成对应用(程序)的处理。这时,在客户机和服务器之间就需要进行交互,即必须利用消息机制在这两者之间进行多次通信。一次完整的交互过程可分成以下四步:
(1)客户发送请求消息。当客户机上的用户要请求服务器进行应用处理时,应输入相应的命令和有关参数。由客户机上的发送进程先把这些信息装配成请求消息,然后把它发往服务器;客户机上的接收进程则等待接收从服务器发回来的响应消息。
(2)服务器接收消息。服务器中的接收进程平时处于等待状态,一旦有客户机发来请求,接收进程便被激活,并根据请求信息的内容,将之提供给服务器上的相应软件进行处理。
(3)服务器回送消息。服务器的软件根据请求进行处理,在完成指定的处理后,把处理结果装配成一个响应消息,由服务器中的发送进程将之发往客户机。
(4)客户机接收消息。客户机中的接收进程把收到的响应消息转交给客户机软件,再由后者做出适当处理后提交给发送该请求的客户。
3.客户/服务器模式的优点
客户/服务器模式之所以能成为当前分布式系统和网络环境下软件的主要工作模式,是由于该模式具有传统集中模式无法比拟的一系列优点。
(1)数据的分布处理和存储。由于客户机具有相当强的处理和存储能力,可进行本地处理和数据的分布存储,从而摆脱了由于把一切数据都存放在主机中而造成的既不可靠又容易产生瓶颈现象的困难局面。(www.xing528.com)
(2)便于集中管理。尽管客户/服务器模式具有分布处理功能,但公司(单位)中有关全局的重要信息、机密资料、重要设备以及网络管理等,仍可采取集中管理方式。这样可较好地保障系统的“可靠”与“安全”。
(3)灵活性和可扩充性。客户/服务器模式非常灵活,极易扩充。理论上,客户机和服务器的数量不受限制。其灵活性还表现在可以配置多种类型的客户机和服务器。
(4)易于改编应用软件。在客户/服务器模式中,对于客户机程序的修改和增删,比传统集中模式要容易得多,必要时也允许由客户进行修改。
基本客户/服务器模式的不足之处是存在不可靠性和瓶颈问题。在系统仅有一个服务器时,一旦服务器故障,将导致整个网络瘫痪。当服务器在重负荷下工作时,会因忙不过来而显著地延长对用户请求的响应时间。如果在网络中配置多个服务器,并采取相应的安全措施,则可加以改善。
1.5.3 微内核结构
微内核(micro kernel)操作系统结构,是20世纪80年代后期发展起来的。由于它能有效地支持多处理机运行,故非常适用于分布式系统环境。当前比较流行的、能支持多处理机运行的OS,几乎全部都采用了微内核结构,如Carngie Mellon大学研制的Mach OS,便属于微内核结构OS;又如Windows 2000/XP操作系统,也采用了微内核结构。
1.微内核操作系统的基本概念
为了提高操作系统的正确性、灵活性、易维护性和可扩充性,在进行现代操作系统结构设计时,即使在单处理机环境下,大多也采用基于客户/服务器模式的微内核结构,将操作系统划分为两大部分:微内核和多个服务器。至于什么是微内核操作系统结构,目前尚无一致公认的定义,但可以从下面四个方面对微内核结构的操作系统进行描述。
1)足够小的内核
在微内核操作系统中,内核是指精心设计的、能实现现代OS最基本的核心功能的部分。微内核并非一个完整的OS,而只是操作系统中最基本的部分,它通常用于:实现与硬件紧密相关的处理;实现一些较基本的功能;负责客户和服务器之间的通信。它们只是为构建通用OS提供一个重要基础,这样就可以确保把操作系统内核做得很小。
2)基于客户/服务器模式
由于客户/服务器模式具有非常多的优点,故在单机微内核操作系统中几乎无一例外地都采用客户/服务器模式,将操作系统中最基本的部分放入内核中,而把操作系统的绝大部分功能都放在微内核外面的一组服务器(进程)中实现。例如用于提供对进程(线程)进行管理的进程(线程)服务器,提供虚拟存储器管理功能的虚拟存储器服务器,提供I/O设备管理的I/O设备管理服务器等,它们都是被作为进程来实现的,运行在用户态,客户与服务器之间是借助微内核提供的消息传递机制来实现信息交互的。图1-9示出了在单机环境下的客户/服务器模式。
图1 9 在单机环境下的客户/服务器模式
3)应用“机制与策略分离”原理
在现代操作系统的结构设计中,经常利用“机制与策略分离”的原理来构造OS结构。所谓机制,是指实现某一功能的具体执行机构;而策略,则是在机制的基础上,借助某些参数和算法来实现该功能的优化,或达到不同的功能目标。通常,机制处于一个系统的基层,而策略则处于系统的高层。在传统的OS中,将机制放在OS内核的较低层,把策略放在内核的较高层中。而在微内核操作系统中,通常将机制放在OS的微内核中。正因为如此,才有可能将内核做得很小。
4)采用面向对象技术
操作系统是一个极其复杂的大型软件系统,不仅可以通过结构设计来分解操作系统的复杂度,还可以基于面向对象技术中的“抽象”和“隐蔽”原则控制系统的复杂性,再进一步利用“对象”“封装”和“继承”等概念来确保操作系统的正确性、可靠性、易修改性、易扩展性等,并提高操作系统的设计速度。正因为面向对象技术能带来如此多的好处,故面向对象技术被广泛应用于现代操作系统的设计中。
2.微内核的基本功能
微内核应具有哪些功能,或者说哪些功能应放在微内核内,哪些应放在微内核外,目前尚无明确的规定。现在一般都采用“机制与策略分离”的原理,将机制部分,以及与硬件紧密相关的部分放入微内核中。由此可知微内核通常具有如下几方面的功能:
1)进程(线程)管理
大多数的微内核OS,对于进程管理功能的实现,都采用“机制与策略分离”的原理。例如,为实现进程(线程)调度功能,须在进程管理中设置一个或多个进程(线程)优先级队列;能将指定优先级进程(线程)从所在队列中取出,并将其投入执行。由于这一部分属于调度功能的机制部分,应将它放入微内核中。应如何确定每类用户(进程)的优先级,以及应如何修改它们的优先级等,都属于策略问题,可将它们放入微内核外的进程(线程)管理服务器中。由于进程(线程)之间的通信功能是微内核OS最基本的功能,被频繁使用,因此几乎所有的微内核OS都是将进程(线程)之间的通信功能放入微内核中。此外,还将进程的切换、线程的调度,以及多处理机之间的同步等功能也放入微内核中。
2)低级存储器管理
通常在微内核中,只配置最基本的低级存储器管理机制。如用于实现将用户空间的逻辑地址变换为内存空间的物理地址的页表机制和地址变换机制,这一部分是依赖于机器的,因此放入微内核。而实现虚拟存储器管理的策略,则包含应采取何种页面置换算法,采用何种内存分配与回收策略等,应将这部分放在微内核外的存储器管理服务器中去实现。
3)中断和陷入处理
大多数微内核操作系统都是将与硬件紧密相关的一小部分放入微内核中处理。此时微内核的主要功能是捕获所发生的中断和陷入事件,并进行相应的前期处理。如进行中断现场保护,识别中断和陷入的类型,然后将有关事件的信息转换成消息后,把它发送给相关的服务器。由服务器根据中断或陷入的类型,调用相应的处理程序来进行后期处理。
在微内核OS中是将进程管理、存储器管理以及I/O管理这些功能一分为二,属于机制的很小一部分放入微内核中,另外绝大部分放在微内核外的各种服务器中来实现。事实上,其中大多数服务器都比微内核大。这进一步说明了为什么能在采用客户/服务器模式后,还能把微内核做得很小的原因。
3.微内核操作系统的优点
由于微内核OS结构是建立在模块化、层次化结构的基础上的,并采用了客户/服务器模式和面向对象的程序设计技术,由此可见,微内核结构的OS是集各种技术优点之大成,因而使之具有如下优点:
1)提高系统的可扩展性
由于微内核OS的许多功能是由相对独立的服务器软件来实现的,当开发了新的硬件和软件时,微内核OS只需在相应的服务器中增加新的功能,或再增加一个专门的服务器。与此同时,也必然改善系统的灵活性,不仅可在操作系统中增加新的功能,还可修改原有功能,以及删除已过时的功能,以形成一个更为精干有效的操作系统。
2)增强系统的可靠性
这一方面由于微内核是出于精心设计和严格测试的,容易保证其正确性;另一方面是它提供了规范而精简的应用程序接口(application program interface,API),为微内核外部的程序编制高质量的代码创造了条件。此外,由于所有服务器都是运行在用户态,服务器与服务器之间采用的是消息传递通信机制。因此,当某个服务器出现错误时,不会影响内核,也不会影响其他服务器。
3)可移植性
随着硬件的快速发展,出现了各种各样的硬件平台,作为一个好的操作系统,必须具备可移植性,使其能较容易地运行在不同的计算机硬件平台上。在微内核结构的操作系统中,所有与特定CPU和I/O设备硬件有关的代码,均放在内核和内核下面的硬件隐藏层中,而操作系统其他绝大部分(即各种服务器)均与硬件平台无关,因而把操作系统移植到另一个计算机硬件平台上所需做的修改是比较小的。
4)提供了对分布式系统的支持
由于在微内核OS中,客户和服务器之间以及服务器和服务器之间的通信,是采用消息传递通信机制进行的,致使微内核OS能很好地支持分布式系统和网络系统。事实上,只要在分布式系统中赋予所有进程和服务器唯一的标识符,在微内核中再配置一张系统映射表(即进程和服务器的标识符与它们所驻留的机器之间的对应表),在进行客户与服务器通信时,只需在所发送的消息中标上发送进程和接收进程的标识符,微内核便可利用系统映射表,将消息发往目标,而无论目标是驻留在哪台机器上。
5)融入了面向对象技术
在设计微内核OS时,采用了面向对象的技术,其中的“封装”“继承”“对象类”和“多态性”,以及在对象之间采用消息传递机制等,都十分有利于提高系统的正确性、可靠性、易修改性、易扩展性等,而且还能显著地减少开发系统所付出的开销。
4.微内核操作系统存在的问题
应当指出,在微内核OS中,由于采用了非常小的内核,以及客户/服务器模式和消息传递机制,这些虽给微内核OS带来了许多优点,但由此也使微内核OS存在潜在的缺点。其中最主要的是,较之早期OS,微内核OS的运行效率有所降低。
效率降低最主要的原因是,在完成一次客户对OS提出的服务请求时,需要利用消息实现多次交互和进行用户/内核模式及上下文的多次切换。然而,在早期的OS中,用户进程在请求取得OS服务时,一般只需进行两次上下文切换:一次是在执行系统调用后,由用户态转向系统态时;另一次是在系统完成用户请求的服务后,由系统态返回用户态时。在微内核OS中,由于客户和服务器及服务器和服务器之间的通信,都需通过微内核,致使同样的服务请求至少需要进行四次上下文切换:第一次是发生在客户发送请求消息给内核,以请求取得某服务器特定的服务时;第二次是发生在由内核把客户的请求消息发往服务器时;第三次是当服务器完成客户请求后,把响应消息发送到内核时;第四次是在内核将响应消息发送给客户时。
实际情况是往往还会引起更多的上下文切换。例如,当某个服务器自身尚无能力完成客户请求,而需要其他服务器的帮助时,如图1-10所示,其中的文件服务器还需要磁盘服务器的帮助,这时就需要进行八次上下文切换。
为了改善运行效率,可以重新把一些常用的操作系统基本功能,由服务器移入微内核中。这样可使客户对常用操作系统功能的请求所发生的用户/内核模式和上下文切换的次数,由四次或八次降为两次。但这又会使微内核的容量明显增大,在小型接口定义和适应性方面的优点也有所下降,同时也提高了微内核的设计代价。
图1-10 在传统OS和微内核OS中的上下文切换
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。