考研408操作系统进程管理考点讲解
> 进程管理是操作系统的核心章节,也是408考试中分值最高、考查最频繁的模块。本章在历年408统考中通常占据 15-20分,选择题约2-4题,大题几乎每年必考 PV操作 或 银行家算法。本章核心掌握:进程与线程、状态转换、进程调度算法、同步与互斥(PV操作)、死锁五大板块。
一、进程与线程——基础中的基础
1.1 进程的概念
进程(Process) 是程序的一次执行过程,是操作系统资源分配的基本单位。
进程的组成(必考) :进程 = 程序段 + 数据段 + 进程控制块(PCB) 。
> PCB(Process Control Block) 是进程存在的唯一标志,操作系统通过PCB来记录每个进程的状态信息。PCB中记录了进程标识符、程序计数器、CPU寄存器、内存信息、打开文件列表等全部信息。
进程的特征:
- 动态性:进程是程序的执行过程,有生命周期
- 并发性:多个进程可同时在内存中并发执行
- 独立性:进程是独立运行的基本单位
- 异步性:进程按各自独立的、不可预知的速度推进
- 结构性:进程=程序段+数据段+PCB
1.2 进程与程序的区别(高频选择题)
| 对比项 | 程序 | 进程 |
|:---|:---|:---|
| 本质 | 静态的指令集合 | 动态的执行过程 |
| 生命周期 | 永久(存放在磁盘) | 临时(创建到消亡) |
| 组成 | 代码+数据 | 代码+数据+PCB |
| 一个程序对应 | 一个程序文件 | 可对应多个进程实例 |
1.3 进程与线程
线程(Thread) 是CPU调度的基本单位,同一进程内的多个线程共享进程的资源(内存空间、打开文件等)。
引入线程的好处(高频考点):
- 线程切换开销远小于进程切换
- 同一进程内线程间通信无需通过内核
- 提高了并发度
> 进程是资源分配的单位,线程是CPU调度的单位——这是408选择题的经典考点。
1.4 进程的组织方式
操作系统通过PCB来组织进程,主要有两种方式:
- 链接方式:将相同状态的PCB链接成队列(就绪队列、阻塞队列等)
- 索引方式:建立索引表,按状态索引PCB
二、进程的状态与转换(选择题必考)
2.1 五大状态
```
┌──────────────────────────────────────────────┐
│ 创建状态 (New) │
└────────────────────┬─────────────────────────┘
↓
┌──────────────────────────────────────────────┐
│ 就绪状态 (Ready) │
│ (已获得除CPU外所有资源) │
└────────┬───────────────────────┬─────────────┘
↓ ↑
┌─────────────────────┐ ┌─────────────────────┐
│ 运行状态 (Running) │───→│ 阻塞状态 (Blocked) │
└─────────────────────┘ └─────────────────────┘
↓
┌──────────────────────────────────────────────┐
│ 终止状态 (Terminated) │
└──────────────────────────────────────────────┘
```
进程状态转换的三种主要情况:
1. 就绪 → 运行:进程调度程序从就绪队列中选中一个进程,分配CPU
2. 运行 → 就绪:时间片用完(抢占)或更高优先级进程到达
3. 运行 → 阻塞:进程请求I/O、等待事件发生
4. 阻塞 → 就绪:I/O完成、等待的事件发生
5. 就绪/阻塞 → 终止:进程完成任务或被强制终止
> 💡 易错点:运行态进程不能直接转为阻塞态以外的状态?不对,运行→就绪、运行→阻塞、运行→终止都是合法转换。
三、进程控制——四大原语
进程控制由操作系统内核通过原语(Primitive) 实现。原语是不可中断的原子操作。
3.1 进程创建原语
触发事件:用户登录、作业调度、系统服务请求、父进程创建子进程。
创建过程:
1. 申请空白PCB
2. 为新进程分配资源
3. 初始化PCB
4. 将新进程插入就绪队列
3.2 进程撤销原语
触发事件:进程正常结束、异常结束、被其他进程终止。
撤销过程:
1. 从PCB集合中检索该进程
2. 回收其占用的所有资源
3. 撤销该进程的PCB
4. 若进程有子进程,还需撤销其子进程
3.3 进程阻塞原语
触发事件:进程请求I/O、等待某事件发生时,调用阻塞原语主动阻塞自己。
阻塞过程:
1. 保存当前进程的CPU现场
2. 将进程状态改为阻塞态
3. 将其PCB插入相应阻塞队列
4. 调度其他进程运行
3.4 进程唤醒原语
触发事件:I/O完成、等待的事件发生时,由相关进程或中断唤醒。
唤醒过程:
1. 从阻塞队列中找到该进程
2. 将状态改为就绪态
3. 将其PCB移入就绪队列
> 阻塞是进程主动行为,唤醒是被动行为——这是408选择题的常见考点。
四、进程调度(必考大题)
4.1 调度的三个层次
| 层次 | 别名 | 功能 |
|:---|:---|:---|
| 高级调度 | 长程调度、作业调度 | 从外存后备队列中选作业调入内存 |
| 中级调度 | 中程调度、内存调度 | 将进程换出到外存或换入内存 |
| 低级调度 | 短程调度、进程调度 | 从就绪队列中选进程分配CPU(频率最高) |
> 408考试中“进程调度”通常指低级调度。
4.2 调度的时机
可调度时机:
- 进程从运行态转为阻塞态(如I/O请求)
- 进程从运行态转为就绪态(时间片用完、被抢占)
- 进程从阻塞态转为就绪态(I/O完成)
- 进程终止
4.3 调度方式
| 方式 | 特点 | 典型算法 |
|:---|:---|:---|
| 非抢占式 | 进程一旦获得CPU,除非主动放弃,否则一直运行 | FCFS、SJF(非抢占版) |
| 抢占式 | 更高优先级进程可剥夺当前进程的CPU | RR、SRT、抢占式优先级 |
4.4 核心调度算法(计算题重点)
1. 先来先服务(FCFS)
- 按进程到达顺序分配CPU
- 非抢占式,简单公平
- 缺点:平均等待时间长,不利于短作业(“护航效应”)
2. 短作业优先(SJF)
- 优先服务估计运行时间最短的进程
- 可抢占(SRT)或非抢占
- 优点:平均等待时间最短
- 缺点:需要预知运行时间,长作业可能饥饿
3. 优先级调度
- 按优先级高低分配CPU
- 静态优先级 vs 动态优先级
- 缺点:低优先级进程可能饥饿 → 可用老化技术解决
4. 时间片轮转(RR)
- 每个进程分配固定时间片,轮流执行
- 时间片过大→退化为FCFS;过小→上下文切换开销过大
- 分时系统的核心调度算法
5. 多级反馈队列调度(MFQ)
- 设置多个优先级队列,优先级越高的队列时间片越短
- 新进程进入最高优先级队列
- 时间片用完未完成则降入下一级队列
- 综合了优先级和RR的优点,是目前最常用的调度算法
4.5 调度算法的性能评价指标
| 指标 | 定义 |
|:---|:---|
| CPU利用率 | CPU忙碌时间/总时间 |
| 系统吞吐量 | 单位时间完成的进程数 |
| 周转时间 | 从提交到完成的总时间 |
| 带权周转时间 | 周转时间/运行时间 |
| 等待时间 | 进程在就绪队列中等待的时间总和 |
| 响应时间 | 从提交到首次响应的时间 |
五、进程同步与互斥(大题的绝对核心)
5.1 基本概念
- 临界资源:一次仅允许一个进程使用的资源(如打印机、共享变量)
- 临界区:访问临界资源的代码段
- 同步:多个进程按特定顺序执行(直接制约关系)
- 互斥:多个进程不能同时进入临界区(间接制约关系)
5.2 临界区访问的四个原则(选择题高频)
1. 空闲让进:临界区空闲时,允许一个进程进入
2. 忙则等待:临界区已被占用时,其他进程必须等待
3. 有限等待:进程不能无限等待,保证最终能进入
4. 让权等待:不能进入时主动释放CPU
5.3 信号量机制(PV操作)——大题绝对重点
信号量(Semaphore)是一种用于控制多个进程对共享资源访问的同步机制:
- 二进制信号量:取值0或1,用于互斥
- 计数信号量:可取值非负整数,用于资源计数
P操作(wait) :
```
P(S):
S = S - 1
if S < 0:
将进程阻塞,插入等待队列
```
V操作(signal) :
```
V(S):
S = S + 1
if S <= 0:
从等待队列唤醒一个进程
```
> 核心规律:
> - 互斥:先P后V,P和V必须属于同一个进程,信号量初值一般为1
> - 同步:先V后P,V和P分属不同进程,信号量初值一般为0
5.4 经典同步问题(必须掌握)
1. 生产者-消费者问题
问题描述:多个生产者往缓冲区放数据,多个消费者从缓冲区取数据,缓冲区大小为n。
核心要点:
- 互斥信号量 mutex(初值1)保护缓冲区
- 同步信号量 empty(初值n)表示空位数量
- 同步信号量 full(初值0)表示已占位数量
- P操作的顺序至关重要——先P(empty/full),再P(mutex)
2. 读者-写者问题
问题描述:多个读者可同时读,但写者独占访问。
核心要点:
- 读者计数 count 记录当前读者数
- 读者进入时 count++(第一个读者要P(write))
- 读者离开时 count--(最后一个读者要V(write))
3. 哲学家进餐问题
问题描述:5个哲学家围坐,每人左右各有一根筷子,需两根筷子才能吃饭。
解决方案:
- 方案一:最多允许4个哲学家同时就餐
- 方案二:仅当左右筷子都可用时才拿起(破坏占有并等待)
- 方案三:奇数号先拿左筷,偶数号先拿右筷(破坏循环等待)
4. 吸烟者问题
问题描述相对简单,但考查频率较低,了解即可。
5.5 PV操作大题答题模板
解题步骤:
1. 分析进程:题干中有哪些进程?它们各自做什么?
2. 确定同步/互斥关系:哪些进程需要互斥?哪些需要同步?
3. 定义信号量:确定信号量个数、含义和初值
4. 写出伪代码:每个进程的P/V操作位置要准确
5. 检查死锁:连续多个P操作的地方是否会发生死锁(只有单个P操作不会死锁)
六、死锁(大题+选择题)
6.1 死锁的定义
死锁是指多个进程因竞争资源而造成的一种互相等待的僵局,若无外力作用,这些进程都将无法向前推进。
6.2 死锁的四个必要条件(缺一不可)
1. 互斥条件:资源一次只能分配给一个进程
2. 占有并等待:进程已占有资源,同时等待其他资源
3. 非抢占条件:已分配的资源不能被强行剥夺
4. 循环等待条件:进程间形成资源等待的循环链
6.3 死锁处理策略(408常考对比)
| 策略 | 方法 | 408考查形式 |
|:---|:---|:---|
| 死锁预防 | 破坏四个必要条件之一 | 选择题 |
| 死锁避免 | 银行家算法 | 大题必考 |
| 死锁检测与解除 | 资源分配图、进程撤销 | 选择题/大题 |
6.4 银行家算法(大题重点)
核心思想:在分配资源前,先判断分配后系统是否处于安全状态,只有安全才分配。
安全状态判断步骤:
1. 计算每个进程的剩余需求 = 最大需求 - 已分配
2. 找出当前可用资源能满足的进程
3. 假设该进程运行完毕,释放其占用的全部资源,更新可用资源数
4. 重复上述步骤
5. 若所有进程均可完成 → 存在安全序列 → 系统安全
6. 若存在无法完成的进程 → 不安全状态 → 可能死锁
6.5 死锁的检测与解除
资源分配图:节点表示进程或资源,边表示请求或分配关系。图中存在环路不一定死锁,但死锁一定存在环路。
死锁解除方法:
1. 撤销进程(撤销全部死锁进程或逐个撤销)
2. 剥夺资源(从某些进程强行收回资源)
3. 进程回退(回退到死锁发生前的状态)
七、高频易错点与应试技巧
7.1 进程与线程易混淆点
| 易混点 | 正确理解 |
|:---|:---|
| 进程切换比线程切换开销大 | ✅ 正确(线程共享地址空间,无需切换页表) |
| 同一进程的多个线程共享全部资源 | ❌ 不共享栈(每个线程有自己的栈) |
| 进程是调度的基本单位 | ❌ 进程是资源分配的基本单位,线程是调度的基本单位 |
7.2 PV操作易错点
- 信号量初值:互斥信号量初值=1;同步信号量初值=0;资源计数信号量初值=资源数量
- P操作顺序:先P同步信号量,再P互斥信号量——顺序反了会死锁
- V操作顺序:先V互斥信号量,再V同步信号量
- 多个P操作检查死锁:连续多个P操作可能导致死锁
7.3 调度算法易错点
- FCFS是非抢占式,SJF可以抢占也可以非抢占
- RR的时间片大小影响性能——过小则上下文切换过多,过大则退化为FCFS
- 多级反馈队列调度——新进程总是进入最高优先级队列,这是关键特征
7.4 银行家算法易错点
- 安全状态 ≠ 没有死锁:安全状态一定不会死锁,但不安全状态不一定死锁
- 银行家算法需要所有进程的最大需求信息,实际系统难以获取
八、备考建议
1. PV操作是重中之重:近10年408大题几乎每年必考PV操作,必须把生产者-消费者、读者-写者、哲学家进餐三大经典问题做熟。建议把王道上的所有PV大题做3遍以上。
2. 银行家算法:掌握安全序列的判断步骤,近10年至少考过3次大题。
3. 调度算法计算:FCFS、SJF、RR的平均周转时间和平均等待时间计算是选择题和大题的常客。
4. 死锁四个必要条件:选择题每年必考,必须精准记忆。
5. 进程状态转换图:画在草稿纸上,每天看一遍,确保选择题不丢分。
> 进程管理是操作系统的“心脏”,也是408考试中性价比最高的章节——投入时间与得分回报成正比。PV操作练到“看到题目就能想到信号量设计”的程度,银行家算法练到“3分钟内判断完安全序列”的速度,这两大块拿下了,进程管理的大题分数就稳了。坚持每天做1道PV操作题,一个月后你会发现——PV操作不过如此。