操作系统学习笔记 03 - OS设计结构

采用工程化的开发方法来对大型软件进行开发。这就是“软件工程学”。软件工程的目标是十分明确的,所开发出的软件产品应具有良好的软件质量和合理的费用,整个费用应能为用户所接受。软件质量可用这样几个指标来评价:功能性有效性可靠性易使用性,=可维护性易移植性。为此,先后产生了多种操作系统的开发方法, 如模块化方法结构化方法和=面向对象的方法等。利用不同的开发方法所开发出的操作系统将具有不同的操作系统结构。

一、传统的操作系统结构

软件开发技术的不断发展,促进了 OS 结构的更新换代。这里,我们把早期的无结构OS(第一代)、模块化结构的==OS(第二代)和分层式结构OS(第三代),都统称为传统结构的OS,而把微内核结构==的 OS 称为现代结构的OS

1、无结构操作系统

在早期开发操作系统时,设计者只是把注意力放在功能的实现和获得高的效率上,缺乏首尾一致设计思想。此时的 OS为数众多的一组过程的集合,每个过程可以任意地相互调用其它过程,致使操作系统内部既复杂又混乱。因此,这种 OS 是无结构的,也有人把它称为整体系统结构

2、模块化结构 OS

1. 模块化程序设计技术的基本概念

模块化程序设计技术是 20 世纪 60 年代出现的一种结构化程序设计技术。该技术是基于“分解”和“模块化”原则来控制大型软件的复杂度。为使 OS 具有较清晰的结构,OS 不再是由众多的过程直接构成,而是将 OS 按其功能精心地划分为若干个具有一定独立性和大小的模块;每个模块具有某方面的管理功能,如进程管理模块、存储器管理模块、I/O 设备管理模块等,并仔细地规定好各模块间的接口,使各模块之间能通过该接口实现交互。然后,再进一步将各模块细分为若干个具有一定功能的子模块,如把进程管理模块又分为进程控制、进程同步等子模块,同样也要规定好各子模块之间的接口。若子模块较大时, 可再进一步将它细分。我们把这种设计方法称为模块―接口法,由此构成的操作系统就是具有模块化结构的操作系统。

2. 模块的独立性

模块―接口法设计方法中,关键问题是模块的划分和规定好模块之间的接口。在划分模块时,必须充分注意模块的独立性问题。因为模块的独立性越高,各模块间的交互就越少,系统的结构也就越清晰。衡量模块的独立性有以下两个标准:

  • 内聚性,指模块内部各部分间联系的紧密程度。内聚性越高,模块的独立性越强。
  • 耦合度,指模块间相互联系和相互影响的程度。显然,耦合度越低,模块的独立性
    越好。

3. 模块接口法的优缺点

  • 利用模块―接口法开发的OS,较之无结构OS 具有以下明显的优点:
    (1) 提高 OS 设计的正确性、可理解性和可维护性;
    (2) 增强 OS 的适应性;
    (3) 加速 OS 的开发过程。
  • 模块化结构设计仍存在下述问题:
    (1) 在OS 设计时,对各模块间的接口规定很难满足在模块完成后对接口的实际需求。
    (2) 在 OS 设计阶段,设计者必须做出一系列的决定(决策),每一个决定必须建立在上一个决定的基础上。但在模块化结构设计中,各模块的设计齐头并进,无法寻找到一个可靠的决定顺序,造成各种决定的“无序性”,这将使程序设计人员很难做到“设计中的每一步决定都是建立在可靠的基础上”,因此模块―接口法又被称为“无序模块法”。

3、分层式结构 OS

1. 分层式结构的基本概念

为了将模块―接口法中“决定顺序”的无序性变为有序性,引入了有序分层法。分层法的设计任务是,在目标系统 An 和裸机系统(又称宿主系统)A0 之间,铺设若干个层次的软件 A1、A2、A3、…、An-1,使 An 通过 An-1、An-2、…、A2、A1 层,最终能在 A0 上运行。在操作系统中,常采用自底向上法来铺设这些中间层。
自底向上分层设计的基本原则是:每一步设计都是建立在可靠的基础上。为此规定,每一层仅能使用其底层所提供的功能和服务,这样可使系统的调试和验证都变得更容易。
如此一层一层地自底向上增添软件层,每一层都实现若干功能,最后总能构成一个能满足需要的 OS。在用这种方法构成操作系统时,已将一个操作系统分为若干个层次,每层又由若干个模块组成, 各层之间只存在着单向的依赖关系,即高层仅依赖于紧邻它的低层

2. 分层结构的优缺点

  • 分层结构的主要优点有:
    (1) 易保证系统的正确性。自下而上的设计方式,使所有设计中的决定都是有序的,或者说是建立在较为可靠的基础上的,这样比较容易保证整个系统的正确性。
    (2) 易扩充和易维护性。在系统中增加、修改或替换一个层次中的模块或整个层次,只要不改变相应层次间的接口,就不会影响其它层次,这必将使系统维护和扩充变得更加容易。
  • 分层结构的主要缺点是:系统效率降低了。由于层次结构是分层单向依赖的,因此必须在相邻层之间都要建立层次间的通信机制OS 每执行一个功能,通常要自上而下地穿越多个层次,这无疑会增加系统的通信开销,从而导致系统效率的降低。

二、客户/服务器模式

客户/服务器(Client/Server)模式可简称为 C/S 模式,在 20 世纪 90 年代已风靡全球,不论是 LAN,还是企业网,以及 Internet 所提供的多种服务,都广泛采用了客户/服务器模式。

1、客户/服务器模式的组成

客户/服务器系统主要由客户机、服务器和网络系统三个部分组成。

  • 客户机:通常在一个 LAN 网络上连接有多台网络工作站(简称客户机),每台客户机都是一个自主计算机,具有一定的处理能力,客户进程在其上运行,平时它处理一些本地业务,也可发送一个消息给服务器,以请求某项服务。
  • 服务器:通常是一台规模较大的机器,在其上驻留有网络文件系统或数据库系统等, 它应能为网上所有的用户提供一种或多种服务。平时它一直处于工作状态,被动地等待来自客户机的请求,一旦检查到有客户提出服务请求,便去完成客户的请求,并将结果送回客户。这样,工作站中的用户进程与服务器进程便形成了客户/服务器关系。
  • 网络系统:用于连接所有客户机和服务器,实现它们之间通信网络资源共享的系统。

2、客户/服务器之间的交互

在采用客户/服务器的系统中,通常是客户机和服务器共同完成对应用(程序)的处理。这时,在客户机和服务器之间就需要进行交互,即必须利用消息机制在这两者之间进行多次通信。一次完整的交互过程可分成以下四步:
(1) 客户发送请求消息。当客户机上的用户要请求服务器进行应用处理时,应输入相应的命令和有关参数。由客户机上的发送进程先把这些信息装配成请求消息,然后把它发往服务器;客户机上的接收进程则等待接收从服务器发回来的响应消息。
(2) 服务器接收消息。服务器中的接收进程平时处于等待状态,一旦有客户机发来请求,接收进程便被激活,并根据请求信息的内容,将之提供给服务器上的相应软件进行处理。
(3) 服务器回送消息。服务器的软件根据请求进行处理,在完成指定的处理后,把处理结果装配成一个响应消息,由服务器中的发送进程将之发往客户机。
(4) 客户机接收消息。客户机中的接收进程把收到的响应消息转交给客户机软件,再由后者做出适当处理后提交给发送该请求的客户。

3、客户/服务器模式的优点

C/S 模式之所以能成为当前分布式系统网络环境下软件的主要工作模式,是由于该模式具有传统集中模式所无法比拟的一系列优点。
(1) 数据的分布处理和存储。由于客户机具有相当强的处理和存储能力,可进行本地处理和数据的分布存储,从而摆脱了由于把一切数据都存放在主机中而造成的既不可靠又容易产生瓶颈现象的困难局面。
(2) 便于集中管理。尽管 C/S 模式具有分布处理功能,但公司(单位)中的有关全局的重要信息、机密资料、重要设备以及网络管理等,仍可采取集中管理方式。这样可较好地保障系统的“可靠”与“安全”。
(3) 灵活性和可扩充性C/S 模式非常灵活,极易扩充。理论上,客户机和服务器的数量不受限制。其灵活性还表现在可以配置多种类型的客户机和服务器。
(4) 易于改编应用软件。在客户/服务器模式中,对于客户机程序的修改和增删,比传统集中模式要容易得多,必要时也允许由客户进行修改。
基本客户/服务器模式的不足之处是存在着不可靠性和瓶颈问题。在系统仅有一个服务器时,一旦服务器故障,将导致整个网络瘫痪。当服务器在重负荷下工作时,会因忙不过来而显著地延长对用户请求的响应时间。如果在网络中配置多个服务器,并采取相应的安全措施,则可加以改善。

三、面向对象的程序设计

1、面向对象技术的基本概念

面向对象技术是 20 世纪 80 年代初提出并很快流行起来的。该技术是基于“抽象”和“隐蔽”原则来控制大型软件的复杂度的。所谓对象,是指在现实世界中具有相同属性、服从相同规则的一系列事物(事物可以是一个物理实体、一个概念或一个软件模块等)的抽象,而把其中的具体事物称为对象的实例。如果在 OS 中的各类实体如进程、线程、消息、存储器和文件等,都使用了对象这一概念,相应地,便有了进程对象、线程对象、存储器对象和文件对象等。

1. 对象

在面向对象的技术中,是利用被封装的数据结构(变量)和一组对它进行操作的过程(方法),来表示系统中的某个对象的。对象中的变量(数据)也称为属性,它可以是单个标量或一张表。面向对象中的方法是用于执行某种功能的过程,它可以改变对象的状态,更新对象中的某些数据值或作用于对象所要访问的外部资源。
对象中的变量(数据)对外是隐蔽的,因而外界不能对它直接进行访问,必须通过该对象中的一组方法(操作函数)对它进行访问。对象中的一组方法的实现细节也是隐蔽的,因此,对象中的变量可以得到很好的保护, 而不会允许未经受权者使用和不正确的操作。

2. 对象类

在实践中,有许多对象可能表示的是同一类事物,每个对象具有自己的变量集合,而它们所具有的方法是相同的。如果为每一个相似的对象都定义一组变量和方法,显然是低效的,由此产生了“对象类”的概念,利用“对象类”来定义一组大体相似的对象。一个类同样定义了一组变量和针对该变量的一组方法,用它们来描述一组对象的共同属性和行为类是在对象上的抽象对象则是类的实例。对象类中所定义的变量在实例中均有具体的值。对象类的概念非常有用,因为它极大地提高了创建多个相似对象的效率。

3. 继承

在面向对象的技术中,可以根据已有类来定义一个新的类,新类被称为子类(B),原来的类被称为父类(A)。继承是父类和子类之间共享变量方法机制,该机制规定,子类自动继承父类中定义的变量和方法,并允许子类再增加新的内容。继承特性可使定义子类变得更为容易。一个父类可以定义多个子类,它们分别是父类的某种特例,父类描述了这些子类的公共变量和方法。类似地,这些子类又可以定义自己的子类,通过此途经可以生成一个继承的层次。另外,也允许一个子类有两个父类或多个父类,它可以从多个父类获得继承,此时称为“多重继承”。

2、面向对象技术的优点

在设计操作系统时,将计算机中的实体作为对象来处理,可带来如下好处:

  1. 通过“重用”提高产品质量和生产率
    在面向对象技术中可通过“重用”以前项目中经过精心测试的对象,或由其他人编写、测试和维护的对象类,来构建新的系统,这不仅可大大降低开发成本,而且能获得更好的系统质量
  2. 使系统具有更好的易修改性和易扩展性
    通过封装,可隐蔽对象中的变量和方法,因而当改变对象中的变量和方法时,不会影响到其它部分,从而可方便地修改老的对象类。另外,继承是面向对象技术的重要特性, 在创建一个新对象类时,通过利用继承特性,可显著地减少开发的时空开销,使系统具有更好的易扩展性和灵活性
  3. 更易于保证系统的“正确性”和“可靠性”
    对象是构成操作系统的基本单元,由于可以独立地对它进行测试,易于保证每个对象的正确性和可靠性,因此也就比较容易保证整个系统的正确性和可靠性。此外,封装对对象类中的信息进行了隐蔽,这样又可有效地防止未经授权者的访问和用户不正确的使用, 有助于构建更为安全的系统。

四、微内核 OS 结构

微内核(Micro Kernel)操作系统结构,是 20 世纪 80 年代后期发展起来的。由于它能有效地支持多处理机运行,故非常适用于分布式系统环境。当前比较流行的、能支持多处理机运行的 OS,几乎全部都采用了微内核结构,如 Carngie Mellon 大学研制的 Mach OS, 便属于微内核结构 OS;又如当前广泛使用的 Windows 2000/XP 操作系统,也采用了微内核结构。

1、微内核操作系统的基本概念

为了提高操作系统的“正确性”、“灵活性”、“易维护性”和”可扩充性”,在进行现代操作系统结构设计时,即使在单处理机环境下,大多也采用基于客户/服务器模式的微内核结构,将操作系统划分为两大部分:微内核多个服务器。至于什么是微内核操作系统结构,现在尚无一致公认的定义,但我们可以从下面四个方面,对微内核结构的操作系统进行描述。

1. 足够小的内核

在微内核操作系统中,内核是指精心设计的、能实现现代 OS 最基本的核心功能的部分。微内核并非是一个完整的 OS,而只是操作系统中最基本的部分,它通常用于:① 实现与硬件紧密相关的处理;②实现一些较基本的功能;③ 负责客户和服务器之间的通信。它们只是为构建通用 OS 提供一个重要基础,这样就可以确保把操作系统内核做得很小。

2. 基于客户/服务器模式

由于客户/服务器模式具有非常多的优点,故在单机微内核操作系统中几乎无一例外地都采用客户/服务器模式,将操作系统中最基本的部分放入内核中,而把操作系统的绝大部分功能都放在微内核外面的一组服务器(进程)中实现。例如用于提供对进程(线程)进行管理的进程(线程)服务器,提供虚拟存储器管理功能的虚拟存储器服务器,提供 I/O 设备管理的I/O 设备管理服务器等,它们都是被作为进程来实现的,运行在用户态,客户与服务器之间是借助微内核提供的消息传递机制来实现信息交互的。

3. 应用“机制与策略分离”原理

在现代操作系统的结构设计中,经常利用“机制与策略分离”的原理来构造 OS 结构。所谓机制,是指实现某一功能的具体执行机构。而策略,则是在机制的基础上,借助于某些参数和算法来实现该功能的优化,或达到不同的功能目标。通常,机制处于一个系统的基层,而策略则处于系统的高层。在传统的 OS 中,将机制放在 OS 的内核的较低层,把策略放在内核的较高层次中。而在微内核操作系统中,通常将机制放在 OS 的微内核中。正因为如此,才有可能将内核做得很小。

4. 采用面向对象技术

操作系统是一个极其复杂的大型软件系统,我们不仅可以通过结构设计来分解操作系统的复杂度,还可以基于面向对象技术中的“抽象”和“隐蔽”原则控制系统的复杂性, 再进一步利用“对象”、“封装”和“继承”等概念来确保操作系统的“正确性”、“可靠性”、“易修改性”、“易扩展性”等,并提高操作系统的设计速度。正因为面向对象技术能带来如此多的好处,故面向对象技术被广泛应用于现代操作系统的设计中。

2、微内核的基本功能

微内核应具有哪些功能,或者说哪些功能应放在微内核内,哪些应放在微内核外,目前尚无明确的规定。现在一般都采用“机制与策略分离”的原理,将机制部分,以及与硬件紧密相关的部分放入微内核中。由此可知微内核通常具有如下几方面的功能:

1. 进程(线程)管理

大多数的微内核 OS,对于进程管理功能的实现,都采用“机制与策略分离”的原理。由于进程(线程)之间的通信功能是微内核 OS 最基本的功能,被频繁使用,因此几乎所有的微内核 OS 都是将进程(线程)之间的通信功能放入微内核中。此外,还将进程的切换线程的调度,以及多处理机之间的同步等功能也放入微内核中。

2. 低级存储器管理

通常在微内核中,只配置最基本的低级存储器管理机制。如用于实现将用户空间的逻辑地址变换为内存空间的物理地址的页表机制地址变换机制,这一部分是依赖于机器的,因此放入微内核。而实现虚拟存储器管理的策略,则包含应采取何种页面置换算法,采用何种内存分配回收策略等,应将这部分放在微内核外的存储器管理服务器中去实现。

3. 中断和陷入处理

大多数微内核操作系统都是将与硬件紧密相关的一小部分放入微内核中处理。此时微内核的主要功能,是捕获所发生的中断和陷入事件,并进行相应的前期处理。如进行中断现场保护,识别中断和陷入的类型,然后将有关事件的信息转换成消息后,把它发送给相关的服务器。由服务器根据中断或陷入的类型,调用相应的处理程序来进行后期处理。
在微内核 OS 中是将进程管理存储器管理以及== I/O 管理这些功能一分为二,属于机制的很小一部分放入微内核中,另外绝大部分放在微内核外的各种服务器中来实现。事实上, 其中大多数服务器都比微内核大。这进一步说明了为什么能在采用客户/服务器==模式后,还能把微内核做得很小的原因。

3、微内核操作系统的优点

由于微内核 OS 结构是建立在模块化、层次化结构的基础上的,并采用了客户/服务器模式和面向对象的程序设计技术,由此可见,微内核结构的 OS 是集各种技术优点之大成, 因而使之具有如下优点:

1. 提高了系统的可扩展性

由于微内核 OS 的许多功能是由相对独立的服务器软件来实现的,当开发了新的硬件和软件时,微内核 OS 只须在相应的服务器中增加新的功能,或再增加一个专门的服务器。与此同时,也必然改善系统的灵活性,不仅可在操作系统中增加新的功能,还可修改原有功能,以及删除已过时的功能,以形成一个更为精干有效的操作系统。

2. 增强了系统的可靠性

这一方面是由于微内核是出于精心设计和严格测试的,容易保证其正确性;另一方面是它提供了规范而精简的应用程序接口(API),为微内核外部的程序编制高质量的代码创造了条件。此外,由于所有服务器都是运行在用户态,服务器与服务器之间采用的是消息传递通信机制,因此,当某个服务器出现错误时,不会影响内核,也不会影响其它服务器

3. 可移植性

随着硬件的快速发展,出现了各种各样的硬件平台,作为一个好的操作系统,必须具备可移植性,使其能较容易地运行在不同的计算机硬件平台上。在微内核结构的操作系统中,所有与特定 CPUI/O 设备硬件有关的代码,均放在内核和内核下面的硬件隐藏层中, 而操作系统其它绝大部分(即各种服务器)均与硬件平台无关,因而,把操作系统移植到另一个计算机硬件平台上所需作的修改是比较小的。

4. 提供了对分布式系统的支持

由于在微内核 OS 中,客户和服务器之间以及服务器和服务器之间的通信,是采用消息传递通信机制进行的,致使微内核 OS 能很好地支持分布式系统网络系统。事实上,只要在分布式系统中赋予所有进程和服务器惟一的标识符,在微内核中再配置一张系统映射表 (即进程和服务器的标识符与它们所驻留的机器之间的对应表),在进行客户与服务器通信时,只需在所发送的消息中标上发送进程和接收进程的标识符,微内核便可利用系统映射表,将消息发往目标,而无论目标是驻留在哪台机器上

5. 融入了面向对象技术

在设计微内核 OS 时,采用了面向对象的技术,其中的“封装”,“继承”,“对象类”和 “多态性”,以及在对象之间采用消息传递机制等,都十分有利于提高系统的“正确性”、“可靠性”、“易修改性”、“易扩展性”等,而且还能显著地减少开发系统所付出的开销

4、微内核操作系统存在的问题

应当指出,在微内核 OS 中,由于采用了非常小的内核,以及客户/服务器模式和消息传递机制,这些虽给微内核 OS 带来了许多优点,但由此也使微内核 OS 存在着潜在的缺点。其中最主要的是,较之早期 OS,微内核 OS 的运行效率有所降低。
效率降低的最主要的原因是,在完成一次客户对 OS 提出的服务请求时,需要利用消息实现多次交互和进行用户/内核模式及上下文的多次切换。然而,在早期的 OS 中,用户进程在请求取得 OS 服务时,一般只需进行两次上下文的切换:一次是在执行系统调用后,由用户态转向系统态时;另一次是在系统完成用户请求的服务后,由系统态返回用户态时。在微内核 OS 中,由于客户和服务器及服务器和服务器之间的通信,都需通过微内核,致使同样的服务请求至少需要进行四次上下文切换。第一次是发生在客户发送请求消息给内核, 以请求取得某服务器特定的服务时;第二次是发生在由内核把客户的请求消息发往服务器时;第三次是当服务器完成客户请求后,把响应消息发送到内核时;第四次是在内核将响应消息发送给客户时。
实际情况是往往还会引起更多的上下文切换。为了改善运行效率,可以重新把一些常用的操作系统基本功能,由服务器移入微内核中。这样可使客户对常用操作系统功能的请求所发生的用户/内核模式和上下文的切换的次数,由四次或八次降为两次。但这又会使微内核的容量明显地增大,在小型接口定义和适应性方面的优点也有所下降,同时也提高了微内核的设计代价。

你可能感兴趣的:(操作系统学习笔记,操作系统)