Appearance
题目
假设 5 个进程P0-P4共享三类资源R1、R2、R3,这些资源总数分别为 18、6、22。T0 时刻的资源分配情况如下表所示,此时存在的一个安全序列是( )。 [含图]

图示资源分配表(资源总数 R1=18、R2=6、R3=22):
进程 已分配 R1, R2, R3 资源最大需求 R1, R2, R3 P0 3, 2, 3 5, 5, 10 P1 4, 0, 3 5, 3, 6 P2 4, 0, 5 4, 0, 11 P3 2, 0, 4 4, 2, 5 P4 3, 1, 4 4, 2, 4
错因
A
让 P0 第一个跑,但 P0 的 Need = (2, 3, 7)——R3 还需 7 个,而 Available 只有 3 个,P0 跑不动。把"序列里能开始的那个"算错了,没先验证 Need ≤ Available。
B
让 P1 第一个跑(Need = (1, 3, 3) ≤ Available (2, 3, 3),能开始);P1 释放 (4, 0, 3) 后 Available = (6, 3, 6)。但接下来要 P0(Need = (2, 3, 7))—— R3 还需 7,可用只 6,P0 跑不了。序列在第二步断。
C
让 P2 第一个跑,但 P2 的 Need = (0, 0, 6)——R3 需 6,Available 只 3,P2 跑不了。第一步就断。
总解析
银行家安全性检测:算 Need 和 Available,然后逐步看哪个进程能先跑、跑完释放后能让谁跑、能否走完所有进程。
第 1 步:算 Need 和 Available
| 进程 | Need (R1, R2, R3) |
|---|---|
| P0 | → (2, 3, 7) |
| P1 | → (1, 3, 3) |
| P2 | → (0, 0, 6) |
| P3 | → (2, 2, 1) |
| P4 | → (1, 1, 0) |
第 2 步:验证序列 D(P3 → P4 → P2 → P1 → P0)
| 步 | 跑哪个 | Need | Available 是否够? | 跑完释放(=Allocation) | 新 Available |
|---|---|---|---|---|---|
| 1 | P3 | (2, 2, 1) | ✓ ≤ (2, 3, 3) | (2, 0, 4) | (2+2, 3+0, 3+4) = (4, 3, 7) |
| 2 | P4 | (1, 1, 0) | ✓ ≤ (4, 3, 7) | (3, 1, 4) | (4+3, 3+1, 7+4) = (7, 4, 11) |
| 3 | P2 | (0, 0, 6) | ✓ ≤ (7, 4, 11) | (4, 0, 5) | (7+4, 4+0, 11+5) = (11, 4, 16) |
| 4 | P1 | (1, 3, 3) | ✓ ≤ (11, 4, 16) | (4, 0, 3) | (11+4, 4+0, 16+3) = (15, 4, 19) |
| 5 | P0 | (2, 3, 7) | ✓ ≤ (15, 4, 19) | (3, 2, 3) | (15+3, 4+2, 19+3) = (18, 6, 22) |
5 步都能走通,所有进程跑完,资源全部回收 → D 是合法安全序列。
反向验证 A、B、C 都在某一步断(错因里已说明):
- A 第 1 步:P0 Need (2, 3, 7) 不满足 Available (2, 3, 3)
- B 第 2 步:P0 Need (2, 3, 7) 不满足 Available (6, 3, 6)
- C 第 1 步:P2 Need (0, 0, 6) 不满足 Available (2, 3, 3)
关键原则:先看哪个进程的 Need 全部 ≤ 当前 Available,让它先跑;跑完释放,更新 Available 再选下一个。Need 在任一资源维度上 > Available 都不能跑——多资源类型只要一类不够就失败。
最终答案是 D。