第2讲 操作系统结构

第2讲 操作系统结构
agsd第2讲:操作系统结构学习指南
0. 本讲主线
操作系统很复杂,它要管理:
- CPU
- 内存
- 文件系统
- 设备驱动
- 网络
- 进程与线程
- 安全隔离
所以问题不是“OS 有哪些功能”,而是:
这些功能应该如何组织,才能既高效、又可靠、又方便扩展?
❗ 本讲核心结论:
操作系统结构的本质,是为了控制复杂性。不同结构的区别,主要体现在“哪些功能放在内核态,哪些功能放在用户态,以及模块之间如何通信”。
1. 为什么操作系统需要结构?
复杂系统如果只堆功能,很容易失控。
课件用瓦萨沉船、N1 火箭之类的例子说明:功能越多不等于系统越强,结构不合理时,功能越多反而越危险。
操作系统也是一样。
如果一个 OS 把所有功能随便堆在一起,就会出现:
- 一个模块出错,可能拖垮整个系统;
- 模块之间耦合严重,难以修改;
- 新硬件、新需求出现时,扩展困难;
- 安全边界模糊,应用可能互相干扰。
所以,OS 结构设计的目标是:
让复杂功能可以被管理、维护、隔离和扩展。
❗ 本节核心结论:
OS 结构不是为了“看起来高级”,而是为了让庞大的系统保持可控。
2. 操作系统设计中的目标冲突
OS 同时面对两类目标。
| 目标类型 | 关注点 |
|---|---|
| 用户目标 | 好用、稳定、安全、流畅、功能完整 |
| 系统目标 | 易实现、易维护、高效、可靠、可扩展 |
问题在于:这些目标经常冲突。
例如:
- 安全隔离越强,性能可能越差;
- 抽象越统一,可能越难发挥硬件极限性能;
- 功能越多,系统越复杂;
- 兼容性越强,系统负担越重。
所以操作系统结构设计,本质上是工程权衡。
❗ 本节核心结论:
操作系统没有“完美结构”,只有针对不同目标做出的取舍。
3. 策略与机制分离
这是本讲最重要的思想之一。
3.1 机制是什么?
机制回答的是:
怎么做?
比如调度系统中的机制包括:
- 调度队列
- 线程控制块
- 时钟中断
- 上下文切换
- 调度器入口
这些是底层工具,通常比较稳定。
3.2 策略是什么?
策略回答的是:
按什么规则做?
比如调度策略包括:
- 先来先服务 FCFS
- 时间片轮转 RR
- 优先级调度
- 最早截止时间优先 EDF
这些规则可以根据场景变化。
3.3 为什么要分离?
因为:
- 机制底层,改动代价大;
- 策略上层,应该更灵活;
- 好的系统应该允许“机制稳定,策略可换”。
例如,调度系统不应该把“只能使用时间片轮转”写死,而应该提供通用调度机制,让不同调度策略可以替换。
❗ 本节核心结论:
机制是工具,策略是规则。好的 OS 设计应该让底层机制稳定,让上层策略灵活变化。
4. M.A.L.H. 原则
课件提出四个结构化原则:
| 原则 | 含义 | 例子 |
|---|---|---|
| Modularity 模块化 | 把大系统拆成小模块 | 进程管理、内存管理、文件系统、设备驱动 |
| Abstract 抽象 | 只暴露接口,不暴露内部细节 | open()、read()、write() |
| Layering 分层 | 上层建立在下层能力之上 | 应用层 → 系统调用层 → 文件系统层 → 驱动层 |
| Hierarchy 层级 | 整体与部分的组织关系 | OS → 内存管理 → 虚拟内存 → 页表管理 |
分层 vs 层级
这两个容易混。
| 概念 | 重点 |
|---|---|
| 分层 Layering | 强调上下依赖关系 |
| 层级 Hierarchy | 强调整体和部分的包含关系 |
例如:
1 | 应用程序 |
这是分层。
而:
1 | 操作系统 |
这是层级。
❗ 本节核心结论:
模块化、抽象、分层、层级,都是为了降低复杂系统的理解和维护成本。
5. 为什么需要内核?
核心问题是:
为什么不能让每个应用程序直接控制硬件?
答案是:多个应用要共享硬件资源。
例如:
- 多个程序都要用 CPU;
- 多个程序都要申请内存;
- 多个程序都要读写磁盘;
- 多个程序都要使用网卡。
如果没有内核统一管理,应用之间会互相干扰。
比如微信和飞书都要用网卡。如果应用能直接控制网卡,就可能出现:
- 一个程序霸占网卡;
- 一个程序读到另一个程序的数据;
- 一个程序错误操作导致整个设备异常。
所以内核的核心职责是:
管理硬件资源,并隔离不同应用程序。
❗ 本节核心结论:
内核存在的根本原因,是多个应用共享硬件时需要统一管理和安全隔离。
6. 操作系统结构总览图
flowchart TD
A[操作系统结构] --> B[简要结构]
A --> C[宏内核]
A --> D[微内核]
A --> E[混合内核]
A --> F[外核]
A --> G[多内核]
C --> C1[大量服务在内核态]
D --> D1[核心机制在内核态<br/>服务放用户态]
E --> E1[吸收微内核思想<br/>性能敏感部分回到内核态]
F --> F1[内核只管资源保护<br/>抽象交给 LibOS]
G --> G1[每个 core 一个小内核<br/>通过消息通信]
这张图的重点是:不同结构的核心差异在于 功能放在哪里,以及模块如何通信。
7. 简要结构
简要结构可以理解为:
OS 和应用程序像一个大程序。
特点:
- 没有完善内存管理;
- 没有清晰特权级隔离;
- 应用和 OS 边界不清;
- 函数调用快;
- 但一个地方崩了,整个系统可能崩。
典型例子:MS-DOS。
它的优点是简单、快;缺点是安全性和可靠性差。
❗ 本节核心结论:
简要结构性能和实现都简单,但隔离性很差,适合早期简单环境,不适合现代复杂系统。
8. 宏内核 Monolithic Kernel
宏内核的核心思想是:
大部分 OS 功能都放在内核态。
包括:
- 文件系统
- 内存管理
- 设备驱动
- 进程调度
- IPC
- 网络协议栈
典型例子:Linux。
优点
宏内核的最大优点是性能好。
因为很多模块都在内核态,模块之间可以直接函数调用。
例如:
1 | 文件系统 → 磁盘驱动 |
在宏内核中,这可能只是内核内部的一次函数调用。
缺点
缺点是内核太大,耦合太强。
如果设备驱动写错了,可能导致整个内核崩溃。
所以宏内核的问题不是“落后”,而是:
当系统越来越复杂时,宏内核的可靠性和维护压力会变大。
❗ 本节核心结论:
宏内核用更强的集中管理换取性能,但代价是内核庞大、耦合强、故障影响范围大。
9. 微内核 Microkernel
微内核的核心思想是:
内核越小越好。
它只把最核心的机制留在内核态,例如:
- IPC
- 基本进程管理
- 基本地址空间管理
- 基本调度机制
其他功能放到用户态作为服务运行,例如:
- 文件系统服务
- 驱动服务
- 网络服务
微内核中的访问过程
宏内核中可能是:
1 | 应用 → 系统调用 → 内核文件系统 → 磁盘驱动 |
微内核中可能变成:
1 | 应用 → IPC → 文件系统服务 → IPC → 驱动服务 → IPC → 微内核/硬件 |
优点
微内核更强调:
- 安全性
- 可靠性
- 可扩展性
- 可移植性
因为服务在用户态,某个服务崩溃时,不一定拖垮整个系统。
缺点
微内核的主要问题是性能开销。
因为原来的函数调用变成了 IPC,而 IPC 涉及:
- 用户态/内核态切换;
- 消息传递;
- 权限检查;
- 调度开销。
❗ 本节核心结论:
微内核用 IPC 和用户态服务换取安全与可靠,但牺牲了一部分性能。
10. 混合内核 Hybrid Kernel
混合内核是现实妥协。
它吸收微内核思想,但又把性能敏感的模块放回内核态。
典型例子:
- Windows NT
- macOS / iOS
混合内核的思路是:
能放用户态的尽量放用户态,但性能敏感部分仍然放在内核态。
所以它不是纯粹微内核,也不是传统宏内核,而是折中。
❗ 本节核心结论:
混合内核说明现实系统通常不会完全追求架构纯粹性,而会在结构清晰和运行性能之间妥协。
11. 外核 Exokernel
外核比微内核更激进。
它的核心思想是:
内核不应该替应用提供高级抽象。
传统 OS 会提供:
- 文件
- 进程
- 虚拟内存
- socket
但外核认为:只有应用自己最知道自己需要什么抽象。
所以外核只负责:
- 资源绑定;
- 资源保护;
- 资源回收;
- 应用隔离。
真正的 OS 抽象交给应用旁边的 LibOS。
LibOS 是什么?
LibOS 是库操作系统。
它像一个库一样和应用链接在一起,为应用提供文件、内存、网络等抽象。
结构大概是:
1 | 应用 + LibOS |
优点
- 理论性能高;
- 应用可以高度定制;
- 适合特殊场景优化。
缺点
- 生态困难;
- 兼容性差;
- 应用自己管理资源,复杂度高;
- 通用性不如传统 OS。
❗ 本节核心结论:
外核把抽象权交给应用,用定制化换性能,但牺牲通用性和生态。
12. 多内核 Multikernel
多内核是为了应对现代硬件复杂化。
现代机器不只是一个 CPU,而是可能包括:
- 多核 CPU
- GPU
- NPU
- 智能网卡
- 其他加速器
这些硬件越来越像一个小型分布式系统。
多内核的核心思想是:
不要默认共享状态,而是默认划分状态。
传统 OS 中,多个 CPU 核共享很多内核数据结构,会带来:
- 锁竞争;
- cache 一致性压力;
- 共享状态维护成本。
多内核则让:
- 每个 core 上运行一个小内核;
- 小内核之间通过消息通信;
- 整个 OS 像分布式系统一样协作。
典型例子:
- Barrelfish
- Popcorn Linux
❗ 本节核心结论:
多内核把 OS 看成分布式系统,是为了解决多核和异构硬件带来的共享状态问题。
13. 各类结构对比表
| 架构 | 核心思想 | 优点 | 缺点 | 典型例子 |
|---|---|---|---|---|
| 简要结构 | OS 和应用像一个大程序 | 快、简单 | 不安全,容易整体崩溃 | MS-DOS |
| 宏内核 | 大量 OS 功能在内核态 | 性能好,生态强 | 内核庞大,可靠性压力大 | Linux |
| 微内核 | 内核最小化,服务放用户态 | 安全、可靠、易扩展 | IPC 开销大 | seL4、QNX、MINIX |
| 混合内核 | 宏内核和微内核折中 | 兼顾性能与结构 | 复杂,不够纯粹 | Windows NT、macOS |
| 外核 | 内核不提供高级抽象,交给 LibOS | 高度定制,理论性能高 | 维护和兼容困难 | Exokernel、Unikernel |
| 多内核 | OS 当成分布式系统 | 适合多核异构 | 实现复杂,生态弱 | Barrelfish、Popcorn Linux |
14. Android 系统结构怎么理解?
Android 不能简单说成微内核。
它底层使用 Linux 内核,所以身体上是宏内核。
但 Android 上层大量系统服务通过 Binder IPC 通信,例如:
- Activity Manager
- Window Manager
- Service Manager
- 其他系统服务
所以 Android 有微内核式的服务化思想。
可以这样理解:
1 | Android 应用 |
❗ 本节核心结论:
Android 底层是 Linux 宏内核,但上层系统服务通过 Binder IPC 组织,体现了微内核式的服务化思想。
15. 最容易混淆的点
1. 宏内核不是落后
Linux 是宏内核,但仍然非常成功。
原因是:
- 性能强;
- 生态强;
- 工程积累深;
- 可通过模块化、权限控制、内核模块等方式缓解部分问题。
2. 微内核不是一定不能用
早期微内核 IPC 开销较大,但后来的 L4、seL4 等系统对 IPC 做了大量优化。
微内核常适合:
- 高可靠场景;
- 安全关键系统;
- 实时系统;
- 嵌入式系统。
3. 外核不是没有内核
外核仍然有内核。
只是它不提供高级抽象,而是负责底层资源保护和绑定。
4. 多内核不是普通多核 OS
Linux 可以跑在多核 CPU 上,但这不等于它是多内核。
多内核强调:
每个 core 上运行一个 OS node,OS 整体通过消息通信协作。
5. Android 不是微内核
Android 底层是 Linux,所以不是微内核。
但它的 Binder IPC 和系统服务化设计,确实有微内核思想。
16. 自测题
题 1:为什么复杂系统必须考虑结构?
因为复杂系统中目标会冲突,模块会增多,代码规模会扩大。如果没有合理结构,系统会难维护、难扩展、难保证可靠性。OS 同时管理 CPU、内存、磁盘、网络、进程、安全等资源,所以尤其需要结构。
题 2:什么是策略与机制分离?
机制是“怎么做”,策略是“按什么规则做”。
例如调度中:
- 机制:调度队列、时钟中断、上下文切换;
- 策略:时间片轮转、优先级调度、EDF。
分离的好处是底层机制稳定,上层策略灵活可换。
题 3:宏内核为什么性能好?
因为大量 OS 服务都在内核态,模块之间可以直接函数调用,通信开销低。
题 4:微内核为什么更安全、更可靠?
因为它把大量 OS 服务放到用户态,不同服务之间有进程隔离。某个服务崩溃时,不一定导致整个内核崩溃。
题 5:微内核的主要性能问题是什么?
主要问题是 IPC 开销。
原来宏内核里的函数调用,在微内核中变成了用户态服务之间的 IPC,涉及上下文切换、消息传递和权限检查。
题 6:外核和微内核的区别是什么?
微内核仍然提供一些统一系统服务,只是把服务放到用户态。
外核更极端,它尽量不提供高级硬件抽象,只负责资源绑定、保护和回收,把抽象交给应用自己的 LibOS。
题 7:多内核为什么把 OS 看成分布式系统?
因为现代硬件中有多个 CPU 核、GPU、NPU、智能网卡等异构计算单元。如果所有核心共享大量状态,会带来锁竞争和 cache 一致性压力。因此多内核选择每个 core 运行一个小内核,通过消息通信协作。
题 8:Windows NT、Linux、macOS 分别属于什么结构?
- Windows NT:混合内核
- Linux:宏内核
- macOS:混合内核,基于 XNU,结合 Mach 和 BSD 思想
17. 最终记忆版
这讲可以压缩成下面几句话:
操作系统结构 = 控制复杂性的办法。
复杂系统需要:
- 策略与机制分离;
- 模块化;
- 抽象;
- 分层;
- 层级。
内核存在的原因是:
多个应用共享硬件,所以需要统一管理和隔离。
不同结构的核心区别是:
| 架构 | 一句话记忆 |
|---|---|
| 宏内核 | 功能集中在内核态,性能好,但内核庞大 |
| 微内核 | 内核最小化,服务放用户态,可靠但 IPC 开销大 |
| 混合内核 | 现实折中,兼顾性能和结构 |
| 外核 | 内核只管资源,抽象交给 LibOS |
| 多内核 | 面向多核异构,把 OS 当成分布式系统 |
| Android | 底层 Linux 宏内核,上层服务化,有微内核思想 |
❗ 最终核心结论:
学这讲不要只背“Linux 是宏内核、Windows 是混合内核”。真正要掌握的是:每种结构为什么出现,它解决了什么问题,又牺牲了什么。



