Appearance
题目
系统中有三个进程 P0、P1、P2 及三类资源 A、B、C。若某时刻系统分配资源的情况如下表所示,则此时系统中存在的安全序列的个数为( )。
错因
A
找到一条 P0→P1→P2 的安全序列就停手了,以为题目问的是"安全 / 不安全"。其实问的是个数,第一步定下 P0 之后,第二步谁先谁后还要继续往下推——P0 完成后 Work 变得宽松,P1 和 P2 都满足条件,分叉成两条路径。
C
多半在第一步把 P1 或 P2 也误判成可跑了,凑出三条序列。但仔细对一下三维:P1 的 Need C 维需要 3,P2 的 Need C 维也需要 3,而 Available 的 C 只有 2——两个都卡在 C 上过不了第一关。第一步只有 P0 一个候选。
D
直接拿 3! = 6 个排列减掉"显然不行"的,凭感觉留 4。但其实第一步定死 P0、第二步分叉成 P1 / P2 两选一、第三步就剩最后那个,分支结构是 1 × 2 × 1 = 2 条,没有更多。
总解析
银行家算法的安全性检查就是反复做一件事:维护 Work = Available,从未完成进程里挑一个 Need ≤ Work 的让它跑完,把它的 Alloc 加回 Work,直到全部跑完(安全)或没有可挑的(不安全)。
要数所有安全序列,每次遇到分叉就要每条路径都走一遍。
第一步:Work = (1, 3, 2)
| 进程 | Need | Need ≤ (1,3,2) ? |
|---|---|---|
| P0 | (0, 2, 1) | ✓ |
| P1 | (1, 2, 3) | ✗ C 维 3 > 2 |
| P2 | (0, 1, 3) | ✗ C 维 3 > 2 |
只有 P0 通过。P0 跑完,Work = (1,3,2) + (2,0,1) = (3, 3, 3)。
第二步:Work = (3, 3, 3)
| 进程 | Need | Need ≤ (3,3,3) ? |
|---|---|---|
| P1 | (1, 2, 3) | ✓ |
| P2 | (0, 1, 3) | ✓ |
P1、P2 都满足 → 分叉,两条路都要走。
分支 a:P0 → P1 → P2
P1 跑完,Work = (3,3,3) + (0,2,0) = (3,5,3)。P2 的 Need (0,1,3) ≤ (3,5,3) ✓,P2 跑完。✅ 安全。
分支 b:P0 → P2 → P1
P2 跑完,Work = (3,3,3) + (1,0,1) = (4,3,4)。P1 的 Need (1,2,3) ≤ (4,3,4) ✓,P1 跑完。✅ 安全。
两条分支都走通,安全序列共 2 条:P0 → P1 → P2、P0 → P2 → P1。
最终答案是 B。