操作系统期末复习笔记
目录
- 第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)
| 类型 |
初始值 |
用途 |
| 互斥信号量 |
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信号量经典问题、页面置换计算、调度算法计算、死锁的判断与预防。