《操作系统》80 分掌握指南
1. 学习前说明
由于输入中未指定学习阶段、基础、考试类型和特殊要求,本文采用以下默认假设:
- 学习阶段:普通高校本科《操作系统》课程。
- 目标用户:学过计算机基础、C/C++ 或 Java 等编程语言,了解数据结构,但对操作系统知识不系统。
- 考试目标 :课程期末考试或补考,目标分数 80 分以上。
- 内容取舍:不追求覆盖所有教材细节,而是优先掌握最常考、最能提分、最能形成框架的约 80% 核心内容。
- 教材体系:采用最通用的操作系统课程体系:进程与线程、处理机调度、同步互斥、死锁、内存管理、虚拟内存、文件系统、I/O 与磁盘管理。
本文适合用于:
- 考前 1 到 3 周系统复习。
- 学完课程后重新建立知识框架。
- 补考、期末、考研专业课初步复习。
- 从"会背名词"提升到"能做题、能解释机制"。
2. 学科一句话概括
操作系统是一门研究如何管理计算机硬件资源,并为应用程序提供方便、安全、高效运行环境的课程。
更直观地说,操作系统就像一座大型酒店的总管:
- CPU 像客房,很多程序都想住进去,操作系统负责安排谁先用、用多久。
- 内存像临时工作台,程序运行时的数据要放在这里,操作系统负责分配、回收和保护。
- 磁盘像仓库,文件长期保存,操作系统负责组织目录、读写数据和管理空闲空间。
- I/O 设备像前台、打印机、电梯,速度差异很大,操作系统要协调它们和 CPU 的配合。
这门学科研究什么
操作系统研究 资源管理 和 程序运行环境:
- 如何管理 CPU、内存、磁盘、I/O 设备。
- 如何让多个程序看起来"同时运行"。
- 如何让程序之间既能合作,又不互相破坏。
- 如何通过抽象让用户不用直接面对复杂硬件。
它解决什么核心问题
操作系统解决四类核心问题:
| 核心问题 | 对应内容 |
|---|---|
| 多个程序如何共享 CPU | 进程、线程、调度 |
| 多个程序如何安全共享数据 | 同步、互斥、信号量、管程 |
| 内存不够或程序太大怎么办 | 分页、分段、虚拟内存、页面置换 |
| 文件和设备如何统一管理 | 文件系统、目录、磁盘调度、I/O 控制 |
为什么考试中重要
操作系统考试通常不是纯记忆,而是"概念 + 机制 + 计算 + 分析"混合:
- 概念题考定义和区别,例如进程与线程、分页与分段。
- 机制题考过程,例如中断处理、页面置换、死锁检测。
- 计算题考调度、页面置换、磁盘调度、银行家算法。
- 分析题考同步互斥、生产者消费者、读者写者等经典模型。
最容易卡住的地方
初学者最容易卡在四个点:
- 把概念背散了:知道"进程""线程""页表",但不知道它们在解决什么问题。
- 不会画状态变化:调度、阻塞、唤醒、缺页、中断经常混在一起。
- 同步题不会下手:不清楚互斥、同步、信号量初值和 P/V 顺序。
- 计算题公式会背但不会用:平均周转时间、有效访问时间、页面置换、磁盘移动距离容易丢分。
3. 学科知识地图
| 模块 | 重要程度 | 解决的问题 | 前置依赖 | 常见考试形式 |
|---|---|---|---|---|
| 操作系统概述与中断 | ★★★ | 操作系统是什么,内核如何接管硬件 | 计算机组成基础 | 选择、填空、简答 |
| 进程、线程与处理机调度 | ★★★★★ | 多个程序如何共享 CPU | 程序执行、队列 | 计算题、简答题 |
| 同步、互斥与经典问题 | ★★★★★ | 多个进程如何安全协作 | 进程状态、临界区 | PV 操作、分析题 |
| 死锁 | ★★★★ | 多进程互相等待时如何处理 | 资源分配、同步 | 银行家算法、简答 |
| 内存管理基础 | ★★★★★ | 程序如何装入内存并隔离运行 | 地址、存储层次 | 地址转换、分页计算 |
| 虚拟内存与页面置换 | ★★★★★ | 内存不够时如何运行大程序 | 分页、局部性原理 | 页面置换计算 |
| 文件系统 | ★★★★ | 文件如何组织、存储和访问 | 磁盘、目录结构 | 索引分配、目录题 |
| I/O 与磁盘管理 | ★★★★ | 慢速设备如何和 CPU 协作 | 中断、缓存 | 磁盘调度计算 |
| 保护、安全与系统调用 | ★★★ | 如何保护资源并提供接口 | 用户态、内核态 | 简答、选择 |
模块依赖关系
text
操作系统概述
-> 进程与线程
-> 处理机调度
-> 同步互斥
-> 死锁
-> 内存管理基础
-> 虚拟内存
-> 文件系统
-> I/O 与磁盘管理
-> 保护、安全、系统调用
学习时要抓住一条主线:
程序运行需要 CPU、内存、文件和设备;操作系统的核心任务就是分配、调度、保护和抽象这些资源。
4. 推荐学习顺序
建议按以下顺序学习,而不是完全按教材章节顺序:
- 操作系统概述与中断:先知道操作系统为什么存在。
- 进程与线程:理解"程序运行起来之后是什么"。
- 处理机调度:掌握 CPU 如何分配给进程。
- 同步互斥:解决进程并发带来的冲突。
- 死锁:理解资源等待的极端情况。
- 内存管理基础:理解地址转换、分页、分段。
- 虚拟内存:掌握缺页、页面置换和有效访问时间。
- 文件系统:理解文件、目录、空间分配。
- I/O 与磁盘管理:掌握设备控制和磁盘调度。
- 保护、安全与系统调用:补全接口和保护机制。
5. 核心模块详解
模块一:操作系统概述与中断
1. 本模块解决的问题
本模块回答三个基础问题:
- 操作系统到底是什么?
- 用户程序为什么不能直接操作硬件?
- CPU 如何从用户程序切换到操作系统内核?
如果把计算机看成一台机器,操作系统就是"管理机器的人"和"给用户使用机器的接口"。
2. 核心概念
| 概念 | 通俗解释 | 考试重点 |
|---|---|---|
| 操作系统 | 管理硬件和软件资源的系统软件 | 定义、功能 |
| 内核 | 操作系统最核心、运行在高权限态的部分 | 用户态/内核态切换 |
| 系统调用 | 用户程序请求操作系统服务的接口 | 与普通函数调用区别 |
| 中断 | CPU 暂停当前程序,转去处理紧急事件 | 中断处理过程 |
| 异常 | 程序运行中产生的内部事件,如除零、缺页 | 与外部中断区别 |
| 用户态 | 权限较低,不能直接执行特权指令 | 安全隔离 |
| 内核态 | 权限较高,可以执行特权指令 | 操作硬件、管理资源 |
3. 关键方法与规则
操作系统的四大功能:
- 处理机管理:进程、线程、调度。
- 存储器管理:内存分配、地址转换、虚拟内存。
- 文件管理:文件、目录、磁盘空间。
- 设备管理:I/O 控制、中断、缓冲、磁盘调度。
中断处理的一般过程:
text
中断发生
-> 保存当前程序现场
-> 转入中断处理程序
-> 执行中断服务
-> 恢复现场
-> 返回原程序继续执行
系统调用的一般过程:
text
用户程序发起系统调用
-> 通过陷入指令进入内核态
-> 内核检查参数和权限
-> 执行内核服务
-> 返回用户态
4. 易混点与常见误区
| 易混点 | 正确理解 |
|---|---|
| 系统调用不是普通函数调用 | 普通函数仍在用户态执行,系统调用会进入内核态 |
| 中断不一定是错误 | 键盘输入、时钟中断、I/O 完成都属于正常中断 |
| 内核态不等于内存中的"内核区域" | 内核态是 CPU 权限状态 |
| 操作系统不是应用软件 | 操作系统是管理和支撑应用运行的系统软件 |
5. 考试常见问法
- 简述操作系统的主要功能。
- 什么是系统调用?它与普通函数调用有何区别?
- 什么是中断?中断处理过程包括哪些步骤?
- 为什么要区分用户态和内核态?
6. 典型例题
例题:为什么用户程序不能直接执行 I/O 指令,而要通过系统调用请求操作系统完成?
7. 解题思路
回答时抓住"安全"和"统一管理":
- I/O 设备属于共享资源,如果用户程序可直接操作,会破坏其他程序的数据。
- I/O 指令通常是特权指令,只能在内核态执行。
- 系统调用让操作系统检查权限、参数和设备状态。
- 这样既保证安全,又方便操作系统统一调度设备。
8. 简短总结
本模块是理解操作系统的入口。考试中最重要的是记住:操作系统通过内核态、系统调用和中断机制接管硬件,并为用户程序提供安全接口。
模块二:进程、线程与处理机调度
1. 本模块解决的问题
一个 CPU 同一时刻只能真正执行一个指令流,但用户希望多个程序"同时运行"。进程、线程和调度就是为了解决:
- 程序运行起来后如何表示?
- 多个程序如何轮流使用 CPU?
- 如何评价调度算法好不好?
2. 核心概念
| 概念 | 通俗解释 | 考试重点 |
|---|---|---|
| 程序 | 静态代码和数据 | 与进程区别 |
| 进程 | 正在运行的程序实例 | PCB、状态转换 |
| PCB | 进程控制块,记录进程身份和现场 | 进程存在的唯一标志 |
| 线程 | 进程内的执行流 | 与进程区别 |
| 上下文切换 | 保存旧进程现场,恢复新进程现场 | 有开销 |
| 调度 | 决定哪个进程获得 CPU | 算法计算 |
进程的典型状态:
text
新建 -> 就绪 -> 运行 -> 终止
^ |
| v
阻塞 <- 等待事件
三种主要状态:
- 就绪态:除了 CPU,其他条件都满足。
- 运行态:正在 CPU 上执行。
- 阻塞态:等待某个事件,如 I/O 完成、信号量可用。
3. 关键公式、规则和算法
常用性能指标:
text
周转时间 = 完成时间 - 到达时间
带权周转时间 = 周转时间 / 服务时间
等待时间 = 周转时间 - 服务时间
平均周转时间 = 各进程周转时间之和 / 进程数
平均等待时间 = 各进程等待时间之和 / 进程数
符号说明:
- 到达时间:进程进入就绪队列的时间。
- 服务时间:进程需要 CPU 执行的总时间,也叫运行时间。
- 完成时间:进程执行结束的时间。
- 周转时间:从到达到完成的总时间。
- 等待时间:在就绪队列中等待 CPU 的时间。
常见调度算法:
| 算法 | 思想 | 是否抢占 | 优点 | 缺点 |
|---|---|---|---|---|
| FCFS 先来先服务 | 谁先到谁先执行 | 非抢占 | 简单公平 | 短作业可能等很久 |
| SJF 短作业优先 | 服务时间短的先执行 | 通常非抢占 | 平均等待时间短 | 长作业可能饥饿 |
| SRTF 最短剩余时间优先 | 剩余时间短者优先 | 抢占 | 更优平均等待 | 切换频繁 |
| 优先级调度 | 优先级高者先执行 | 可抢占或非抢占 | 适合区分重要性 | 低优先级可能饥饿 |
| 时间片轮转 RR | 每个进程轮流运行一个时间片 | 抢占 | 响应快,适合分时系统 | 时间片选择影响大 |
| 多级反馈队列 | 新进程优先级高,用完时间片降级 | 抢占 | 兼顾短作业和交互 | 规则复杂 |
4. 易混点与常见误区
| 易错点 | 正确做法 |
|---|---|
| 把阻塞态和就绪态混淆 | 就绪态只缺 CPU,阻塞态是在等事件 |
| 忘记抢占式调度会中断当前进程 | 新进程到达时要重新比较优先级或剩余时间 |
| 周转时间写成完成时间 | 必须减去到达时间 |
| RR 算法中进程到达顺序处理错误 | 时间片结束后进入队尾,新到达进程按到达时刻入队 |
5. 考试常见问法
- 比较进程和线程的区别。
- 画出进程状态转换图。
- 给定进程到达时间和服务时间,计算 FCFS、SJF、RR 的平均周转时间。
- 为什么时间片太大或太小都不好?
6. 典型例题
给定 3 个进程:
| 进程 | 到达时间 | 服务时间 |
|---|---|---|
| P1 | 0 | 5 |
| P2 | 1 | 3 |
| P3 | 2 | 1 |
分别用 FCFS 和非抢占 SJF 计算平均周转时间。
7. 解题思路
FCFS:
text
执行顺序:P1 -> P2 -> P3
P1 完成时间 = 5,周转时间 = 5 - 0 = 5
P2 完成时间 = 8,周转时间 = 8 - 1 = 7
P3 完成时间 = 9,周转时间 = 9 - 2 = 7
平均周转时间 = (5 + 7 + 7) / 3 = 6.33
非抢占 SJF:
text
t=0 时只有 P1 到达,先执行 P1,完成于 t=5
t=5 时 P2、P3 都已到达,选服务时间短的 P3
执行顺序:P1 -> P3 -> P2
P1 周转时间 = 5 - 0 = 5
P3 完成时间 = 6,周转时间 = 6 - 2 = 4
P2 完成时间 = 9,周转时间 = 9 - 1 = 8
平均周转时间 = (5 + 4 + 8) / 3 = 5.67
8. 简短总结
本模块的核心是:进程是资源分配的基本单位,线程是 CPU 调度的基本单位;调度题要画时间轴,先求完成时间,再求周转时间和等待时间。
模块三:同步、互斥与经典问题
1. 本模块解决的问题
并发执行会带来一个问题:多个进程可能同时访问同一份共享数据,导致结果错误。同步与互斥解决的是:
- 谁可以进入临界区?
- 谁必须等谁完成后才能继续?
- 如何用信号量、管程等机制表达进程协作?
2. 核心概念
| 概念 | 通俗解释 | 考试重点 |
|---|---|---|
| 并发 | 多个程序在时间上交替推进 | 与并行区别 |
| 临界资源 | 一次只允许一个进程使用的资源 | 打印机、共享变量 |
| 临界区 | 访问临界资源的代码段 | 互斥保护 |
| 互斥 | 同一时刻最多一个进程进入临界区 | mutex 初值通常为 1 |
| 同步 | 多个进程按某种先后顺序协作 | 信号量初值常表示资源数量 |
| 信号量 | 一个整数加等待队列 | P/V 操作 |
| 管程 | 把共享数据和操作封装起来的高级同步机制 | 条件变量 |
3. 关键规则和方法
信号量操作:
text
P(S):申请资源
S = S - 1
若 S < 0,则进程阻塞
V(S):释放资源
S = S + 1
若 S <= 0,则唤醒一个等待进程
符号说明:
- S:信号量,可以表示资源数量或条件是否满足。
- P 操作:也叫 wait、down,用于申请或等待。
- V 操作:也叫 signal、up,用于释放或通知。
临界区问题必须满足三条:
- 互斥进入:同一时刻最多一个进程在临界区。
- 空闲让进:临界区空闲时,应允许一个请求者进入。
- 有限等待:等待进程不能无限期等待。
经典生产者-消费者模型:
text
semaphore mutex = 1; // 互斥访问缓冲区
semaphore empty = n; // 空缓冲区数量
semaphore full = 0; // 满缓冲区数量
Producer:
P(empty)
P(mutex)
放入产品
V(mutex)
V(full)
Consumer:
P(full)
P(mutex)
取出产品
V(mutex)
V(empty)
注意:
mutex解决互斥。empty和full解决同步。- 一般先 P 同步信号量,再 P 互斥信号量;释放时先 V 互斥,再 V 同步。
4. 易混点与常见误区
| 易错点 | 后果 | 正确做法 |
|---|---|---|
| 把同步信号量和互斥信号量混用 | 逻辑混乱 | 互斥看临界区,同步看先后条件 |
| P(mutex) 放在 P(empty) 前 | 可能死锁 | 先确认资源条件,再进入临界区 |
| 忘记 V 操作 | 其他进程永久等待 | 每个成功 P 的资源最终要 V |
| 信号量初值乱设 | 程序行为错误 | 初值应对应资源数量或初始条件 |
5. 考试常见问法
- 什么是临界区?临界区管理应满足哪些原则?
- 用 P/V 操作解决生产者消费者问题。
- 用信号量解决读者写者、哲学家进餐、理发师问题。
- 判断某段同步代码是否会死锁或违反互斥。
6. 典型例题
有一个容量为 5 的缓冲区,多个生产者放入数据,多个消费者取出数据。请设置信号量并写出伪代码。
7. 解题思路
先判断资源:
- 缓冲区一次只能被一个进程修改,所以需要互斥信号量
mutex = 1。 - 初始有 5 个空位,所以
empty = 5。 - 初始没有产品,所以
full = 0。
伪代码:
text
semaphore mutex = 1;
semaphore empty = 5;
semaphore full = 0;
Producer:
while true:
produce item
P(empty)
P(mutex)
insert item
V(mutex)
V(full)
Consumer:
while true:
P(full)
P(mutex)
remove item
V(mutex)
V(empty)
consume item
8. 简短总结
同步互斥题的关键不是背代码,而是先问两件事:哪些代码必须互斥?哪些动作有先后条件? 然后分别设置互斥信号量和同步信号量。
模块四:死锁
1. 本模块解决的问题
死锁是并发系统中多个进程互相等待资源,导致谁也无法继续。它解决的问题是:
- 什么条件下会死锁?
- 如何预防、避免、检测和解除死锁?
- 银行家算法如何判断系统是否安全?
2. 核心概念
| 概念 | 通俗解释 | 考试重点 |
|---|---|---|
| 死锁 | 一组进程互相等待对方持有的资源 | 四个必要条件 |
| 安全状态 | 存在一个安全序列,使所有进程最终完成 | 银行家算法 |
| 不安全状态 | 不保证死锁,但可能进入死锁 | 与死锁区别 |
| 资源分配图 | 用图表示进程和资源之间的请求/分配 | 检测死锁 |
| 银行家算法 | 分配前先判断是否仍安全 | 计算题高频 |
3. 关键条件和方法
死锁产生的四个必要条件:
- 互斥条件:资源一次只能被一个进程使用。
- 请求并保持条件:进程已占有资源,又请求新资源。
- 不可剥夺条件:资源不能被强制抢走。
- 循环等待条件:存在进程资源循环等待链。
处理死锁的四种策略:
| 策略 | 思想 | 常考点 |
|---|---|---|
| 预防死锁 | 破坏四个必要条件之一 | 问破坏哪个条件 |
| 避免死锁 | 分配前判断是否安全 | 银行家算法 |
| 检测死锁 | 允许死锁发生,再检测 | 资源分配图 |
| 解除死锁 | 撤销进程或剥夺资源 | 代价较大 |
银行家算法核心数据:
text
Available:当前可用资源向量
Max:各进程最大需求矩阵
Allocation:各进程已分配资源矩阵
Need = Max - Allocation:各进程还需要的资源矩阵
安全性检查:
text
Work = Available
寻找某个未完成进程 Pi,使 Need[i] <= Work
若找到,则假设 Pi 完成:
Work = Work + Allocation[i]
Finish[i] = true
重复上述过程
若所有 Finish 都为 true,则系统安全
4. 易混点与常见误区
| 易错点 | 正确理解 |
|---|---|
| 不安全状态等于死锁 | 不安全只是可能死锁,不一定已经死锁 |
| Need 算错 | Need = Max - Allocation |
| 银行家算法只看 Available | 还要看进程完成后释放 Allocation |
| 破坏循环等待就是按序申请资源 | 所有进程按统一资源编号顺序申请 |
5. 考试常见问法
- 死锁产生的四个必要条件是什么?
- 死锁预防、避免、检测有什么区别?
- 给定 Available、Max、Allocation,判断系统是否安全。
- 某进程提出请求后,能否立即分配?
6. 典型例题
系统有 A、B 两类资源,当前:
text
Available = (1, 1)
进程 Allocation Max
P1 (1, 0) (2, 1)
P2 (0, 1) (1, 2)
P3 (1, 1) (2, 2)
判断系统是否安全。
7. 解题思路
先计算 Need:
text
P1 Need = (2,1) - (1,0) = (1,1)
P2 Need = (1,2) - (0,1) = (1,1)
P3 Need = (2,2) - (1,1) = (1,1)
初始 Work = Available = (1,1),三个进程都满足 Need <= Work。任选一个安全序列:
text
P1 完成,Work = (1,1) + (1,0) = (2,1)
P2 完成,Work = (2,1) + (0,1) = (2,2)
P3 完成,Work = (2,2) + (1,1) = (3,3)
存在安全序列 P1 -> P2 -> P3,所以系统安全。
8. 简短总结
死锁题要抓住两层:概念题背四条件,计算题用银行家算法。银行家算法不要凭感觉判断,一定写出 Need、Work 和安全序列。
模块五:内存管理基础
1. 本模块解决的问题
程序要运行,必须把指令和数据放入内存。但内存有限,多个进程还要互相隔离。内存管理解决的是:
- 程序地址如何转换成真实内存地址?
- 内存如何分配给多个进程?
- 如何防止一个进程访问另一个进程的内存?
2. 核心概念
| 概念 | 通俗解释 | 考试重点 |
|---|---|---|
| 逻辑地址 | 程序看到的地址 | 也叫虚拟地址 |
| 物理地址 | 内存硬件中的真实地址 | 地址转换结果 |
| 地址重定位 | 逻辑地址转换为物理地址 | 静态/动态重定位 |
| 连续分配 | 一个进程占一整块连续内存 | 内外碎片 |
| 分页 | 把逻辑空间分成页,物理内存分成页框 | 页表、地址转换 |
| 分段 | 按程序逻辑模块划分段 | 段表、保护和共享 |
| TLB | 快表,缓存页表项 | 有效访问时间 |
3. 关键公式、规则和方法
分页地址结构:
text
逻辑地址 = 页号 p + 页内偏移 d
物理地址 = 页框号 f + 页内偏移 d
如果页面大小为 2^k 字节:
- 低
k位是页内偏移。 - 高位是页号。
页表作用:
text
页号 p -> 页框号 f
分段地址结构:
text
逻辑地址 = 段号 s + 段内偏移 d
若 d < 段长,则物理地址 = 段基址 + d
否则越界
连续分配中的碎片:
| 类型 | 含义 | 常见位置 |
|---|---|---|
| 内部碎片 | 分配出去但没用完的空间 | 固定分区、分页 |
| 外部碎片 | 空闲但不连续,无法满足大请求 | 动态分区、分段 |
4. 易混点与常见误区
| 易错点 | 正确理解 |
|---|---|
| 页和页框混淆 | 页属于逻辑地址空间,页框属于物理内存 |
| 分页会产生外部碎片 | 分页主要产生内部碎片,不产生外部碎片 |
| 分段地址不检查越界 | 分段必须检查段内偏移是否小于段长 |
| TLB 命中还去访问页表 | TLB 命中时可直接得到页框号 |
5. 考试常见问法
- 比较分页和分段。
- 给定页面大小和逻辑地址,求页号、页内偏移和物理地址。
- 给定段表,判断地址是否合法并求物理地址。
- 解释内部碎片和外部碎片。
6. 典型例题
某分页系统页面大小为 1KB,逻辑地址为 2500,页表如下:
| 页号 | 页框号 |
|---|---|
| 0 | 5 |
| 1 | 8 |
| 2 | 3 |
求逻辑地址 2500 对应的物理地址。
7. 解题思路
页面大小 1KB = 1024B。
text
页号 p = 2500 / 1024 = 2
页内偏移 d = 2500 % 1024 = 452
页号 2 对应页框号 3
物理地址 = 3 * 1024 + 452 = 3524
8. 简短总结
内存管理题的核心是地址转换。分页看页号和页内偏移,分段看段号、段内偏移和越界检查。考试中先写地址结构,再代入计算,最稳。
模块六:虚拟内存与页面置换
1. 本模块解决的问题
虚拟内存让程序以为自己拥有很大的连续内存,实际上只把当前需要的部分装入物理内存。它解决的是:
- 程序比内存大时如何运行?
- 缺页时操作系统如何处理?
- 内存满了要换出哪一页?
2. 核心概念
| 概念 | 通俗解释 | 考试重点 |
|---|---|---|
| 虚拟内存 | 用磁盘扩展内存的逻辑机制 | 局部性原理 |
| 请求分页 | 页面用到时再调入内存 | 缺页处理 |
| 缺页中断 | 访问页不在内存时触发 | 中断流程 |
| 页面置换 | 内存满时换出某页 | FIFO、LRU、OPT |
| 抖动 | 频繁缺页,系统大部分时间在换页 | 工作集 |
| 工作集 | 进程近期访问页面集合 | 防止抖动 |
3. 关键公式、规则和算法
缺页处理过程:
text
访问页面
-> 查页表,发现页不在内存
-> 产生缺页中断
-> 操作系统找到该页在外存的位置
-> 若有空闲页框,直接调入
-> 若无空闲页框,选择页面换出
-> 更新页表
-> 重新执行被中断的指令
页面置换算法:
| 算法 | 思想 | 特点 |
|---|---|---|
| OPT 最佳置换 | 换出未来最长时间不用的页 | 理论最优,实际不可实现 |
| FIFO 先进先出 | 换出最早进入内存的页 | 简单,可能 Belady 异常 |
| LRU 最近最久未使用 | 换出最近最长时间没用过的页 | 接近 OPT,常考 |
| Clock 时钟算法 | 给页面访问位,循环寻找可换页 | LRU 的近似实现 |
有效访问时间 EAT:
text
EAT = (1 - p) * 内存访问时间 + p * 缺页处理时间
符号说明:
- p:缺页率。
- 内存访问时间:未缺页时访问内存所需时间。
- 缺页处理时间:处理中断、磁盘读写、更新页表等总时间。
- 适用条件:只区分"缺页"和"不缺页"两种情况的简化计算。
4. 易混点与常见误区
| 易错点 | 正确理解 |
|---|---|
| OPT 可实际使用 | OPT 需要知道未来访问序列,只用于理论比较 |
| FIFO 页框越多缺页一定越少 | FIFO 可能出现 Belady 异常 |
| LRU 看进入内存时间 | LRU 看最近一次被访问的时间 |
| 缺页中断后从下一条指令执行 | 应重新执行导致缺页的指令 |
5. 考试常见问法
- 什么是虚拟内存?它依据什么原理?
- 给定页面访问序列和页框数,计算 FIFO、LRU、OPT 缺页次数。
- 什么是抖动?如何减少抖动?
- 计算有效访问时间。
6. 典型例题
页面访问序列为:
text
1, 2, 3, 4, 1, 2, 5, 1, 2, 3, 4, 5
页框数为 3,使用 FIFO 算法,求缺页次数。
7. 解题思路
逐步维护队列,内存未命中即缺页:
| 访问 | 内存状态 | 是否缺页 |
|---|---|---|
| 1 | 1 | 是 |
| 2 | 1,2 | 是 |
| 3 | 1,2,3 | 是 |
| 4 | 2,3,4 | 是,换出 1 |
| 1 | 3,4,1 | 是,换出 2 |
| 2 | 4,1,2 | 是,换出 3 |
| 5 | 1,2,5 | 是,换出 4 |
| 1 | 1,2,5 | 否 |
| 2 | 1,2,5 | 否 |
| 3 | 2,5,3 | 是,换出 1 |
| 4 | 5,3,4 | 是,换出 2 |
| 5 | 5,3,4 | 否 |
缺页次数为 9。
8. 简短总结
虚拟内存题一定要手动画表。FIFO 看谁最早进入,LRU 看谁最久没被访问,OPT 看未来谁最晚再用或不再用。
模块七:文件系统
1. 本模块解决的问题
内存中的数据断电会丢失,文件系统负责把数据长期保存在磁盘中,并让用户用文件和目录的方式组织数据。它解决的是:
- 文件如何命名、组织、访问?
- 文件内容如何放到磁盘块上?
- 如何管理空闲磁盘空间?
- 如何提高文件访问效率?
2. 核心概念
| 概念 | 通俗解释 | 考试重点 |
|---|---|---|
| 文件 | 具有名字的一组相关信息 | 文件属性、操作 |
| 目录 | 管理文件名和文件控制信息的结构 | 路径查找 |
| FCB | 文件控制块,记录文件属性和磁盘位置 | 与目录项关系 |
| inode | 类 Unix 系统中的索引节点 | 文件元数据 |
| 顺序访问 | 从头到尾依次读写 | 文本、日志 |
| 随机访问 | 可跳到任意位置读写 | 数据库、二进制文件 |
| 空闲空间管理 | 记录哪些磁盘块未使用 | 位示图、空闲链表 |
3. 关键方法和结构
文件物理分配方式:
| 分配方式 | 思想 | 优点 | 缺点 |
|---|---|---|---|
| 连续分配 | 文件占连续磁盘块 | 顺序和随机访问快 | 外部碎片,扩展困难 |
| 链接分配 | 每块指向下一块 | 无外部碎片,易扩展 | 随机访问慢,指针占空间 |
| 索引分配 | 用索引块记录所有数据块地址 | 支持随机访问,易扩展 | 索引块有开销 |
目录结构:
| 目录结构 | 特点 |
|---|---|
| 单级目录 | 所有文件在一个目录,简单但易重名 |
| 两级目录 | 每个用户一个目录,减少重名 |
| 树形目录 | 最常见,支持层次化路径 |
| 无环图目录 | 支持共享,但要避免环 |
空闲空间管理:
| 方法 | 思想 | 适合考点 |
|---|---|---|
| 位示图 | 每个磁盘块用 1 位表示空闲/占用 | 计算块号 |
| 空闲链表 | 把空闲块串成链表 | 分配简单 |
| 成组链接 | 把多个空闲块信息分组管理 | Unix 相关 |
4. 易混点与常见误区
| 易错点 | 正确理解 |
|---|---|
| 目录中一定存文件内容 | 目录主要存文件名和控制信息,不直接存大段内容 |
| 链接分配随机访问快 | 链接分配必须沿链查找,随机访问慢 |
| 连续分配没有碎片 | 连续分配容易产生外部碎片 |
| 索引分配没有开销 | 索引块本身占用磁盘空间 |
5. 考试常见问法
- 比较连续、链接、索引三种文件分配方式。
- 树形目录的优点是什么?
- 给定位示图,求某磁盘块对应的字节号和位号。
- inode 与文件名有什么关系?
6. 典型例题
某磁盘块大小为 1KB,一个索引块中每个块号占 4B。若采用一级索引,一个索引块最多能管理多大的文件?
7. 解题思路
一个索引块大小为 1KB = 1024B,每个块号占 4B:
text
索引项数量 = 1024 / 4 = 256
每个索引项指向一个数据块
最大文件大小 = 256 * 1KB = 256KB
所以一级索引最多管理 256KB 文件。
8. 简短总结
文件系统的核心是"逻辑文件如何映射到物理磁盘块"。三种分配方式是考试重点:连续快但难扩展,链接易扩展但随机慢,索引综合性好但有额外开销。
模块八:I/O 与磁盘管理
1. 本模块解决的问题
I/O 设备速度慢、种类多,CPU 速度快且宝贵。I/O 管理解决的是:
- CPU 如何高效控制设备?
- 中断、DMA、缓冲有什么作用?
- 磁盘请求如何排序才能减少寻道时间?
2. 核心概念
| 概念 | 通俗解释 | 考试重点 |
|---|---|---|
| 程序控制 I/O | CPU 一直轮询设备状态 | 浪费 CPU |
| 中断驱动 I/O | 设备完成后中断通知 CPU | 常用机制 |
| DMA | 设备和内存直接传输,CPU 少参与 | 大块数据传输 |
| 缓冲 | 用内存区域平衡速度差异 | 单缓冲、双缓冲 |
| 设备驱动程序 | 操作系统中控制具体设备的软件 | 屏蔽硬件差异 |
| 磁盘调度 | 安排磁盘请求访问顺序 | 计算移动磁道数 |
3. 关键方法和算法
I/O 控制方式比较:
| 方式 | CPU 参与程度 | 适用场景 |
|---|---|---|
| 程序查询方式 | 最高,反复轮询 | 简单低速设备 |
| 中断方式 | 中等,完成后通知 | 字符设备、一般 I/O |
| DMA 方式 | 较低,块传输 | 磁盘、网卡等高速设备 |
| 通道方式 | 更低,专用 I/O 处理器 | 大型机系统 |
磁盘访问时间:
text
磁盘访问时间 = 寻道时间 + 旋转延迟 + 传输时间
考试中最常计算的是 磁头移动磁道数,通常近似代表寻道代价。
磁盘调度算法:
| 算法 | 思想 | 特点 |
|---|---|---|
| FCFS | 按请求到达顺序服务 | 公平但效率可能低 |
| SSTF | 最短寻道时间优先,选离当前磁头最近的请求 | 平均寻道短,可能饥饿 |
| SCAN 电梯算法 | 磁头按一个方向移动,沿途服务,到端点后反向 | 避免严重饥饿 |
| C-SCAN | 只按一个方向服务,到端点后快速回到另一端 | 等待时间更均匀 |
4. 易混点与常见误区
| 易错点 | 正确理解 |
|---|---|
| DMA 完全不需要 CPU | CPU 仍需初始化 DMA 和处理中断 |
| SSTF 一定最好 | SSTF 可能让远处请求长期等待 |
| SCAN 必须走到物理端点 | 看题目要求,有的题规定到端点,有的只到最远请求 |
| 磁盘调度算请求个数 | 通常算磁头移动总距离 |
5. 考试常见问法
- 比较程序查询、中断、DMA。
- 为什么要设置缓冲区?
- 给定磁道请求序列,用 FCFS、SSTF、SCAN 计算磁头移动距离。
- 什么是设备独立性?
6. 典型例题
磁头当前在 53 号磁道,请求序列为:
text
98, 183, 37, 122, 14, 124, 65, 67
使用 FCFS 算法,求总移动磁道数。
7. 解题思路
按原顺序访问:
text
53 -> 98:45
98 -> 183:85
183 -> 37:146
37 -> 122:85
122 -> 14:108
14 -> 124:110
124 -> 65:59
65 -> 67:2
总移动 = 45 + 85 + 146 + 85 + 108 + 110 + 59 + 2 = 640
所以总移动磁道数为 640。
8. 简短总结
I/O 模块重点掌握三件事:中断让 CPU 不必傻等,DMA 适合大块数据传输,磁盘调度题要按算法画出磁头移动路线。
模块九:保护、安全与系统调用
1. 本模块解决的问题
多用户、多进程系统必须保证资源不被非法访问。本模块解决:
- 如何限制程序权限?
- 操作系统如何提供安全接口?
- 文件和内存如何保护?
2. 核心概念
| 概念 | 通俗解释 | 考试重点 |
|---|---|---|
| 访问控制 | 决定谁可以访问什么资源 | 权限矩阵 |
| 权限位 | 文件读、写、执行权限 | Unix 权限 |
| 特权指令 | 只能内核态执行的指令 | I/O、关中断 |
| 系统调用接口 | 用户程序进入内核的入口 | 安全检查 |
| 保护域 | 主体可访问资源及权限的集合 | 保护机制 |
3. 关键规则
常见保护机制:
- CPU 保护:用户态和内核态,特权指令只能内核执行。
- 内存保护:基址/界限寄存器、页表权限位。
- 文件保护:读、写、执行权限;访问控制表。
- 设备保护:用户程序不能直接操作设备寄存器。
Unix 文件权限示例:
text
rwxr-x---
前三位:文件所有者权限
中三位:同组用户权限
后三位:其他用户权限
r = read,w = write,x = execute
4. 易混点与常见误区
| 易错点 | 正确理解 |
|---|---|
| 有保护就绝对安全 | 保护是机制,安全还依赖策略和实现 |
| 用户态不能做任何 I/O | 用户态可通过系统调用请求内核完成 I/O |
| 文件权限只保护内容 | 权限还影响执行、删除、目录进入等行为 |
5. 考试常见问法
- 为什么要设置特权指令?
- 系统调用如何保证安全?
- 简述内存保护的方法。
- 文件访问控制有哪些方式?
6. 典型例题
说明为什么修改页表应作为特权操作。
7. 解题思路
页表决定逻辑地址到物理地址的映射。如果用户程序能随意修改页表,就可能访问内核或其他进程的内存,破坏系统安全。因此修改页表必须由内核在内核态完成,并进行权限检查。
8. 简短总结
保护与安全模块分值通常不如同步、内存、调度高,但适合拿概念分。核心记住:凡是会影响全局资源和系统安全的操作,都应由内核控制。
6. 高频考点与考试重点
最值得优先掌握的 20% 内容
如果复习时间有限,优先掌握以下内容:
- 进程三态模型与状态转换。
- 进程与线程区别。
- FCFS、SJF、RR、优先级调度计算。
- 信号量 P/V 操作与生产者消费者模型。
- 死锁四个必要条件与银行家算法。
- 分页地址转换与页表计算。
- 虚拟内存、缺页中断、FIFO/LRU/OPT 页面置换。
- 文件分配方式:连续、链接、索引。
- 磁盘调度:FCFS、SSTF、SCAN。
- 系统调用、中断、用户态/内核态。
高频考点清单
| 高频考点 | 题型 | 掌握标准 |
|---|---|---|
| 操作系统功能 | 简答、选择 | 能说出四大管理功能 |
| 用户态与内核态 | 简答 | 能解释为什么需要权限区分 |
| 进程状态转换 | 画图、选择 | 能判断运行、就绪、阻塞转换 |
| 调度算法 | 计算 | 能画时间轴并算平均周转时间 |
| 信号量 | 代码填空、PV 题 | 能设置初值和 P/V 顺序 |
| 死锁 | 简答、计算 | 会四条件和银行家算法 |
| 分页 | 计算 | 会页号、偏移、物理地址 |
| 虚拟内存 | 计算、简答 | 会页面置换和缺页率 |
| 文件系统 | 简答、计算 | 会三种分配方式优缺点 |
| 磁盘调度 | 计算 | 会算移动总磁道数 |
必背概念、公式、定理或方法
| 类型 | 内容 |
|---|---|
| 概念 | 进程、线程、PCB、临界区、死锁、虚拟内存、缺页中断、文件控制块 |
| 公式 | 周转时间、带权周转时间、等待时间、有效访问时间 |
| 方法 | P/V 操作、银行家算法、分页地址转换、页面置换、磁盘调度 |
| 定理/条件 | 死锁四个必要条件、临界区三原则、局部性原理 |
7. 典型题型与解题模板
题型一:调度算法计算题
常见问法:给出进程到达时间和服务时间,计算平均周转时间、平均等待时间。
解题模板:
text
1. 按算法规则确定执行顺序。
2. 画时间轴,标出每个进程开始和完成时间。
3. 计算每个进程:
周转时间 = 完成时间 - 到达时间
等待时间 = 周转时间 - 服务时间
带权周转时间 = 周转时间 / 服务时间
4. 求平均值。
5. 若是抢占式算法,遇到新进程到达时重新比较。
题型二:信号量 PV 设计题
常见问法:用 P/V 操作解决同步互斥问题。
解题模板:
text
1. 找共享资源:是否需要互斥?
2. 找先后关系:谁必须等待谁?
3. 为互斥设置 mutex,初值通常为 1。
4. 为资源数量设置信号量,初值为资源数量。
5. 为条件同步设置信号量,初值看初始条件是否满足。
6. 写代码:
P(条件信号量)
P(mutex)
访问临界区
V(mutex)
V(通知信号量)
7. 检查是否存在死锁、漏 V、顺序错误。
题型三:银行家算法题
常见问法:判断当前状态是否安全,某请求能否分配。
解题模板:
text
1. 写出 Available、Max、Allocation。
2. 计算 Need = Max - Allocation。
3. 若有请求 Request:
检查 Request <= Need
检查 Request <= Available
试分配后再做安全性检查。
4. 安全性检查:
Work = Available
找 Need[i] <= Work 的进程
假设完成并释放资源:Work += Allocation[i]
记录安全序列
5. 能找到完整安全序列,则安全;否则不安全。
题型四:分页地址转换题
常见问法:给定逻辑地址、页面大小、页表,求物理地址。
解题模板:
text
1. 确定页面大小 page_size。
2. 页号 p = 逻辑地址 / page_size。
3. 页内偏移 d = 逻辑地址 % page_size。
4. 查页表得到页框号 f。
5. 物理地址 = f * page_size + d。
6. 若页号不存在或无效,则产生缺页或越界。
题型五:页面置换题
常见问法:给定访问序列和页框数,计算缺页次数。
解题模板:
text
1. 画表,列出每次访问的页号。
2. 若页已在内存,不缺页。
3. 若页不在内存:
有空页框则直接装入。
无空页框则按算法换出。
4. FIFO 看最早进入内存的页。
5. LRU 看最近最久未访问的页。
6. OPT 看未来最长时间不用的页。
7. 统计缺页次数和缺页率。
题型六:磁盘调度题
常见问法:给定当前磁头位置和请求序列,求总移动磁道数。
解题模板:
text
1. 标出当前磁头位置。
2. 按算法确定服务顺序:
FCFS:原顺序
SSTF:每次选最近请求
SCAN:沿一个方向服务,到端点或最远请求后反向
3. 计算相邻访问位置的距离。
4. 总移动距离 = 所有距离之和。
5. 注意题目是否要求磁头走到磁盘端点。
8. 易错点与避坑指南
| 易错点 | 为什么错 | 避坑方法 |
|---|---|---|
| 把程序和进程等同 | 程序是静态文件,进程是动态执行 | 答题时写"进程 = 程序的一次执行" |
| 把就绪和阻塞混淆 | 就绪缺 CPU,阻塞缺事件 | 判断是否"只差 CPU" |
| 调度题不画时间轴 | 容易漏抢占、错完成时间 | 每题必须画时间线 |
| P/V 顺序错误 | 可能死锁或破坏互斥 | 先同步条件,再进临界区 |
| 信号量初值随便设 | 初值代表资源数量或初始条件 | 写出每个信号量含义 |
| 不安全状态说成死锁 | 不安全只是可能死锁 | 死锁是已经互相等待 |
| 页号偏移算错 | 页面大小换算错误 | 先把 KB 转成字节 |
| LRU 按进入时间淘汰 | LRU 按最近访问时间 | 每次访问都更新时间 |
| 磁盘 SCAN 端点处理错 | 不同题设不同 | 看题目写"到端点"还是"到最远请求" |
| 文件分配方式优缺点混乱 | 三种方式适用场景不同 | 连续快、链接易扩、索引综合 |
9. 80 分复习策略
9.1 80 分所需能力结构
要在普通课程考试中达到 80 分,通常不需要掌握所有高级细节,但必须做到:
| 能力 | 要求 |
|---|---|
| 概念准确 | 能解释核心名词,不混淆相近概念 |
| 机制清楚 | 能说出中断、缺页、调度、系统调用的大致过程 |
| 计算稳定 | 调度、页面置换、银行家、磁盘调度少丢分 |
| 模板熟练 | PV 操作和简答题有固定答题结构 |
| 易错可控 | 不因单位、顺序、初值和状态判断丢基础分 |
9.2 高频题型优先级
| 优先级 | 内容 | 原因 |
|---|---|---|
| 第一优先级 | 调度、PV、分页、页面置换、银行家算法 | 分值高、题型稳定 |
| 第二优先级 | 进程线程、死锁条件、文件分配、磁盘调度 | 高频且容易拿分 |
| 第三优先级 | 中断、系统调用、I/O 控制、保护安全 | 多为概念分 |
9.3 每类题型得分策略
| 题型 | 得分关键 |
|---|---|
| 选择题 | 抓定义关键词,例如"就绪只缺 CPU" |
| 填空题 | 熟背公式、四条件、三原则、算法名称 |
| 简答题 | 按"定义 + 原因 + 过程/优缺点 + 例子"作答 |
| 计算题 | 写表格和中间过程,部分分很重要 |
| PV 题 | 先写信号量含义和初值,再写代码 |
| 综合题 | 先拆成资源、状态、算法三部分 |
9.4 考前 3 天复习重点
第 1 天:重建框架
- 背操作系统四大功能。
- 画进程状态转换图。
- 整理进程/线程、分页/分段、同步/互斥、死锁/不安全状态对比。
- 做 2 道调度计算题。
第 2 天:攻克计算与 PV
- 做 FCFS、SJF、RR 各 1 题。
- 做 FIFO、LRU、OPT 页面置换各 1 题。
- 做银行家算法 2 题。
- 默写生产者消费者 PV 模板。
第 3 天:查漏补缺
- 背死锁四条件、临界区三原则、局部性原理。
- 复习文件分配和磁盘调度。
- 把错题重新做一遍,不看答案写过程。
- 准备简答题模板。
9.5 考场答题策略
- 先拿稳定分:先做概念题、简单计算题,避免卡在 PV 综合题。
- 计算题写过程:即使最终答案错,也能拿步骤分。
- PV 题先写信号量说明:老师更容易看出你的逻辑。
- 简答题分点作答:每点一句话,避免长段空泛描述。
- 遇到不确定算法题,画表:表格比脑算可靠。
- 检查单位和初值:KB 与 B、信号量初值、页框数最容易错。
10. 分阶段学习计划
阶段一:快速入门阶段
| 项目 | 内容 |
|---|---|
| 学习目标 | 建立操作系统整体框架,知道各模块解决什么问题 |
| 学习内容 | 操作系统功能、进程概念、内存与文件基本概念 |
| 推荐时间 | 1 到 2 天,每天 2 到 3 小时 |
| 产出结果 | 画出一张"CPU-内存-文件-I/O"知识地图 |
| 自测标准 | 能用自己的话解释操作系统为什么需要进程、页表、文件系统 |
具体任务:
- 阅读本文第 2 到 4 部分。
- 手动画一次知识地图。
- 对每个模块写一句话概括。
阶段二:核心掌握阶段
| 项目 | 内容 |
|---|---|
| 学习目标 | 掌握高频概念、机制和公式 |
| 学习内容 | 进程调度、同步互斥、死锁、内存管理、虚拟内存 |
| 推荐时间 | 5 到 7 天,每天 2 到 4 小时 |
| 产出结果 | 完成核心概念表和公式表 |
| 自测标准 | 不看资料能解释 10 个核心概念,并完成基础计算题 |
具体任务:
- 每天学习 1 到 2 个核心模块。
- 每学完一个模块,完成对应典型例题。
- 用错题本记录"错因",例如单位错、算法规则错、概念混淆。
阶段三:刷题巩固阶段
| 项目 | 内容 |
|---|---|
| 学习目标 | 提高考试得分稳定性 |
| 学习内容 | 调度、PV、银行家、页面置换、磁盘调度专项题 |
| 推荐时间 | 4 到 6 天,每天 3 小时左右 |
| 产出结果 | 每类题型形成固定解题模板 |
| 自测标准 | 同类题正确率达到 80% 以上 |
具体刷题安排:
| 题型 | 推荐数量 | 检查重点 |
|---|---|---|
| 调度算法 | 6 到 8 题 | 时间轴、抢占点、平均值 |
| PV 操作 | 5 到 6 题 | 信号量初值、P/V 顺序 |
| 银行家算法 | 4 到 5 题 | Need、Work、安全序列 |
| 页面置换 | 6 到 8 题 | 缺页次数、替换对象 |
| 磁盘调度 | 4 到 5 题 | 服务顺序、移动距离 |
阶段四:考前冲刺阶段
| 项目 | 内容 |
|---|---|
| 学习目标 | 查漏补缺,稳定拿 80 分 |
| 学习内容 | 高频表格、错题、简答模板 |
| 推荐时间 | 考前 2 到 3 天 |
| 产出结果 | 一页纸速查表 + 错题清单 |
| 自测标准 | 30 分钟内完成一套核心自测题,正确率 80% 以上 |
冲刺重点:
- 默写死锁四条件、临界区三原则、操作系统四大功能。
- 重做所有错题,不看答案写步骤。
- 复习所有"易混点对比表"。
- 做一套计时练习,训练答题速度。
11. 一页纸速查表
11.1 高频概念表
| 概念 | 一句话解释 |
|---|---|
| 操作系统 | 管理硬件资源并为程序提供服务的系统软件 |
| 进程 | 程序的一次执行过程,是资源分配的基本单位 |
| 线程 | 进程内的执行流,是 CPU 调度的基本单位 |
| PCB | 保存进程状态、寄存器、资源等信息的数据结构 |
| 临界区 | 访问临界资源的代码段 |
| 信号量 | 用整数和等待队列实现同步互斥的机制 |
| 死锁 | 多个进程因互相等待资源而无法继续 |
| 分页 | 把逻辑空间和物理内存划分成固定大小块 |
| 页表 | 记录页号到页框号映射的数据结构 |
| 虚拟内存 | 只把需要的页面调入内存,让程序拥有更大逻辑空间 |
| 缺页中断 | 访问页面不在内存时产生的异常 |
| 文件系统 | 管理文件、目录和磁盘空间的操作系统模块 |
| DMA | 设备与内存直接传输数据,减少 CPU 参与 |
11.2 高频公式/规则/方法表
| 内容 | 公式或规则 |
|---|---|
| 周转时间 | 完成时间 - 到达时间 |
| 带权周转时间 | 周转时间 / 服务时间 |
| 等待时间 | 周转时间 - 服务时间 |
| 页号 | 逻辑地址 / 页面大小 |
| 页内偏移 | 逻辑地址 % 页面大小 |
| 物理地址 | 页框号 * 页面大小 + 页内偏移 |
| Need | Max - Allocation |
| 有效访问时间 | (1 - p) * 内存访问时间 + p * 缺页处理时间 |
| 磁盘移动距离 | 相邻访问磁道差的绝对值之和 |
11.3 易混知识点对比表
| 对比项 | A | B | 核心区别 |
|---|---|---|---|
| 程序 vs 进程 | 静态代码 | 动态执行 | 是否正在运行 |
| 进程 vs 线程 | 资源分配单位 | CPU 调度单位 | 线程共享进程资源 |
| 并发 vs 并行 | 交替推进 | 同时执行 | 是否真正同一时刻 |
| 同步 vs 互斥 | 解决先后关系 | 解决独占访问 | 一个看顺序,一个看冲突 |
| 就绪 vs 阻塞 | 只缺 CPU | 等事件 | 是否能被调度 |
| 分页 vs 分段 | 固定大小 | 按逻辑模块 | 分页利于管理,分段利于共享保护 |
| 内部碎片 vs 外部碎片 | 分配块内部浪费 | 空闲块不连续 | 浪费位置不同 |
| FIFO vs LRU | 最早进入 | 最久未访问 | 判断依据不同 |
| 死锁 vs 不安全 | 已无法推进 | 可能无法推进 | 是否已经形成等待 |
11.4 典型题型与解法表
| 题型 | 必做步骤 |
|---|---|
| 调度计算 | 排序 -> 画时间轴 -> 求完成时间 -> 求周转/等待 |
| PV 操作 | 找资源 -> 找先后关系 -> 设信号量 -> 写 P/V -> 检查死锁 |
| 银行家算法 | 算 Need -> Work 检查 -> 找安全序列 |
| 分页地址 | 算页号和偏移 -> 查页表 -> 算物理地址 |
| 页面置换 | 画页面表 -> 按算法替换 -> 统计缺页 |
| 磁盘调度 | 定服务顺序 -> 算相邻距离 -> 求总和 |
| 简答题 | 定义 -> 原因 -> 过程/优缺点 -> 例子 |
12. 自测题
12.1 概念题
- 简述操作系统的四大基本功能。
- 进程和线程有什么区别?
- 什么是临界区?临界区管理应满足哪些原则?
- 死锁产生的四个必要条件是什么?
- 什么是虚拟内存?它主要依据什么原理?
12.2 计算题
- 有三个进程:
| 进程 | 到达时间 | 服务时间 |
|---|---|---|
| P1 | 0 | 4 |
| P2 | 1 | 3 |
| P3 | 2 | 2 |
使用 FCFS 算法,求平均周转时间。
- 某分页系统页面大小为 2KB,逻辑地址为 5000,页表如下:
| 页号 | 页框号 |
|---|---|
| 0 | 2 |
| 1 | 5 |
| 2 | 7 |
求逻辑地址 5000 对应的物理地址。
- 页面访问序列为:
text
1, 2, 1, 3, 1, 2, 4
页框数为 3,使用 FIFO 算法,求缺页次数。
- 磁头当前在 50 号磁道,请求序列为:
text
60, 20, 70, 10
使用 FCFS 算法,求总移动磁道数。
12.3 分析题
- 为什么生产者消费者问题中需要
mutex、empty、full三个信号量? - 为什么用户程序不能直接修改页表?
- 简述缺页中断的处理过程。
13. 自测题答案与解析
13.1 概念题答案
1. 操作系统的四大基本功能
操作系统主要功能包括:
- 处理机管理:负责进程、线程和 CPU 调度。
- 存储器管理:负责内存分配、地址转换、虚拟内存。
- 文件管理:负责文件、目录和磁盘空间管理。
- 设备管理:负责 I/O 设备控制、中断、缓冲和驱动程序。
2. 进程和线程的区别
进程是程序的一次执行过程,是资源分配的基本单位;线程是进程内的执行流,是 CPU 调度的基本单位。同一进程内的线程共享地址空间、打开文件等资源,但每个线程有自己的程序计数器、寄存器和栈。
3. 临界区与管理原则
临界区是访问临界资源的代码段。管理临界区应满足:
- 互斥进入:同一时刻最多一个进程进入。
- 空闲让进:临界区空闲时应允许请求者进入。
- 有限等待:等待进程不能无限期等待。
4. 死锁四个必要条件
死锁产生必须同时满足:
- 互斥条件。
- 请求并保持条件。
- 不可剥夺条件。
- 循环等待条件。
5. 虚拟内存与依据原理
虚拟内存是一种存储管理技术,它让程序看到比实际物理内存更大的逻辑地址空间,只在需要时把页面调入内存。它主要依据 局部性原理:程序在一段时间内通常集中访问少量代码和数据。
13.2 计算题答案
6. FCFS 平均周转时间
执行顺序:
text
P1 -> P2 -> P3
完成时间:
text
P1 完成于 4
P2 完成于 7
P3 完成于 9
周转时间:
text
P1 = 4 - 0 = 4
P2 = 7 - 1 = 6
P3 = 9 - 2 = 7
平均周转时间 = (4 + 6 + 7) / 3 = 17 / 3 = 5.67
答案:5.67。
7. 分页地址转换
页面大小为 2KB = 2048B。
text
页号 p = 5000 / 2048 = 2
页内偏移 d = 5000 % 2048 = 904
页号 2 对应页框号 7
物理地址 = 7 * 2048 + 904 = 15240
答案:15240。
8. FIFO 页面置换
页面访问过程:
| 访问 | 内存状态 | 是否缺页 |
|---|---|---|
| 1 | 1 | 是 |
| 2 | 1,2 | 是 |
| 1 | 1,2 | 否 |
| 3 | 1,2,3 | 是 |
| 1 | 1,2,3 | 否 |
| 2 | 1,2,3 | 否 |
| 4 | 2,3,4 | 是,换出 1 |
缺页次数为 4。
9. FCFS 磁盘调度
text
50 -> 60:10
60 -> 20:40
20 -> 70:50
70 -> 10:60
总移动 = 10 + 40 + 50 + 60 = 160
答案:160。
13.3 分析题答案
10. 为什么需要 mutex、empty、full 三个信号量?
mutex用于互斥访问缓冲区,防止多个生产者或消费者同时修改缓冲区。empty表示空缓冲区数量,生产者在没有空位时必须等待。full表示已有产品数量,消费者在没有产品时必须等待。
三者分别解决不同问题:mutex 解决互斥,empty 和 full 解决同步。
11. 为什么用户程序不能直接修改页表?
页表决定逻辑地址到物理地址的映射。如果用户程序能直接修改页表,就可能访问内核空间或其他进程的内存,破坏隔离和安全。因此页表修改必须由操作系统内核在内核态完成。
12. 缺页中断处理过程
缺页中断处理过程如下:
text
访问页面
-> 查页表发现页面不在内存
-> 产生缺页中断,进入内核
-> 操作系统找到页面在外存的位置
-> 若有空闲页框,则调入页面
-> 若没有空闲页框,则按置换算法换出一页
-> 更新页表和相关标志位
-> 返回用户程序,重新执行导致缺页的指令
14. 最后总结
操作系统不是一堆孤立名词,而是一套围绕"资源管理"的完整体系:
- CPU 管理:用进程、线程和调度解决多个程序共享 CPU 的问题。
- 并发管理:用同步、互斥和死锁处理解决多个进程协作的问题。
- 内存管理:用分页、分段和虚拟内存解决程序装入、隔离和扩展的问题。
- 文件与 I/O 管理:用文件系统、设备驱动、缓冲和磁盘调度解决长期存储和外设访问的问题。
- 保护机制:用用户态/内核态、系统调用、权限控制保证系统安全。
想考到 80 分以上,最有效的路线不是把教材从头背到尾,而是:
- 先建立资源管理主线。
- 再掌握高频机制和概念区别。
- 最后反复训练稳定题型:调度、PV、银行家、分页、页面置换、磁盘调度。
如果只能记一句话:
操作系统的核心任务,是在安全和高效的前提下,把有限的硬件资源分配给多个正在运行的程序。