Skip to content

2011年 408 操作系统 第 27 题

操作系统2011年选择题2分

题目

某时刻进程的资源使用情况如下表所示。

进程已分配资源数尚需资源数可用资源数R1R2R3R1R2R3R1R2R3P1200001P2120132P3011131P4001200021

此时的安全序列是( )。

错因

A

只看到"P1 的 Need=(0,0,1) 满足 Available=(0,2,1)"就顺着选项给的顺序往后推,没有逐进程做"Need ≤ Work"的安全性检查。P1 推完后 Available 变成 (2,2,1),但下一个进程 P2 的 Need=(1,3,2) 第二维需要 3,已超过当前可用的 2,根本无法满足,所以 P1→P2 这步走不通。

B

注意到了 P4 的 Need=(2,0,0) 在某一刻能满足,于是凑了"P1→P4→P3→P2"的顺序。但 P1、P4 完成后 Available=(2,2,2),P3 的 Need=(1,3,1) 第二维仍要 3 > 2,不满足,序列断裂。选 B 的人通常忽略了"每一步都要做完整 Need ≤ Available 检查",只验了首尾几个。

C

错误地把 P3 排在 P2 前面,但其实在 P1 完成后 Available=(2,2,1),P3 的 Need=(1,3,1) 第二维同样 3>2 无法满足。同样是只看了 R1、R3 维,漏掉了 R2 的约束。

总解析

银行家算法的"安全性检查"步骤:维护一个 Work = Available 向量,反复扫描所有未完成进程,找一个满足 Need ≤ Work 的,让它"完成"并把它的 Alloc 加回到 Work;如果某一轮所有未完成进程都不满足,就不安全

第一轮:Work = (0, 2, 1)

逐进程比较 Need ≤ Work:

进程NeedNeed ≤ (0,2,1)?
P1(0, 0, 1)✓ 可分配
P2(1, 3, 2)✗ R1:1>0
P3(1, 3, 1)✗ R1:1>0
P4(2, 0, 0)✗ R1:2>0

只有 P1 通过。P1 完成,Work += Alloc(P1) = (0,2,1) + (2,0,0) = (2, 2, 1)

进程已分配资源数尚需资源数可用资源数R1R2R3R1R2R3R1R2R3P1200001P2120132P3011131P4001200221

第二轮:Work = (2, 2, 1)

进程NeedNeed ≤ (2,2,1)?
P2(1, 3, 2)✗ R2:3>2
P3(1, 3, 1)✗ R2:3>2
P4(2, 0, 0)✓ 可分配

只有 P4 通过。P4 完成,Work += Alloc(P4) = (2,2,1) + (0,0,1) = (2, 2, 2)

进程已分配资源数尚需资源数可用资源数R1R2R3R1R2R3R1R2R3P1200001P2120132P3011131P4001200222

第三轮:Work = (2, 2, 2)

进程NeedNeed ≤ (2,2,2)?
P2(1, 3, 2)✗ R2:3>2
P3(1, 3, 1)✗ R2:3>2

P2 和 P3 都因 R2 资源不足而无法分配,且没有其他进程可释放 R2——系统进入死锁状态,安全序列不存在。

最终答案是 D(不存在)

编者注(解题技巧):银行家题做错的高频原因是只算 R1、忘检查 R2/R3 的某一维。做这类题时建议把每轮的 Need ≤ Work 三维并列写出来逐维比较,而不是凭眼看"够不够"。

最后更新:

🎬 可视化演示
加载中...

提示:可在可视化区直接操作播放、步进、修改参数