适用场景:软考备考复习 | 知识体系梳理
笔记定位:原理理解 + 知识框架,少量图示辅助区分易混概念


前言:操作系统到底在管什么

操作系统本质上是计算机硬件资源的大管家,它把复杂的物理硬件封装起来,向上提供清晰、统一的使用接口。

操作系统知识
它管理四类核心资源,对应四大模块:

资源类型 管理模块 核心要解决的问题
CPU 执行时间 进程管理 谁用 CPU、用多久、怎么切换
物理内存 存储管理 内存怎么分配、地址怎么翻译、内存不够怎么办
I/O 设备 设备管理 怎么屏蔽硬件差异、怎么高效传输数据
磁盘数据 文件管理 数据怎么存、怎么找、怎么防止丢失

一、进程管理(CPU 资源调度)

进程管理是操作系统的心脏,解决的核心矛盾是:CPU 只有一个(或有限核心),但并发运行的程序有几十上百个,怎么分?怎么切?切的时候怎么保证数据不乱?

1. 用户态 vs 内核态

  • 用户态:普通程序在此运行,权限受限,不能直接操作硬件。
  • 内核态:操作系统内核在此运行,拥有最高权限,可以直接操作硬件。

系统调用是用户态程序主动请求内核服务的唯一合法途径(如读写文件、创建进程)。printf 最终会触发 write 系统调用,CPU 切换到内核态执行驱动逻辑,完成后再切回用户态。

2. 进程 vs 程序 vs 线程

  • 程序:硬盘上的静态二进制文件。
  • 进程:程序被加载到内存中执行的动态实例,拥有独立的内存空间。
  • PCB(进程控制块):进程在内核中的“身份证”,记录状态、优先级、寄存器快照等。

进程与线程
进程与线程的关系

  • 进程是资源分配的基本单位(拥有独立内存空间、文件句柄)。
  • 线程是 CPU 调度的基本单位(共享进程资源,只有各自的栈和寄存器上下文)。
  • 线程切换开销远小于进程切换(不需要切换页表)。

3. 进程五状态

进程在其生命周期中会经历多个状态,理解状态转换是理解调度和并发的基础。
进程状态的转换

  • 就绪态:万事俱备,只欠 CPU。
  • 运行态:正在 CPU 上执行指令。
  • 阻塞态:因等待 I/O、信号量等事件放弃 CPU,事件完成后回到就绪态。

易错点:运行态→阻塞态是主动行为(如调用 read);运行态→就绪态是被动行为(时间片耗尽)。阻塞态不能直接到运行态,必须经过就绪态排队。

4. 前趋图与 PV 操作

前趋图
前趋图是有向无环图(DAG),描述进程间的执行顺序约束:A → B 表示 A 必须先于 B 完成,无箭头的进程可以并发执行。

实际工程中用信号量(PV 操作) 来实现这种约束:
PV操作

  • P 操作:申请资源,信号量值减 1,若结果 < 0 则阻塞当前进程。
  • V 操作:释放资源,信号量值加 1,若有进程在等待则唤醒其中一个。

5. 进程调度算法

算法 优点 缺点
FCFS(先来先服务) 公平、实现简单 短作业被长作业拖死(护航效应)
SJF(短作业优先) 平均等待时间最优 长作业可能饥饿
时间片轮转 响应快,适合交互式系统 时间片大小难调
优先级调度 可区分任务重要性 低优先级可能饥饿

现代操作系统(Linux、Windows)实际使用多级反馈队列,综合了上述多种策略。

6. 死锁

死锁的本质是资源互相等待形成闭环,所有人阻塞,系统僵死。经典的死锁场景是两个进程各自持有一把锁,同时等待对方手里的另一把锁:
死锁

四个必要条件(必须同时满足):

  1. 互斥:资源不能同时共享。
  2. 请求与保持:已占有一些资源,又在等待新的资源且不释放。
  3. 不可抢占:已分配的资源不能被强制夺走。
  4. 循环等待:存在进程等待链条,形成环形依赖。

应对策略:预防(破坏条件)、避免(银行家算法)、检测与恢复(杀进程)、鸵鸟策略(重启解决,PC 操作系统默认)。


二、存储管理(内存资源管理)

核心问题:物理内存有限,怎么让多个进程正常运行?怎么让程序觉得内存是连续、充足的?

1. 分区存储管理(早期方案)

  • 固定分区:内存切成固定大小区域,每个进程占一个。简单,但有内部碎片
  • 动态分区:按进程实际需求动态切分,多次分配回收后产生大量外部碎片

2. 分页存储管理(消除外部碎片)

核心思想:物理内存切成等大的页框,逻辑地址切成等大的页面,通过页表建立映射,页面可分散在不同页框中。

  • 逻辑地址格式:[页号 | 页内偏移],页面大小 4KB → 偏移占 12 位。
  • TLB(快表) 缓存页表项,加速地址转换。

虚拟内存 + 缺页中断:程序运行时只有部分页面在物理内存中,其余在磁盘上。访问到不在内存的页面时触发缺页中断,操作系统从磁盘加载。若内存已满,需淘汰一个页面。

页面置换算法

算法 思路 问题
FIFO 淘汰最早进入的页面 Belady 异常
LRU 淘汰最久未使用的页面 实现成本高
Clock(时钟算法) 环形扫描检查访问位 Linux 采用类似方案

3. 分段存储管理(按逻辑切分)

按代码段、数据段、堆栈段划分,每段连续存放,长度不一。优点:符合程序员视角,段可独立共享和设置权限。缺点:存在外部碎片。

4. 段页式存储管理(现代主流)

先分段、再分页:段表查段基址,再查页表找物理页框。综合了分段(逻辑清晰、共享方便)和分页(无外部碎片)的优点。


三、设备管理(I/O 外部设备管理)

目标:让上层应用能统一、高效地操作各类硬件外设。

1. 设备分类

类型 特征 例子
独占设备 同一时刻只能一个进程使用 打印机
共享设备 多个进程可交替访问 硬盘
虚拟设备 通过软件将独占设备模拟成共享设备 SPOOLing 打印机

2. 设备独立性

应用程序使用逻辑设备名(如 LPT1),操作系统负责映射到实际物理设备。更换硬件后只需改映射表,程序无需重新编译。

3. I/O 软件层次结构(自顶向下)

 I/O 软件层次结构(自顶向下)
用户层(系统调用)→ 设备独立层(统一接口、缓冲区)→ 设备驱动程序(硬件指令)→ 中断处理程序(硬件完成后通知内核)

4. I/O 控制方式演进

方式 工作方式 CPU 占用 适用场景
程序查询 CPU 轮询检测 极高 简单嵌入式
中断驱动 硬件完成后发中断 中等 键盘、鼠标
DMA DMA 控制器直接搬运数据 极低 硬盘、SSD、网卡

硬盘读写必须用 DMA,否则 CPU 会被数据搬运占满。

5. 关键设备管理技术

  • 缓冲技术:内存中开辟缓冲区,缓解 CPU 和外设的速度鸿沟。
  • SPOOLing(假脱机):利用磁盘缓冲区,将独占打印机改造为共享设备。
  • 磁盘调度算法:SSTF(最短寻道优先,易饥饿)、SCAN(电梯算法,公平性好,实际系统广泛使用)。

四、文件管理(磁盘数据持久化管理)

管理断电后数据依然存在的存储——硬盘、SSD 上的数据组织方式。

1. 文件类型与操作

  • 流式文件:无结构字节流(文本文件、二进制文件)。
  • 记录式文件:结构化数据(数据库表文件)。

基础操作:创建、删除、打开、关闭、读、写。打开时内核把文件元数据(inode)加载到内存,返回文件描述符(fd)。

2. 文件在磁盘上的分配方式

方式 优点 缺点
连续分配 读写速度快 产生磁盘碎片,扩容困难
链接分配 无碎片,扩容方便 随机访问慢,指针占空间
索引分配 随机访问快 索引块占空间,大文件需多级索引

3. Unix 混合索引

inode 结构同时兼顾小文件和大文件的访问效率:

┌─────────────┐
│  直接索引×12 │ ─→ 直接指向数据块(小文件一次查表)
├─────────────┤
│  一级间接索引 │ ─→ 指向索引块 → 再指向数据块
├─────────────┤
│  二级间接索引 │ ─→ 指向索引块 → 索引块 → 数据块
├─────────────┤
│  三级间接索引 │ ─→ 支持超大文件(TB 级别)
└─────────────┘
  • 小文件(如几 KB 的配置文件):直接索引搞定,访问速度最快。
  • 大文件(如几 GB 的视频):通过多级间接索引逐层扩展,容量上限极大。

4. 目录结构

目录本质是 文件名 → inode 号 的映射表。

  • 单级目录:所有文件一张表,重名冲突。
  • 两级目录:每人一个独立目录,不同用户可同名。
  • 树形目录(现代标准):多级分层,支持绝对路径(从 / 开始)和相对路径(从当前目录开始)。

硬链接 vs 软链接:硬链接是同一 inode 的多个文件名引用,删除原文件不影响其他硬链接;软链接是独立文件,存目标路径字符串,目标删除后失效。

5. 空闲存储空间管理

方案 原理 特点
位示图 每个磁盘块对应 1 bit(0=空闲,1=已用) 简单高效,主流方案
空闲链表 所有空闲块串成链表 分配回收简单,遍历慢
成组链接法 分组管理,每组记录下一组位置 Unix 经典方案

五、四大模块的逻辑串联

四个模块通过一个完整的 I/O 路径串联起来:
四大模块逻辑串联
用户程序在进程管理调度下获得 CPU → 访问数据时存储管理进行地址转换 → 若数据不在内存则触发缺页中断,文件管理从磁盘加载 → 若数据来自外设则设备管理通过 DMA/中断搬运 → 最终 CPU 继续执行后续指令。

操作系统的四大模块,本质上是围绕数据在计算机硬件体系中的流动路径来组织管理职能的。


写在最后

这份笔记的目标是建立清晰的知识骨架。记住:

学操作系统,最重要的是理解“为什么要这样设计”——每一个机制背后都有一个具体的硬件约束或工程痛点。

如果你能用自己的话解释清楚:分页解决了什么问题、为什么需要虚拟内存、DMA 比中断好在哪里、inode 为什么能兼顾小文件和大文件,那这部分知识就算真正消化了。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐