操作系统期末复习笔记 MARKDOWN格式

操作系统期末复习笔记


目录

  1. 第1-2章:操作系统概述
  2. 第3章:程序结构
  3. 第4章:线程与调度
  4. 第5章:内存管理
  5. 第6章:文件系统
  6. 第7章:I/O系统
  7. 第8章:并发与同步
  8. 第9章:进程间通信(IPC)

占位图

第1-2章:操作系统概述

1.1 抽象概念

概念 说明
时间共享(Time-sharing) 多个任务分时复用同一资源,如CPU时间片轮转
空间共享(Space-sharing) 多个任务同时占用不同空间,如内存分区

1.2 计算模型

  • 图灵机模型:理论计算模型,由无限长纸带、读写头和状态控制器组成
  • 冯·诺依曼架构 :存储程序概念,指令和数据存放在同一存储器中
    • 五大部件:运算器、控制器、存储器、输入设备、输出设备

1.3 计算机系统构成

复制代码
计算机系统 = 硬件(CPU + 内存 + I/O设备)+ 软件(操作系统 + 应用程序)

1.4 指令执行周期

复制代码
取指(Fetch)→ 译码(Decode)→ 执行(Execute)→ 写回(Writeback)

1.5 8086分段式内存管理

概念 说明
逻辑地址 程序员可见的地址,形式为 段选择子:偏移量
线性地址 通过分段单元转换后的地址
物理地址 实际访问内存的地址

地址生成公式:

复制代码
线性地址 = 段基址 << 4 + 偏移量

1.6 寻址方式

寻址方式 说明 示例
寄存器寻址 操作数在寄存器中 mov ax, bx
内存寻址 操作数在内存中 mov ax, [addr]
立即数寻址 操作数在指令中 mov ax, 1234h

1.7 I/O设备

  • 设备通过数据寄存器状态寄存器命令寄存器与CPU通信

1.8 I/O方法

方法 说明 特点
直接I/O CPU直接控制设备 简单但CPU利用率低
轮询(Polling) CPU不断检查设备状态 忙等,浪费CPU
中断(Interrupt) 设备完成时通知CPU 提高效率,异步
DMA 直接内存访问,设备直接读写内存 高效,CPU仅参与开始和结束

1.9 处理器特权级别

级别 说明 特点
用户态(User Mode) 运行用户程序 权限受限,不能执行特权指令
内核态(Kernel Mode) 运行操作系统内核 可执行所有指令

特权指令:只能在内核态执行的指令(如I/O指令、中断管理指令等)

1.10 中断与陷阱

类型 说明 特点
中断(Interrupt) 由外部硬件设备触发 异步、不可预测
陷阱(Trap) 由CPU执行指令触发 同步、可预测(如系统调用)

系统调用流程:用户程序 → 陷入内核 → 执行系统服务 → 返回用户态

1.11 操作系统分类

分类 特点 典型代表
批处理(Batch) 作业成批提交,无交互 早期OS
分时(Time-sharing) 时间片轮转,交互式 Unix, Linux, Windows
实时(Real-time) 严格的时间约束 RTOS, VxWorks

1.12 操作系统结构

结构 说明 优缺点
库式(Library) 无隔离,OS以库形式提供 高效但无保护
单体内核(Monolithic) 所有功能在内核态 高效但庞大,一错全崩
微内核(Microkernel) 仅保留最基本功能,其他在用户态 稳定安全但通信开销大
外内核(Exokernel) 仅负责资源保护,不提供抽象 灵活但复杂
虚拟机(Virtual Machine) 在硬件上运行多个OS 强隔离但性能有损耗
多内核(Multi-kernel) 每个核运行独立内核 适合多核/分布式系统

1.13 策略与机制分离

策略(Policy) :做什么(如:哪个进程优先运行)

机制(Mechanism) :怎么做(如:如何切换进程)

设计 vs 实现:设计关注"做什么",实现关注"怎么做得高效"


第3章:程序结构

3.1 程序创建流程

复制代码
源代码(Source)→ 编译器 → 汇编器 → 链接器 → 可执行文件

3.2 程序加载

  • 加载器(Loader)将可执行文件从磁盘加载到内存
  • 进行地址重定位、动态链接等操作

3.3 静态链接 vs 动态链接

特性 静态链接 动态链接
时机 编译时 运行时(或加载时)
文件大小 较大(包含所有库) 较小(共享库)
内存占用 各进程独立拷贝,浪费 共享库内存,节省
更新 需重新链接 替换库文件即可
部署 简单(不依赖环境) 需确保库存在

3.4 位置无关代码(PIC)

  • PIC:代码中不包含绝对地址,所有地址均为相对地址
  • 优势:可加载到内存任意位置,无需重定位
  • 通过GOT(全局偏移表)和PLT(过程链接表)实现

3.5 延迟绑定(Lazy Binding)

  • 函数第一次被调用时才进行符号解析和重定位
  • 提高程序启动速度
  • 利用PLT和GOT协作实现

3.6 内存段布局

复制代码
+------------------+  高地址
|      栈(Stack)   |  局部变量、函数调用信息(向下增长)
+------------------+
|        ↕         |  空闲区域
+------------------+
|      堆(Heap)    |  动态分配内存(向上增长)
+------------------+
|  .bss / .zidata   |  未初始化的全局/静态变量
+------------------+
|    .rwdata        |  已初始化的可读写数据
+------------------+
|    .rodata        |  只读数据(字符串常量等)
+------------------+
|    .text          |  代码段(指令)
+------------------+  低地址

3.7 可执行文件 vs 进程

概念 说明
可执行文件 磁盘上的静态文件,包含代码和数据
进程 内存中动态执行实例,包含代码、数据、堆栈、寄存器状态

第4章:线程与调度

4.1 指令流执行方式

方式 说明
顺序执行(Sequential) 一条指令接一条,无重叠
协作式(Cooperative) 程序主动让出CPU
抢占式(Preemptive) OS强制切换线程

4.2 进程 vs 线程

比较维度 进程 线程
定义 内存空间分配单位 CPU时间分配单位
地址空间 独立 共享所属进程地址空间
资源拥有 拥有独立资源 仅拥有TCB和栈
切换开销
通信 需IPC 直接共享内存

4.3 线程模型

模型 说明 优缺点
1:1 模型 一个用户线程映射到一个内核线程 简单,但内核开销大
M:1 模型 多个用户线程映射到一个内核线程 高效但一个阻塞全阻塞
M:M 模型 多个用户线程映射到多个内核线程 灵活但复杂

协程/纤程(Coroutine/Fiber):用户态实现的轻量级线程,由程序员控制切换,非抢占式

4.4 线程状态

复制代码
就绪(Ready) ↔ 运行(Running) → 阻塞(Blocked)
     ↑                                    |
     └────────────────────────────────────┘
  • 就绪(Ready):可运行但未获得CPU
  • 运行(Running):正在CPU上执行
  • 阻塞(Blocked):等待某事件(I/O、锁等)

4.5 TCB(线程控制块)

线程控制块存储:程序计数器、寄存器状态、栈指针、线程状态、优先级、调度信息

4.6 调度指标

指标 定义
吞吐量(Throughput) 单位时间内完成的进程数
等待时间(Waiting Time) 进程在就绪队列中等待的总时间
周转时间(Turnaround Time) 从提交到完成的总时间
响应时间(Response Time) 从提交到首次响应的时间
响应比(Response Ratio) HRRN用,公式见下方

4.7 调度算法

算法 说明 特点
FCFS 先来先服务 简单,平均等待时间可能很长( convoy effect)
SJF 最短作业优先 非抢占,平均等待时间最优,但需预知执行时间
SRTF 最短剩余时间优先 SJF的抢占版本
HRRN 最高响应比优先 响应比 = (等待时间 + 执行时间) / 执行时间
RR 时间片轮转 公平,响应快,时间片大小是关键
FP 固定优先级 优先级高的先执行
FPRR 固定优先级 + 时间片轮转 同一优先级内轮转
加权RR 不同进程分配不同权重的时间片 按比例分配CPU
MLFQ 多级反馈队列 优先级动态调整,兼顾响应和吞吐

HRRN响应比公式:

复制代码
响应比 = (等待时间 + 预计执行时间) / 预计执行时间

4.8 调度层次

调度类型 执行频率 作用
长程调度(Long-term) 决定哪些作业进入系统(批处理)
中程调度(Medium-term) 中等 进程换入换出(swapping)
短程调度(Short-term) 选择下一个运行的进程/线程

4.9 并发 vs 并行

概念 说明
并发(Concurrency) 多个任务在同一时间间隔内交替执行(逻辑同时)
并行(Parallelism) 多个任务在同一时刻同时执行(物理同时)

4.10 TLB(转译后备缓冲器)

  • TLB:CPU内部的页表缓存,加速地址翻译
  • 利用了时间局部性空间局部性

4.11 局部性原理

类型 说明
时间局部性 最近访问的地址很可能再次被访问
空间局部性 当前访问地址附近的地址很可能被访问

4.12 工作集

复制代码
WS(t, T) = 在时间区间 (t - T, t] 内访问的所有页面的集合
  • 工作集大小决定了系统应保留多少物理页面
  • 工作集模型用于预防颠簸(Thrashing)

第5章:内存管理

5.1 内存分配方式

方式 说明 问题
固定分区 内存预分为固定大小的区域 内部碎片(分配大于需求)
动态分区 按需分配大小 外部碎片(空闲块不连续)

5.2 动态分区分配算法

算法 策略 特点
First-Fit(首次适应) 找到第一个足够大的空闲块 简单快速
Best-Fit(最佳适应) 找到最小的足够大的空闲块 减少浪费但产生小碎片
Worst-Fit(最差适应) 找到最大的空闲块 减少小碎片数量

竞争比(Competition Ratio):在线算法性能与离线最优算法性能之比

5.3 进程与保护域

  • PCB(进程控制块):存储进程信息和状态
  • 保护域:进程的权限范围,决定能访问哪些资源

5.4 分段(S-MMU)

复制代码
逻辑地址 = (段号, 偏移量)
物理地址 = 段基址(段表[段号])+ 偏移量
  • 段表存放:段基址、段界限、权限等
  • 分段管理的优点:支持共享和保护,符合程序逻辑

5.5 分页(P-MMU)

复制代码
逻辑地址 = (页号, 页内偏移)
物理地址 = 帧号 << 偏移量位数 + 页内偏移
  • 页表:页号 → 帧号的映射
  • 页大小:通常4KB

5.6 多级页表(基数树)

  • 解决大地址空间下页表过大的问题
  • 例:x86_64使用4级页表(PML4 → PDPT → PD → PT)
  • 优点:无需为未使用的地址空间分配页表

5.7 请求分页(Demand Paging)

  • 页面不在内存时触发缺页中断(Page Fault)
  • 缺页处理流程
    1. CPU触发缺页异常
    2. 进入内核态,保存上下文
    3. 检查地址合法性
    4. 从磁盘读取所需页面
    5. 更新页表
    6. 恢复上下文,重新执行指令

5.8 页面置换算法

算法 说明 特点
LFD/Belady最优 置换未来最晚使用的页 最优但不可实现(需预知未来)
FIFO 置换最早进入的页 简单但有Belady异常(增加帧数反而增加缺页)
LRU 置换最久未使用的页 性能好但硬件成本高
LFU 置换使用次数最少的页 需计数
CLOCK/第二机会 近似LRU,使用引用位 简单实用,广泛使用

Belady异常:FIFO中,分配的物理帧数增加,缺页率反而上升的现象

5.9 颠簸(Thrashing)

  • 现象:系统忙于页面置换,CPU利用率极低
  • 原因:分配给进程的物理页面小于其工作集
  • 解决方案:工作集模型、缺页率控制

5.10 写时复制(Copy-on-Write, COW)

  • 父子进程共享物理页面
  • 仅当一方写入时才创建副本
  • 节省内存,加速fork

5.11 内存映射文件

  • 将文件映射到进程的地址空间
  • 对内存的读写自动同步到文件
  • 零拷贝:减少数据在用户态和内核态间的复制

第6章:文件系统

6.1 内存 vs 存储

特性 内存 存储
易失性 断电数据丢失 持久化保存
速度 快(ns级) 慢(ms级)
编址 字节编址(按地址访问) 块编址(按块访问)

编址(Addressing)是衡量存储的金标准

6.2 文件抽象

结构 说明
字节流(Byte Stream) 无结构的字节序列
记录(Record) 固定/可变长度的逻辑记录
索引结构 支持随机访问的索引

6.3 文件系统层次

复制代码
文件层(文件操作接口)
     ↓
文件系统层(具体文件系统实现,如EXT4、NTFS)
     ↓
卷管理层(Volume Management)
     ↓
物理设备层(磁盘等)

6.4 路径

类型 说明 示例
绝对路径 从根目录开始 /home/user/file.txt
相对路径 从当前目录开始 ./doc/file.txt

6.5 文件分配方式

方法 说明 优缺点
连续分配 文件存储在连续块 访问快但产生外部碎片
链式分配 每块指向下一块 无外部碎片但随机访问慢
FAT 文件分配表存储链接信息 改进的链式分配
索引分配(inode) inode包含所有数据块指针 支持高效随机访问
基于区段(Extent) 连续的多个数据块用一个区间表示 大文件高效(EXT4使用)
混合分配 多级索引结合直接块 UNIX中广泛使用

6.6 空闲空间管理

方法 说明
链表 空闲块链接在一起
位图(Bitmap) 每个块对应一个bit,0空闲1占用
成组链接(Group Indexing) UNIX中使用,管理效率高

6.7 FCB与inode

  • FCB(文件控制块):Windows系统中,存储文件元数据
  • inode(索引节点) :Unix/Linux系统中,存储元数据(除文件名外)
    • 包含:文件大小、权限、时间戳、数据块指针

6.8 目录结构

  • 目录是特殊的文件,存储文件名到inode/FCB的映射
  • 多级目录:层次化组织

6.9 链接

类型 说明 特点
硬链接(Hard Link) 多个目录项指向同一inode 不能跨越文件系统,不能链接目录
软链接/符号链接(Symbolic Link) 存储目标文件路径 可以跨越文件系统,原文件删除后失效
快捷方式(Shortcut) Windows特有的链接方式 类似软链接

6.10 VFS(虚拟文件系统)

  • VFS:统一不同文件系统的操作接口
  • 支持同时挂载多种文件系统(EXT4、NTFS、FAT32等)
  • 通过抽象层屏蔽底层差异

6.11 访问控制

模型 说明
ACM(访问控制矩阵) 行=主体,列=对象,格=权限
ACL(访问控制列表) 每个资源关联一个权限列表
RBAC(基于角色的访问控制) 权限赋予角色,角色赋予用户
DAC(自主访问控制) 文件所有者自行决定权限
MAC(强制访问控制) 系统统一管理,用户不能改变
CBAC(基于能力的访问控制) 持有"令牌"即拥有权限

6.12 CHS与LBA转换

复制代码
LBA = (C × HM + H) × SM + (S - 1)

其中:C=柱面号,H=磁头号,S=扇区号,HM=每柱面磁头数,SM=每磁道扇区数

6.13 EXT4 文件系统

组件 说明
超级块(Super Block) 文件系统全局信息(块大小、总块数等)
块组(Block Group) 将磁盘分为多个块组,每个组独立管理
区段树(Extent Tree) 用树状结构管理连续的数据块区间,大文件效率高

第7章:I/O系统

7.1 设备分类

分类维度 类别
使用方式 独占设备、共享设备、虚拟设备
速度 低速(键盘)、中速(磁盘)、高速(GPU)
传输单位 字符设备(字节流)、块设备(块)
共享类型 可共享、不可共享

7.2 SPOOLING(假脱机技术)

  • 原理:用磁盘作为缓冲区,把独占设备模拟成共享设备
  • 核心组件:
    • 输入井:暂存输入数据
    • 输出井:暂存输出数据
    • 守护进程(Daemon):管理SPOOLING的后台进程

7.3 实时时钟与定时器中断

  • RTC(实时时钟):提供实际时间
  • 定时器中断:周期性产生中断,用于时间片调度、定时任务

7.4 缓冲区 vs 缓存

概念 说明
缓冲区(Buffer) 临时存储数据,协调速度差异
缓存(Cache) 存储频繁访问数据的副本,提高访问速度

7.5 磁盘调度算法

算法 说明 特点
FCFS 按请求顺序调度 公平但平均寻道时间长
SSTF 选择离当前磁头最近的请求 寻道时间短但可能"饿死"远请求
SCAN(电梯算法) 磁头单向移动,沿途处理请求 无饿死
C-SCAN SCAN的循环版,单向到顶后直接回到另一端 等待时间更均匀
LOOK SCAN的改进版,到最后一个请求即掉头 更高效
C-LOOK C-SCAN的改进版,到最后一个请求直接返回 最均匀

7.6 设备驱动架构

复制代码
应用层 → 系统调用 → VFS/设备文件 → 驱动层 → 硬件设备
  • 设备号:主设备号(标识驱动类型)+ 次设备号(标识具体设备)
  • Linux设备文件:/dev/sda/dev/tty0

7.7 USB描述符层次

复制代码
设备描述符(Device) → 配置描述符(Configuration) → 接口描述符(Interface) → 端点描述符(Endpoint)
  • 一个设备有多个配置,一个配置有多个接口,一个接口有多个端点

7.8 中断处理

阶段 说明 特点
上半部(Top-half / ISR) 中断服务例程 必须快速完成,关闭中断
下半部(Bottom-half / kworker) 延后处理 可中断,处理复杂工作

7.9 阻塞 vs 非阻塞 I/O

类型 说明
阻塞I/O 进程等待I/O完成,期间进入阻塞态
非阻塞I/O 立即返回(成功或错误),进程不等待

7.10 同步 vs 异步 I/O

类型 说明
同步I/O 发起操作后等待或轮询直到完成
异步I/O 发起操作后立即返回,完成时回调通知

第8章:并发与同步

8.1 基本概念

概念 说明
互斥(Mutual Exclusion) 同一时刻只有一个线程访问共享资源
同步(Synchronization) 线程按特定顺序执行
临界资源(Critical Resource) 一次只允许一个进程使用的资源
临界区(Critical Section) 访问临界资源的代码段

8.2 Bernstein条件(并发条件)

两个进程P1和P2可以并发执行,当且仅当:

复制代码
R(P1) ∩ W(P2) ∪ W(P1) ∩ R(P2) ∪ W(P1) ∩ W(P2) = ∅

其中 R = 读集,W = 写集

8.3 Peterson算法

c 复制代码
// 进入临界区
flag[i] = true;
turn = j;
while (flag[j] && turn == j);

// 临界区

// 退出临界区
flag[i] = false;
  • 满足互斥、前进、有限等待
  • 仅适用于两个线程

8.4 自旋锁(Spin Lock)

指令 说明 架构
SWAP/XCHG 交换寄存器和内存值 x86
TAS/BTS 测试并设置 通用
CMPXCHG/CAS 比较并交换 通用
  • 自旋锁特点:忙等(busy-waiting),适用于短时间锁定

8.5 锁的三条标准

标准 说明
互斥(Mutual Exclusion) 最多一个线程在临界区中
全局进展(Global Progress) 不会死锁,总有一个线程能进入
局部进展/有限等待(Bounded Waiting) 每个线程最终都能进入(无饥饿)

8.6 互斥锁(Mutex)

  • 阻塞锁:获取不到锁时线程进入阻塞态
  • 区别于自旋锁的忙等

8.7 管程(Monitor)

  • 管程:封装了锁和同步机制的抽象
  • 线程进入管程时获取锁,退出时释放锁

8.8 条件变量

操作 说明
wait 释放锁,等待条件满足
signal/notify 通知等待线程条件已满足
Hoare语义 vs Mesa语义
特性 Hoare Mesa
signal后 立即切换给等待线程 等待线程进入就绪队列
被唤醒线程 保证条件成立 条件可能不成立,需重新检查
实现复杂度 低(实际更常用)

惊群效应(Thundering Herd):广播通知所有等待线程,但只有一个能执行

8.9 信号量(Semaphore)

  • P操作(acquire):等待信号量正数后减1

  • V操作(release):信号量加1,唤醒等待线程

    P(S): while (S <= 0); S--;
    V(S): S++;

类型 初始值 用途
互斥信号量 1 实现互斥
计数信号量 n 管理有限资源

8.10 死锁

三个必要条件
条件 说明
互斥(Mutual Exclusion) 资源不能共享
持有并等待(Hold-and-Wait) 持有资源的同时等待其他资源
循环等待(Circular Wait) 形成资源请求环路

注意:死锁的四个必要条件(包含"不可抢占")但教材使用三个条件,"不可抢占"被归入互斥

8.11 活锁(Livelock)

  • 线程没有阻塞但一直在重复操作,无法取得进展
  • 区别于死锁(死锁中线程阻塞不执行)

8.12 死锁处理

资源分配图
  • 圆圈 = 进程
  • 方框 = 资源(内部点表示实例数)
  • 进程→资源 = 请求边
  • 资源→进程 = 分配边
  • 有环 + 每个资源只有一个实例 = 死锁
银行家算法(Banker's Algorithm)
  • 安全状态:存在一个安全序列使所有进程都能完成
  • 核心:计算 Available、Need、Allocation
  • 安全性检查算法 + 资源请求算法
死锁预防
策略 说明
破坏互斥 尽可能使用共享资源
破坏持有并等待 一次性请求所有资源
破坏循环等待 资源编号,按序请求(顺序资源分配法)

8.13 无锁数据结构

级别 说明
Obstruction-free 无竞争时保证进展
Lock-free 系统级保证至少一个线程进展
Wait-free 每个线程有限步骤内完成操作

第9章:进程间通信(IPC)

9.1 通信层次

复制代码
指令流内 → 线程间(共享内存)→ 进程间(IPC)→ 应用间(网络)

9.2 可靠 vs 不可靠IPC

类型 说明
可靠(Reliable) 保证消息传递、顺序、不重复
不可靠(Unreliable) 不保证上述特性

9.3 IPC方式

管道(Pipe)
类型 说明 特点
匿名管道 只能在父子进程间 单向通信
命名管道/FIFO 可在任意进程间 单向,有路径名
信号(Signal)
  • 异步通信方式
  • 例:SIGINT(Ctrl+C)、SIGKILLSIGSEGV
  • 有限的信息传递(仅信号编号)
信号量(跨进程)
  • 用于同步访问共享资源
  • 可以跨进程命名
消息队列(Message Queue)
  • 优点:有格式的消息、异步通信
  • 缺点:需要两次拷贝(发送方→内核→接收方)
共享内存(Shared Memory)
特点 说明
速度 最快(零拷贝,同进程内直接访问)
同步 需配合信号量/互斥锁使用
优势 无需在内核和用户态之间拷贝数据

9.4 IPC对比

方式 速度 适用场景 特点
管道 父子进程简单通信 简单易用
信号 事件通知 信息量少
消息队列 中等 结构化消息通信 异步,有格式
共享内存 最快 大数据量频繁通信 零拷贝,需同步
信号量 - 同步而不是通信 用于互斥和同步

附录:常见考点速查

关键公式速记

公式 说明
线性地址 = 段基址 << 4 + 偏移量 8086分段的地址转换
响应比 = (等待时间 + 预计执行时间) / 预计执行时间 HRRN调度
LBA = (C × HM + H) × SM + (S - 1) CHS到LBA转换

经典算法总结

算法 所属章节 核心思想
Banker's算法 并发 避免进入不安全状态
Peterson算法 并发 软件实现互斥
LRU置换 内存 置换最久未用页面
C-LOOK I/O 磁头单向移动到最远请求后返回
银行家算法 并发 资源分配的避免死锁

对比记忆要点

  • 进程 vs 线程:内存分配单位 vs CPU分配单位
  • 中断 vs 陷阱:异步不可预测 vs 同步可预测
  • 死锁 vs 活锁:阻塞不执行 vs 执行但无进展
  • 静态链接 vs 动态链接:编译时 vs 运行时
  • 分页 vs 分段:固定大小 vs 逻辑分段
  • 管程 vs 信号量:封装方式 vs 底层机制
  • 同步 vs 异步:等待完成 vs 回调通知
  • 阻塞 vs 非阻塞:等待 vs 立即返回

最后提示 :操作系统考试中,算法流程(如页面置换、调度算法、银行家算法)和概念对比(所有表格中的内容)是高频考点。

建议重点掌握:PV信号量经典问题、页面置换计算、调度算法计算、死锁的判断与预防。