操作系统期末复习笔记
目录
- 第1-2章:操作系统概述
- 第3章:程序结构
- 第4章:线程与调度
- 第5章:内存管理
- 第6章:文件系统
- 第7章:I/O系统
- 第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)
逻辑地址 = (页号, 页内偏移)
物理地址 = 帧号 << 偏移量位数 + 页内偏移
5.6 多级页表(基数树)
- 解决大地址空间下页表过大的问题
- 例:x86_64使用4级页表(PML4 → PDPT → PD → PT)
- 优点:无需为未使用的地址空间分配页表
5.7 请求分页(Demand Paging)
- 页面不在内存时触发缺页中断(Page Fault)
- 缺页处理流程:
- CPU触发缺页异常
- 进入内核态,保存上下文
- 检查地址合法性
- 从磁盘读取所需页面
- 更新页表
- 恢复上下文,重新执行指令
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算法
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)、SIGKILL、SIGSEGV - 有限的信息传递(仅信号编号)
信号量(跨进程)
消息队列(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信号量经典问题、页面置换计算、调度算法计算、死锁的判断与预防。