Appearance
题目
某时刻进程的资源使用情况如下表所示。
此时的安全序列是( )。
错因
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:
| 进程 | Need | Need ≤ (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)。
第二轮:Work = (2, 2, 1)
| 进程 | Need | Need ≤ (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)。
第三轮:Work = (2, 2, 2)
| 进程 | Need | Need ≤ (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三维并列写出来逐维比较,而不是凭眼看"够不够"。