Article
操作系统-CH1.4-操作系统的结构
操作系统-CH1.4-操作系统的结构,待补充摘要。
- https://tingwu.aliyun.com/doc/transcripts/kvjonybd6p34qlx3?sl=1# 《1-4 操作系统结构 720P》

操作系统结构:从设计哲学到硬件控制的演进
本篇笔记基于 BOK 操作系统课程内容,结合个人学习感悟与嵌入式开发实践进行整理与深度扩展。
知识导图与演进脉络
操作系统的结构设计本质上是在“功能独立性”、“系统安全性”与“运行效率”之间进行权衡的过程。其演进路线如下:
一、 模块化结构 (Modular Structure)
1. 核心概念
模块化结构将操作系统按功能划分为若干个具有特定管理功能的独立模块(如进程管理、存储器管理、文件管理等)。各模块之间通过预先定义的接口进行交互和信息传递。
2. 模块独立性衡量双标准(★ 重点掌握)
这是软件工程与系统设计中最基础、最重要的黄金法则:
- 内聚性 (Cohesion):指模块内部各组成部分之间联系的紧密程度。
- 法则:内聚性越高,模块内部关联越紧密,模块的独立性就越好。
- 耦合度 (Coupling):指模块之间相互联系和影响的程度。
- 法则:耦合度越低,模块间的依赖越小,模块的独立性就越好。
💡 手写感悟联想: “我觉得这些都挺有用的,特别在写一个嵌入式项目中,低耦合度很重要。”
深度共鸣与拓展: 确实如此!在嵌入式(如 STM32)开发中,若未做好模块化设计,往往会出现“改动一个 GPIO 配置,导致整个通信协议栈崩溃”的灾难。通过严格限制全局变量、多用函数接口传递参数,实现高内聚、低耦合,是写出可移植、可复用的嵌入式驱动代码的关键。
3. 优缺点剖析
- 优势:
- 提高 OS 设计的正确性、可理解性和可维护性。
- 增强 OS 的可适应性(易于替换或升级某个模块)。
- 加速 OS 开发过程(各模块可由不同团队并行开发)。
- 劣势:
- 接口设计难:在设计初期,很难完美预测各模块在划分完成后的实际交互需求。
- 决策无序性:OS 设计需要一步步决策,每个决策需建立在上一个决策之上。模块化设计中各模块“齐头并进”,缺乏一条可靠的决定顺序,容易导致系统设计的混乱。
📝 考研级例题演练
【例题 1】 下列关于操作系统模块化结构的叙述中,正确的是( )。
A. 提高模块的耦合度、降低模块的内聚性有利于提高系统的模块独立性
B. 模块化结构的最大问题是难以保证系统的安全性和并行开发性
C. 模块化设计中,由于各模块并行设计,可能导致接口定义无法完全满足实际需求
D. 模块化结构中,每个模块都必须常驻内存以确保接口的快速响应
【解析】
- A 错:应当是提高内聚性、降低耦合度。
- B 错:模块化非常有利于并行开发。
- C 对:这正是模块化结构的典型劣势之一(“理想很丰满,现实很骨感”,设计初期的接口规定很难完美契合后续的实际需求)。
- D 错:模块化是一种逻辑结构,不代表所有模块都要常驻内存。
- 【答案】 C
起承转合:从“平行”到“上下”
由于模块化结构的各个模块处于平行的同级关系,导致调用关系错综复杂,极易形成混乱的“蜘蛛网”结构,且无法理清决策的先后顺序。为了理顺这种调用关系,设计者们引入了具有严格等级观念的模型——分层式结构。
二、 分层式结构 (Layered Structure)
1. 核心概念
分层式结构将操作系统划分为若干个按顺序排列的层(如 )。
- 单向调用法则:其中 为最底层的裸机, 为最顶层的用户接口。每一层只能调用其低一层的功能和服务,而不能逆向调用或跨层调用。
┌────────────────────────────────────────┐
│ Layer N: 用户接口 (User) │
└───────────────────┬────────────────────┘
│ 只允许单向向下调用
┌───────────────────▼────────────────────┐
│ Layer N-1: 进程/存储/设备管理 │
└───────────────────┬────────────────────┘
│
▼
┌────────────────────────────────────────┐
│ Layer 0: 裸机 (Hardware) │
└────────────────────────────────────────┘
2. 优缺点剖析
- 优点:
- 便于调试:自底向上分层调试。当调试第 层时,可以确信其低下的 层均已通过验证,排错极其容易。
- 易于扩充和维护:只要接口不变,某一层的内部实现可以随意替换。
- 缺点:
- 合理定义各层极为困难:层与层之间的边界极难界定。例如:进程管理和存储器管理谁应该在谁上面?进程管理需要存储器分配空间,而存储器管理(如虚拟内存的分页置换)又需要进程调度。它们之间存在循环依赖,很难排出绝对的高低次序。
- 运行效率较差:系统调用需要层层向下传递,每一层都会增加参数传递和上下文转换的开销。
📝 考研级例题演练
【例题 2】 在分层式操作系统结构中,若共有 5 层( 到 , 为硬件, 为用户程序)。当用户程序需要发起一个读取磁盘文件的系统调用时,至少需要经过( )次层间接口调用? A. 1 次 B. 3 次 C. 4 次 D. 5 次
【解析】 根据分层式结构的“单向调用法则”,用户程序位于最高层 ,磁盘读取请求必须穿过其底下的所有层,依次调用:。 这里一共跨越了 4 个层间接口。
- 【答案】 C
起承转合:从“包罗万象”到“极简保留”
分层结构虽然理顺了调用关系,但随着系统功能越来越庞大,内核变得极其臃肿。任何一层出问题,整个操作系统都会崩溃(如“蓝屏”)。为了追求极致的系统安全与可扩展性,学者们提出了将非核心功能全部移出内核的思想——微内核结构。
三、 微内核结构 (Microkernel)
1. 核心概念
微内核结构并非要把内核变小,而是重新界定“什么才应该留在内核中”。
- 微内核 (Microkernel):仅将内核中最基本、最核心的功能保留在内核(如:低级存储器管理、基本进程/线程调度、中断处理、以及进程间通信 IPC)。这些功能常驻内存,运行在内核态(管态)。
- 外部服务器:把操作系统绝大部分非核心功能(如文件系统、网络协议栈、设备驱动等)移出内核,封装成独立的服务器进程,运行在用户态(目态)。
2. 经典交互过程:客户/服务器(C/S)模式
当用户进程(客户)想要读取一个文件时,它不能直接调用内核函数,而是通过微内核提供的消息传递机制(Message Passing)与文件服务器进行交互:
[ 用户空间 (User Space) ]
┌─────────────────┐ ┌─────────────────┐
│ 用户进程 (Client)│ │ 文件服务器 (Server)│
└────────┬────────┘ └────────▲────────┘
1. │ 发起请求 (Msg) │ 3. 消息传递
│ │ (微内核转发)
───────────┼──────────────────────────────┼─────────── [用户/内核边界]
[ 内核空间 (Kernel Space) ] │
2. │ 接收请求 ────────────────────┘
└───────────────► [ 微内核 ]
- 发起请求:应用程序(客户)向微内核发送消息。此时 CPU 从用户态 内核态。
- 消息传递:微内核本身不处理具体的文件读取,它只负责接收消息,并将其转发给运行在用户空间的文件系统服务。此时 CPU 从内核态 用户态。
- 服务处理:文件服务器(进程)解析消息,访问磁盘读取内容,将结果作为响应消息发送给微内核。此时 CPU 从用户态 内核态。
- 接收响应:微内核将响应消息转发给用户进程。此时 CPU 从内核态 用户态。
🚨 手写笔记勘误与科学辨析: “我感觉 Linux 就是这样做的”
修正与科普: 这是一个非常经典且普遍的直觉偏差! 实际上,Linux 是典型的“宏内核”(Monolithic Kernel / 大内核),而不是微内核。
- 为什么会产生这种错觉? > 因为 Linux 支持 动态加载内核模块 (LKM, Loadable Kernel Modules),比如你可以动态加载一个显卡驱动或文件系统模块。这看起来很像微内核“把功能拆开”的机制。
- 本质区别在哪里? Linux 的这些内核模块虽然是动态加载的,但它们一旦加载,完全运行在内核空间(Kernel Space),拥有至高无上的系统权限,且模块间直接通过函数调用交互,效率极高。而微内核的“服务器”(如文件系统)是运行在**用户空间(User Space)**的独立进程,必须通过高开销的消息传递交互。
- 真正的微内核代表: QNX(广泛用于车载安全系统)、Mach(macOS/iOS 内核 XNU 的底层基础)、华为鸿蒙操作系统(HarmonyOS)微内核。
3. 优缺点剖析
- 优势:
- 可扩展性强:添加新功能只需在用户态增加一个服务器进程,无需修改和重新编译内核。
- 高可靠性:若文件服务器崩溃,它只是一个用户态进程,不会导致内核崩溃。重启该服务器即可。
- 可移植性好:与硬件紧密相关的部分极少,移植非常简单。
- 支持分布式系统:消息传递天然支持跨计算机的网络通信。
- 劣势(致命伤):
- 运行效率低:正如上面的通信过程所示,一次简单的服务请求需要经历 4 次用户态/内核态切换 以及 多次进程上下文切换,开销极大。
📝 考研级例题演练
**【例题 3】**单核 CPU 上运行的微内核操作系统中,用户进程 A 想通过文件服务器 B 读取一段数据。
假设 A 和 B 均在用户态运行,微内核采用消息传递机制实现 IPC。
在不考虑出错和缓存命中的情况下,该读取操作至少会引发( )次 CPU 状态(用户态与内核态)的切换?
A. 2 次
B. 4 次
C. 6 次
D. 8 次
【解析】 让我们仔细数一下状态切换的瞬间:
- 进程 A 发送“读文件消息”给微内核:用户态 内核态(第 1 次)
- 微内核将消息转发给文件服务器 B:内核态 用户态(第 2 次)
- 服务器 B 处理完毕,发送“响应数据”给微内核:用户态 内核态(第 3 次)
- 微内核将响应数据转发给进程 A:内核态 用户态(第 4 次) 注:每次消息发送和接收各需要一次状态切换,总计 4 次。
- 【答案】 B
起承转合:从“高层抽象”到“极致放权”
微内核虽然安全,但不管是微内核、宏内核还是分层结构,它们都在做一件事:对硬件资源进行高度抽象(比如把磁盘抽象为“文件”,把物理内存抽象为“虚拟地址空间”)。这种抽象保护了硬件,但对于追求极致性能的某些应用来说,这是一种束缚。有没有一种结构,能把硬件的直接控制权还给应用程序?这就是——外核结构。
四、 外核结构 (Exokernel)
1. 核心概念
外核(Exokernel)的设计理念是“最小化内核,极致放权”。
传统内核就像“标准餐厅”:厨师(内核)掌控所有食材和烹饪方法,顾客(应用)只能看着菜单点菜,无法决定食材怎么处理。 外核则像“自助烧烤/火锅店”:商家(外核)不负责帮你做菜,它只负责把干净的餐具、炭火和安全的生肉(物理资源)分配给你,并确保这些资源是空闲且安全的。至于怎么烤、烤几分熟(如何控制和使用硬件),由你(应用程序)自己决定。
- 核心目标:让应用程序直接请求并控制一块特定的物理资源(如:特定的物理内存地址、特定的磁盘物理扇区)。
- 外核的唯一职责:
- 资源安全保护:确保请求的资源是空闲的,防止各应用程序相互抢夺或破坏对方的物理资源。
- 不作任何高级抽象:不强制提供虚拟内存或文件系统,把这些控制权完全移交给应用程序。
传统的 OS 抽象:
应用程序 ───► [ 虚拟内存 / 文件系统 (OS强制抽象) ] ───► 物理硬件
外核的机制:
应用程序 ───(安全验证)───► 直接操作物理扇区 / 物理内存地址 (No Abstraction!)
▲
└────► [ 外核 (仅做物理资源分配与安全隔离,不干涉如何使用) ]
💡 手写感悟联想: “感觉像 STM32 这样的代码机制就是这样。”
深度共鸣与拓展: 你的直觉非常敏锐且精确! 在 STM32 裸机开发中,我们编写的代码实际上就是在扮演“外核架构下的应用程序”的角色。 当你写下
GPIOA->ODR |= 1 << 5时,你没有通过任何操作系统抽象,而是直接往物理寄存器地址写入数据来控制引脚电平。而单片机芯片里的内存保护单元 (MPU),或者我们人为划分的 Flash 扇区,只负责确保代码不会跑飞、不会越界写到不可写的区域(这对应了外核的“资源安全保护”)。这种直接控制物理资源的方式,带来了零延迟和极高的硬件性能。
2. 优缺点剖析
- 优势:
- 性能达到极致:消除了传统操作系统中虚拟化、抽象层和系统调用的巨大开销。
- 极高的定制灵活性:如果某个数据库应用觉得操作系统的文件系统太慢,它可以绕过文件系统,直接以外核分配的“原始磁盘块”形式写入数据,效率成倍提升。
- 劣势:
- 开发难度极大:由于没有了操作系统的抽象,应用开发者需要自己去写控制底层硬件的代码。
- 可移植性极差:应用高度依赖具体硬件,一旦更换硬件,应用代码可能需要重写。
📝 考研级例题演练
【例题 4】 下列关于外核(Exokernel)结构的叙述中,错误的是( )。 A. 外核的目标是最小化内核,将尽可能多的资源管理权委托给应用程序 B. 在外核操作系统中,应用程序可以直接访问和控制被分配的物理硬件资源 C. 外核结构消除了硬件安全保护机制,完全信任应用程序的自主运行 D. 数据库管理系统在基于外核的 OS 上运行,可以获得比传统 OS 更高的磁盘读写性能
【解析】
- A、B 正确:这正是外核的核心设计理念。
- C 错误:外核虽然放权,但仍然负责确保系统的安全性和稳定性。它通过执行安全策略,防止应用程序滥用未分配给它的资源,或侵占其他应用的物理资源。外核绝对不是不设防的。
- D 正确:因为数据库应用可以避开传统文件系统的缓冲和抽象,直接操作物理磁盘块,极大地提升了 I/O 性能。
- 【答案】 C
💡 总结复习卡片
| 结构名称 | 核心特征 | 优点 | 缺点 | 经典隐喻 |
|---|---|---|---|---|
| 模块化结构 | 按功能拆分,接口交互,同级并行 | 并行开发,易维护 | 接口设计难,决策无序 | 合作社:大家分工干活,但接口扯皮多 |
| 分层式结构 | 单向向下调用,层界严格 | 调试极易,单向依赖 | 层界难分,效率较低 | 公司科层制:下级向上级汇报,严禁跨级 |
| 微内核结构 | 核心留内核,其余全放用户态,C/S 模式 | 可扩展,安全可靠 | 消息传递导致效率低下 | 总代理商:不生产商品,只负责转发订单 |
| 外核结构 | 物理资源直接划分,不设抽象 | 极致性能,极致自由 | 开发极难,丧失可移植性 | 自助烧烤:只提供炉子和肉,自己去烤 |