1.5 OS结构设计

L05

学习目标

操作系统结构从无结构到模块化、分层式,再到客户/服务器模式和微内核,反映了 OS 设计理念的不断演进。

  • 传统 OS 结构:无结构(整体式)设计混乱难维护;模块化结构将功能模块化但接口复杂;分层式结构自底向上有序,每层只调用下一层,但跨层调用多、效率低。
  • 客户/服务器模式:将 OS 分为微内核和一组服务器进程,客户通过消息请求服务,适用于分布式系统。
  • 面向对象程序设计:以对象、类、继承为基础,提高 OS 的可扩充性和可移植性。
  • 微内核 OS 结构:只保留最基本功能(进程管理、存储器管理、通信)在内核,其他服务放用户态;优点是可扩充性、可靠性好,缺点是性能开销大(频繁的用户态/核心态切换)。

原理 · 深入理解

1.5 OS结构设计

早期操作系统规模小,仅几十 KB,一用户数月即可完成,是否有结构并不重要,重要的是程序员的技巧。

但随着 OS 越来越大,代码越来越多,往往要几十甚至几百用户分工合作,靠个用户技巧已经撑不住。于是必须用工程化的方法来开发大型软件,这就催生了「软件工程学」,操作系统的结构设计也成了真正的工程问题。

1.5.1 传统操作系统结构

无结构操作系统把注意力放在功能实现和高效率上,缺乏一致的设计思想。整个 OS 是大量过程的集合,每个过程可以任意调用别的过程,内部既复杂又混乱。

模块化结构 OS 按功能划分成若干个有一定独立性和大小的模块。比起无结构 OS,它有明显优点。

衡量模块独立性的标准是内聚性和耦合度:内聚越高、耦合越低,模块独立性越好。

内聚性

模块内部各部分间联系的紧密程度。内聚性越高,模块独立性越强。

耦合度

模块间相互联系和相互影响的程度。耦合度越低,模块独立性越好。

  1. 提高 OS 设计的正确性、可理解性和可维护性
  2. 增强 OS 的可适应性
  3. 加速 OS 的开发过程

模块化结构仍存在问题:接口规定很难提前定准;各模块齐头并进,缺乏可靠的决定顺序,因此又被称为「无序模块法」。

图1-7 模块化结构的操作系统 用户接口 / 命令 进程 · 内存 · 文件 · 设备模块 经接口调用 硬件 模块之间靠接口,而不是大家直接改全局。
图1-7 模块化结构的操作系统

分层式结构在裸机 A0 和目标系统 An 之间铺设若干层软件 A1、A2、…、An-1,每层只调用下一层,自底向上有序构建。

分层结构的主要缺点如下:

  1. 易保证系统的正确性
  2. 易扩充和易维护
  1. 各层间通信开销大,功能不能跨层调用,效率受到影响。

1.5.2 客户/服务器模式简介 Client/Server Model

组成:客户机 · 服务器 · 网络

客户/服务器(Client/Server)把「谁要服务」和「谁提供服务」拆开。一套 C/S 系统通常由三部分组成。

客户机

多台联网工作站,各自有处理能力,向服务器提出服务请求。

服务器

规模较大的机器,驻留网络文件系统或数据库等,向网上用户提供一种或多种服务。

网络系统

连接所有客户机与服务器,完成通信和网络资源共享。

客户与服务器的四步交互

一次典型交互是四步报文往来。用下方交互动画逐步播放,比死记条目更容易建立画面感。

  1. 客户发送请求消息
  2. 服务器接收消息并处理
  3. 服务器回送应答消息
  4. 客户机接收消息

客户/服务器模式的优点

相对集中式大型机或纯对等结构,C/S 模式常见优点如下:

  1. 数据的分布处理和存储
  2. 便于集中管理
  3. 灵活性和可扩充性
  4. 易于改编应用软件

1.5.3 面向对象的程序设计 Object- Orientated Programming

面向对象技术把计算机中的实体抽象成对象:每个对象由封装的数据结构(变量/属性)和一组操作过程(方法)组成。比如把一个文件当作对象,它的变量就是文件类型、大小、创建者等。

图1-9 文件对象:变量与方法被封装在一起 文件对象 一个逻辑整体 变量(属性) 类型 · 大小 · 创建者 … 方法(操作) 打开 · 读 · 写 · 关闭 外界只能通过方法访问数据,变量被封装在对象内部。
图1-9

许多对象表示同一类事物,各有自己的变量,但方法相同。于是用「对象类」来定义一组相似的对象:类定义了一组变量和对应的方法,描述对象的共同属性和行为。类是对象上的抽象,对象是类的实例。

面向对象技术支持继承:根据已有的类定义新类,新类叫子类,原来的叫父类。父类可以派生多个子类,子类也可以有两个或多个父类——这就是多重继承,可以减少重复开发。

图1-10 类的继承关系 基类 派生 A 派生 B 子类继承父类的数据与操作
图1-10 类的继承关系

在操作系统设计中把实体当作对象来处理,有几个好处。

  1. 通过「重用」提高产品质量和生产率
  2. 更易于保证系统的正确性和可靠性
  3. 通过封装隐蔽对象中的变量和方法,使系统具有更好的易修改性和易扩展性
  4. 利用继承特性显著减少开发的时空开销

1.5.4 微内核OS结构

在微内核操作系统中,内核是指精心设计的、能实现现代OS最基本核心功能的小型内核,微内核并非是一个完整的OS,而只是将操作系统中最基本的部分放入微内核。 通常包含:① 与硬件处理紧密相关的部分;② 一些较基本的功能;③ 客户和服务器之间的通信。

单机微内核操作系统中几乎无一例外地都采用客户/服务器模式,将操作系统中最基本的部分放入内核中,而把操作系统的绝大部分功能都放在微内核外面的一组服务器(进程)中实现。

图1-11 在单机环境下的客户/服务器模式 客户 消息 微内核 服务器 请求走消息,服务在用户态
图1-11 在单机环境下的客户/服务器模式

机制与策略分离

微内核设计常强调「机制与策略分离」:机制放进内核,策略放在外面的服务里。

机制

实现某一功能的具体执行机构,相对稳定,放在微内核中。

策略

在机制之上用参数和算法做优化或换目标,可随服务调整,不必改内核。

微内核的基本功能

微内核应装哪些功能尚无统一标准;常见做法是只保留与硬件紧密相关的机制,以及支撑消息传递的最小集合。点开下方动画,对照三项基本功能。

进程(线程)管理

多数微内核按「机制与策略分离」只保留调度与切换等机制;策略(如优先级算法)可在外层。

低级存储器管理

微内核里通常只配最基本的地址映射 / 保护机制,完整虚存策略在外。

中断和陷入处理

捕获中断与陷入并做前期处理;具体设备策略仍交给相应服务或驱动。

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

  1. 提高了系统的可扩展性
  2. 增强了系统的可靠性
  3. 可移植性强
  4. 提供了对分布式系统的支持
  5. 融入了面向对象技术

较之早期的操作系统,微内核操作系统的运行效率有所降低。

效率降低的最主要原因:在完成一次客户对操作系统提出的服务请求时,需要利用消息实现多次交互和进行用户/内核模式与上下文的多次切换: 一次在执行系统调用后由用户态转向系统态时; 另一次在系统完成用户请求的服务后,由系统态返回用户态时。

图1-12 在传统OS和微内核OS中的上下文切换 用户态 陷入 内核 返回 微内核切换次数往往更多
图1-12 在传统OS和微内核OS中的上下文切换

做 · 交互动画

  • 根据「学习目标」列出 3 个关键词,对照原理段落解释给自己听。

客户/服务器报文交互(1.5.2)

os-structure-liteos

ppt-microkernel

用控件单步操作;日志区记下每一步发生了什么。

总结与提升

  • 能说明为何 HDF 放在应用开发之前。
  • 能用自己的话复述学习目标,并指出概念与板上实验的对应。

延伸思考

  • 微内核把驱动放用户态,对本课有何启示?
  • 如果把本节机制拿到 Linux 或完整 OpenHarmony 上,会多出哪些硬件假设?

← 本阶段封面 · 课程列表