操作系统:操作系统的结构(Structures of Operating System)
目录
简单结构(Simple Structure)
整体式结构(Monolithic Structure)
什么是 Kernel(内核)?
层次结构(Layered Structure)
微内核结构(Microkernel)
模块化结构(Modular Structure)
操作系统结构对比总结
我们现在来讲讲操作系统的结构(Structures of Operating System),从最基础的 “Simple Structure(简单结构)” 开始,为你打下理解现代操作系统结构的基础。
操作系统结构是指:操作系统内部不同模块、不同程序之间的组织方式和层级安排。
简单结构(Simple Structure)
这是最基础、最早期的操作系统结构形式,没有严格的层级划分,通常直接堆叠使用一些核心模块。
组成部分说明:
1️⃣ ROM BIOS Device Drivers(只读内存中的基本设备驱动)
这部分代码存储在主板的 ROM(Read-Only Memory)中,在电脑刚开机时首先运行。
-
BIOS(Basic Input/Output System):
是最基础的硬件控制程序,用于识别和启动 CPU、内存、硬盘、键盘等设备。 -
含有最底层的 驱动程序(device drivers),比如控制键盘、显示器、硬盘启动等。
类比:它就像电脑的“点火钥匙”与“初始控制中心”。
2️⃣ Device Drivers(设备驱动)
驱动程序是用来控制具体硬件设备的软件模块:
-
控制打印机、鼠标、摄像头、网卡等
-
每个设备都需要一个对应的驱动程序
-
驱动程序是操作系统与硬件之间的桥梁
类比:就像你手机上的蓝牙耳机 App,它让系统可以和耳机通信。
3️⃣ Resident System Programs(常驻系统程序)
这类程序一直驻留在内存中,提供一些基础服务:
-
文件管理(复制/粘贴文件)
-
内存调度
-
I/O 操作管理
-
进程创建与切换等
这些程序构成了操作系统的“主心骨”,负责协调各类资源。
类比:相当于物业管理员,帮助你调度资源、响应事件。
4️⃣ Application Programs(应用程序)
最上层的就是用户直接使用的程序,例如:
-
浏览器、记事本、视频播放器
-
Word、Excel、Photoshop
-
游戏、编辑器等
这些程序依赖下方的系统服务来运行,但本身不属于操作系统核心部分。
类比:是住在大楼里的“用户”,使用操作系统提供的“电、水、暖”等基础服务。
在这种结构:每一层依赖下一层,下一层为上一层提供服务。
虽然结构简单,但这种方式存在严重的问题:
1. 没有模块化(No Clear Separation)
-
各层之间的代码往往混杂在一起
-
比如应用程序可能直接调用硬件指令(不安全)
-
很难在不影响整个系统的情况下修改某一部分
类比:就像一栋没有分区的房子,改一堵墙可能把整个屋顶搞垮。
2. 难以维护与升级
-
如果驱动程序有 bug,可能直接影响整个系统运行
-
增加新功能要改动多个部分,容易出错
-
稍有修改,就可能影响整个系统稳定性
3. 安全性差
-
所有程序运行在同一个级别,没有权限隔离
-
应用程序可以直接操作硬件资源,容易造成破坏或被攻击
类比:任何人都可以开车进银行金库,没有门禁控制。
4. 不适合复杂系统
-
随着功能增多,代码膨胀,系统会变得非常臃肿
-
无法有效支持多用户、多任务等复杂需求
-
结构太“扁平”,功能太“集中”,容易崩溃
整体式结构(Monolithic Structure)
Monolithic Structure(整体式结构) 是一种将操作系统的所有核心功能写在一个统一的大模块(kernel)中的结构方式。所有服务(调度、内存、文件、驱动等)都运行在同一个空间、一个内核程序中。
为什么叫“Monolithic”?
“Monolithic” 的字面意思是“单块的”、“整体的”。
这就像一块大石头,把所有功能(进程管理、内存管理、设备驱动、文件系统等)都包在一起做成一个大内核:
整体式结构的特点:
1. 所有核心服务都运行在内核态(Kernel Mode)
-
内核是一个单独的大程序
-
不划分模块运行层级
-
不同功能之间可以直接调用和通信
举例:内存管理模块可以直接调用文件系统、调度器、设备驱动等。
2. 使用 System Call(系统调用)作为用户与内核之间的接口
-
用户程序无法直接操作硬件
-
但可以通过系统调用(如
read()
,write()
,fork()
)来请求服务 -
系统调用进入内核,由对应模块处理请求
实际例子:
-
UNIX 是最典型的 Monolithic Structure 操作系统
-
Linux 也是整体结构的一个“模块化变种”(Modular Monolithic)
Monolithic 的缺点:
缺点 | 说明 |
---|---|
易出错 | 所有服务共享内核空间,任何一个模块出错都可能导致整个系统崩溃 |
不易维护 | 功能耦合紧密,代码庞大,修改或升级困难 |
安全性低 | 所有模块都能访问系统资源,缺乏隔离保护机制 |
就像一台“功能超级齐全”的机器,但所有零件都焊死在一起,一个齿轮坏了整台机器都停工。
什么是 Kernel(内核)?
Kernel(内核) 是操作系统中最核心的部分,负责直接管理CPU、内存、文件、设备等系统资源,是用户程序和硬件之间的中介和控制中心。
Kernel 是操作系统的“大脑”
你可以把操作系统想象成一个公司,而内核就是这个公司的总经理办公室:
-
程序 = 员工
-
硬件 = 工具资源
-
内核 = 总调度中心,谁做什么、何时做、用哪些资源,全都它说了算!
Kernel 与用户程序的关系
用户程序(浏览器、游戏等)不能直接操作硬件,必须通过内核来“委托”:
应用程序↓ 请求服务
系统调用接口↓
操作系统内核(Kernel) ← 控制 → 硬件设备(CPU、内存等)
Kernel 运行在 特权模式(Kernel Mode)
现代计算机有两种工作模式:Kernel Mode(内核态)和 User Mode(用户态)
这部分内容不再详细介绍,不懂的可以参考:操作系统:系统调用(System Calls)-CSDN博客
层次结构(Layered Structure)
Layered Structure(分层结构) 是把操作系统按照功能模块分成多个“层”,每一层只依赖于它的下一层,像洋葱一样一圈套一圈,结构清晰,便于设计、维护与修改。
为什么提出“层次结构”?
还记得我们讲过:
-
简单结构:代码杂乱、模块无边界、难维护
-
整体式结构:虽然集中,但模块之间依然紧耦合,修改麻烦
于是,人们提出一种更有条理性的方案:
✨ 把操作系统按职责分层,让每一层只做自己该做的事,不能“越权”访问更底层或更高层的内容。
层次结构的基本思路:
-
最底层 → 与硬件最接近(如 CPU、内存)
-
中间层 → 提供核心系统功能(如进程、文件)
-
上层 → 与用户交互(如命令行界面、应用程序)
常见分层结构(示意):
┌────────────────────────────┐
│ Layer 6: User Programs │ ← 用户应用,最上层
├────────────────────────────┤
│ Layer 5: System Calls / API│ ← 提供用户调用接口
├────────────────────────────┤
│ Layer 4: I/O Management │ ← 输入输出、缓冲、打印等
├────────────────────────────┤
│ Layer 3: Memory Management │ ← 内存分配、分页、回收
├────────────────────────────┤
│ Layer 2: Process Management │ ← CPU调度、进程控制
├────────────────────────────┤
│ Layer 1: Device Drivers │ ← 控制硬件设备
├────────────────────────────┤
│ Layer 0: Hardware │ ← 最底层,物理硬件
└────────────────────────────┘
每一层都只使用「下一层提供的功能」
-
Layer 5 调用 Layer 4 提供的服务
-
Layer 2 不能跳过 Layer 1 直接访问硬件
-
每一层都像一个“黑盒”,对上层隐藏实现细节
层次结构的优点:
优点 | 说明 |
---|---|
模块化强 | 每一层功能单一,界限清晰 |
易于调试和维护 | 修改某一层时,不影响其他层 |
安全性高 | 上层不能直接访问下层以下的内容 |
可扩展性好 | 新功能可加到某一层,不影响整体结构 |
缺点:
缺点 | 说明 |
---|---|
实现难度高 | 必须设计好各层之间的接口 |
性能略低 | 每一层都需经过调用,响应时间比 Monolithic 长 |
层间强依赖 | 一层出错可能导致上层全部失效 |
微内核结构(Microkernel)
Microkernel(微内核) 是一种将操作系统核心(Kernel)功能精简到最小,只保留最基本服务(如进程通信、CPU调度、内存管理),其余服务全部移出内核,运行在用户空间 的操作系统结构。
Microkernel 的核心设计思想:
把非核心服务都移出内核,做“最小可运行内核”,提高系统安全性和稳定性。
icrokernel 内部和外部服务的分离
在内核中(核心功能) | 在用户空间(外部服务) |
---|---|
CPU 调度(进程切换) | 文件系统服务 |
内存管理 | 驱动程序(打印机、硬盘等) |
IPC(进程间通信) | 用户界面(GUI、命令行) |
系统调用接口 | 网络协议、权限控制模块 |
🔄 微内核运行流程示意
┌────────────────────────────┐
│ 应用程序(用户空间) │ ← 用户程序 / 驱动 / 文件服务
├────────────────────────────┤
│ 微内核(Kernel Mode) │ ← 只负责通信、调度、内存
├────────────────────────────┤
│ 硬件(CPU, Memory) │
└────────────────────────────┘
所有的外部服务(如文件管理、驱动)通过IPC(Inter-Process Communication,进程间通信)与内核交互。
实际例子:
-
MINIX(微型教学操作系统)
-
QNX(实时操作系统,广泛用于汽车、医疗设备)
-
macOS(部分使用微内核):其核心 XNU 结合了微内核和整体结构
-
L4、Symbian OS(早期手机系统)
微内核结构的优点:
优点 | 说明 |
---|---|
更安全 | 外部服务运行在用户空间,出错不影响系统核心 |
更稳定 | 内核非常小,bug 少、崩溃概率低 |
易于扩展和移植 | 不同模块可独立开发、替换 |
模块化强 | 每个功能像插件一样可卸载、重启 |
缺点:
缺点 | 说明 |
---|---|
性能开销大 | 内核与外部服务需频繁通信(IPC),速度慢于整体结构 |
实现复杂 | 服务拆分、接口通信设计难度高 |
驱动开发难 | 驱动在用户空间运行,调试较复杂 |
类比帮助理解:
Monolithic(整体内核):
就像一个大型百货商场,所有服务都集中在一栋楼里,方便但一旦失火(系统崩溃),整栋楼就瘫了。
Microkernel(微内核):
像一个分布式小镇,政府只负责调度交通和治安(调度 + 通信),其他功能(商店、医院、学校)都是独立运行的,哪个坏了不影响其他。
模块化结构(Modular Structure)
模块化结构是一种“整体式内核 + 模块化管理”的结构,内核支持将功能划分为多个独立的模块,这些模块可以在需要时动态加载或卸载,既保持了执行效率,又提高了灵活性与可维护性。
背景:为什么需要“模块化”?
在我们之前讲的 Monolithic Structure 中:
-
所有功能(进程管理、文件系统、驱动程序)都写死在一个大内核里
-
改一个模块,必须重新编译整个内核
-
不方便扩展,也难调试
于是提出一种改进思路:
➕ 把内核划分为功能模块,可按需加载或卸载,不用重启系统、不用重编内核!
模块是怎么工作的?
-
系统运行中,只有“需要的模块”才被加载进内核
-
加载/卸载可以动态进行(无需重启)
-
内核提供专门的命令或接口来管理模块(例如 Linux 的
insmod
、rmmod
)
类比:像一个智能手机系统,相机、GPS、蓝牙这些功能都是“插件”——用时开启,不用时关闭,省资源还不怕崩溃。
结构示意
┌────────────────────────────┐
│ 用户程序(User Programs) │
├────────────────────────────┤
│ 系统调用接口(Syscalls)
├────────────────────────────┤
│ 模块化内核(Modular Kernel │
│ ├─ 核心内核功能(调度、内存 │
│ ├─ 可加载模块(驱动、文件系统│
└────────────────────────────┘
内核模块的例子:
模块类型 | 举例说明 |
---|---|
驱动模块 | 如鼠标驱动、声卡驱动、网卡驱动 |
文件系统模块 | 如 ext4、NTFS、FAT32 |
网络协议模块 | TCP/IP、UDP、ICMP |
安全模块 | 防火墙、SELinux 模块等 |
实际例子:Linux 内核
-
Linux 是一个 Monolithic Kernel,但它的实现是模块化的
-
它支持大量 Loadable Kernel Modules(LKM),包括:
-
文件系统
-
设备驱动
-
网络协议
-
系统监控插件
-
模块化结构的优缺点:
优点 | 说明 |
---|---|
高模块化 | 各模块独立,界限清晰,便于维护 |
易于扩展 | 加载新模块无需改动核心内核 |
易于测试与调试 | 出问题只需卸载该模块,不影响内核整体 |
性能优于 Microkernel | 各模块仍运行在内核态,无需频繁 IPC |
缺点 | 说明 |
---|---|
模块出错仍可能影响系统 | 因为模块运行在内核态,仍有全局访问权限 |
安全性不如微内核 | 没有完全的隔离机制,模块崩溃可能拖垮系统 |
相较于微内核,耦合仍较强 | 核心仍比较大,非最小核心系统 |
类比帮助理解:
-
Monolithic Kernel:一个功能强大的“大仓库”,所有东西都装在一起
-
Modular Kernel:一个可以加挂插件的“模块化仓库”
-
Microkernel:一个超简仓库,其他功能都外包出去(不自己做)
操作系统结构对比总结
特征/结构类型 | Simple Structure(简单结构) | Monolithic Structure(整体结构) | Layered Structure(层次结构) | Microkernel(微内核) | Modular Structure(模块化结构) |
---|---|---|---|---|---|
核心设计思想 | 没有明确分层,功能杂糅 | 所有功能集中在一个大内核中 | 操作系统功能划分为多个层次 | 只保留最小内核,其它服务运行在用户空间 | 内核功能模块化,按需加载/卸载 |
模块划分清晰度 | ❌ 极低 | ⛔ 较差(全在一起) | ✅ 明确分层 | ✅ 极高 | ✅ 高(但仍属内核空间) |
运行效率 | ✅ 高(简单无切换) | ✅ 很高(无需进程间通信) | 较低(层层调用) | 慢(IPC 通信频繁) | ✅ 高(可扩展又高效) |
安全性与稳定性 | ❌ 极低 | ⛔ 较低(一个模块崩溃拖全系统) | ✅ 较高(层隔离) | ✅ 极高(服务在用户空间) | ✅ 中等偏上 |
易维护/易扩展 | ❌ 差 | ⛔ 差(耦合紧密) | ✅ 容易 | ✅ 最容易 | ✅ 非常方便 |
开发难度 | ✅ 简单 | ✅ 一般 | ⛔ 高(接口定义复杂) | ⛔ 高(服务分散、通信设计难) | ✅ 中等 |
示例系统 | MS-DOS, CP/M | UNIX, Linux (早期) | THE OS, MULTICS | MINIX, QNX, Symbian | Linux(现代), Windows NT |
服务位置 | 所有功能写死在系统中 | 所有功能集中在内核 | 分层管理,逐层调用 | 内核只做调度+通信,其它功能外部运行 | 核心功能 + 可加载模块 |
内核大小(功能集中度) | 很大或无结构 | 非常大 | 中等 | 极小(最小功能内核) | 中等 |
五种结构一图总结:
Simple → 所有代码混在一起,没有分工
Monolithic → 所有功能集中在一个内核程序里
Layered → 功能按层级划分,每层只调用下层
Microkernel → 只保留调度、通信,其它功能外包出去
Modular → 核心内核 + 可加载模块(组合式结构)
使用场景建议(理解+选择):
需求场景 | 推荐结构 | 原因说明 |
---|---|---|
小型嵌入式设备 | Microkernel / Modular | 更安全、更稳定、易于维护 |
教学 / 实验系统 | Simple / Layered | 结构易理解,适合演示系统原理 |
高性能服务器系统 | Modular / Monolithic | 性能要求高,模块化扩展能力强,响应快 |
商业桌面操作系统 | Hybrid / Modular | 灵活、安全与性能的平衡 |
实时系统(航天/汽车) | Microkernel | 模块独立,崩溃不会影响核心系统,适合关键任务系统 |