Appearance
题目
某系统中有 A、B 两类资源各 6 个,t 时刻资源分配及需求情况如下表所示。
| 进程 | A 已分配数量 | B 已分配数量 | A 需求总量 | B 需求总量 |
|---|---|---|---|---|
| P1 | 2 | 3 | 4 | 4 |
| P2 | 2 | 1 | 3 | 1 |
| P3 | 1 | 2 | 3 | 4 |
t 时刻安全性检测结果是( )。
错因
A
第一步就跳到 P1。可 t 时刻 Available 只有 (1, 0),P1 的 Need 是 (2, 1)——A 维 1 < 2 直接卡住,P1 根本上不了第一棒。这个错的根源是看到题面有 P1、P2、P3 三个序号就按序号顺序试,没先把 Available 与 Need 对比一下挑可跑的。
C
走对了第一步(P2 先跑通),但第二步选了 P3。P2 跑完后 Available = (1,0) + (2,1) = (3,1),此时 P3 的 Need 是 (2,2)——B 维 1 < 2 还过不去,跑不动。第二步只能挑 P1(Need (2,1) ≤ (3,1)),不是 P3。
D
可能算 Available 时算错了,或者觉得"Available A=1、B=0 太小"直觉上不安全。其实 P2 的 Need (1,0) 刚好被 (1,0) 卡着边吃下,P2 跑完释放出 (2,1) 让 Available 涨到 (3,1),链条就能接着推下去——别被起始 Available 太小吓住。
总解析
安全性检测就是反复做一件事:维护 Work = Available,从未完成进程里挑一个 Need ≤ Work 的让它跑完,把它的 Alloc 加回 Work,直到全部跑完(安全)或没有可挑的(不安全)。
第 0 步:算 Available 和 Need
总资源 (A=6, B=6),已分配总和:
- A:
- B:
Available = 。
各进程 Need = Max - Alloc:
| 进程 | Alloc | Need |
|---|---|---|
| P1 | (2, 3) | (2, 1) |
| P2 | (2, 1) | (1, 0) |
| P3 | (1, 2) | (2, 2) |
第 1 步:Work = (1, 0)
| 进程 | Need | Need ≤ (1,0) ? |
|---|---|---|
| P1 | (2, 1) | ✗(A 维 2 > 1) |
| P2 | (1, 0) | ✓ |
| P3 | (2, 2) | ✗(A 维 2 > 1) |
只有 P2 通过。P2 跑完,Work = (1,0) + (2,1) = (3, 1)。
第 2 步:Work = (3, 1)
| 进程 | Need | Need ≤ (3,1) ? |
|---|---|---|
| P1 | (2, 1) | ✓ |
| P3 | (2, 2) | ✗(B 维 2 > 1) |
只有 P1 通过。P1 跑完,Work = (3,1) + (2,3) = (5, 4)。
第 3 步:Work = (5, 4)
| 进程 | Need | Need ≤ (5,4) ? |
|---|---|---|
| P3 | (2, 2) | ✓ |
P3 跑完,全部进程结束。
唯一安全序列:P2 → P1 → P3。
最终答案是 B。