第2讲 操作系统结构

第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
2
3
4
5
6
7
8
9
10
11
应用程序

系统调用

文件系统

块设备层

磁盘驱动

硬件

这是分层。

而:

1
2
3
4
5
6
7
操作系统
├── 内存管理
│ ├── 虚拟内存
│ ├── 页表管理
│ └── 页面置换
├── 文件系统
└── 进程管理

这是层级。


本节核心结论:
模块化、抽象、分层、层级,都是为了降低复杂系统的理解和维护成本。

5. 为什么需要内核?

核心问题是:

为什么不能让每个应用程序直接控制硬件?

答案是:多个应用要共享硬件资源。

例如:

  • 多个程序都要用 CPU;
  • 多个程序都要申请内存;
  • 多个程序都要读写磁盘;
  • 多个程序都要使用网卡。

如果没有内核统一管理,应用之间会互相干扰。

比如微信和飞书都要用网卡。如果应用能直接控制网卡,就可能出现:

  • 一个程序霸占网卡;
  • 一个程序读到另一个程序的数据;
  • 一个程序错误操作导致整个设备异常。

所以内核的核心职责是:

管理硬件资源,并隔离不同应用程序。


本节核心结论:
内核存在的根本原因,是多个应用共享硬件时需要统一管理和安全隔离。

6. 操作系统结构总览图

这张图的重点是:不同结构的核心差异在于 功能放在哪里,以及模块如何通信

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
2
3
4
5
6
7
应用 + LibOS
应用 + LibOS
应用 + LibOS

Exokernel

硬件

优点

  • 理论性能高;
  • 应用可以高度定制;
  • 适合特殊场景优化。

缺点

  • 生态困难;
  • 兼容性差;
  • 应用自己管理资源,复杂度高;
  • 通用性不如传统 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Android 应用

Android 应用框架

系统服务

Binder IPC

Android Runtime / Android 库

硬件抽象层 HAL

Linux 内核

硬件

本节核心结论:
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 是混合内核”。真正要掌握的是:每种结构为什么出现,它解决了什么问题,又牺牲了什么。