Appearance
题目
假设系统中有 4 个同类资源,进程 P1、P2 和 P3 需要的资源数分别为 4、3 和 1,P1、P2 和 P3 已申请到的资源数分别为 2、1 和 0,则执行安全性检测算法的结果是()。
错因
B
凭直觉觉得"还有一个空闲、P3 又只需 1 个",那 P3 跑完总该能盘活——但漏算了一步:P3 跑完释放的是 P3 已分配的 0 个(不是 P3 的最大需求),系统可用资源仍只是原来那 1 个,依然喂不饱 P1(缺 2)和 P2(缺 2)。"P3 能跑"不等于"系统安全",要全员都能依次跑完才算。
C
走对了第一步——P3 先(确实只有它能拿 1 个完成),然后假设之后能依次喂 P1、P2。但走完这步会发现 P3 释放后可用还是 1,凑不齐 P1 需要的 2;如果直接套了"按需求由小到大排"的口诀写出 P3、P1、P2,就会落进这个坑。安全序列必须实际验证每一步可用 ≥ 进程剩余需求,不能只按需求大小排。
D
同样陷入"P3 先、之后按某种顺序排 P1 P2"的思路,只是换成 P2 在 P1 前。本质问题一样:P3 完成后可用仅 1 个,无法满足 P2 的剩余需求 2,序列在第二步就断了。
总解析
银行家安全性检测的标准流程:算 Available → 找一个 Need ≤ Available 的进程模拟其完成 → 释放并更新 Available → 重复。能让所有进程都进入 Finish 才算安全。
第 1 步:算可用资源
| 项目 | 数值 |
|---|---|
| 系统总资源 | 4 |
| P1 已分配 | 2 |
| P2 已分配 | 1 |
| P3 已分配 | 0 |
| 当前可用 Available | $4 - 2 - 1 - 0 = $ 1 |
第 2 步:算每个进程剩余需求
| 进程 | 最大需求 Max | 已分配 Allocation | 剩余 Need = Max − Allocation |
|---|---|---|---|
| P1 | 4 | 2 | 2 |
| P2 | 3 | 1 | 2 |
| P3 | 1 | 0 | 1 |
第 3 步:模拟分配
可用 = 1,逐个看谁的 Need ≤ 1:
- P1:Need = 2 > 1,不行
- P2:Need = 2 > 1,不行
- P3:Need = 1 ≤ 1,可以执行 → 拿走 1 个,跑完后释放它已分配的 0 个
P3 完成后:
也可以直接看:P3 占有 0 个、最大需求 1 个,运行时借出去的 1 个最后还回来——可用资源仍然是 1。
可用回到 1,再看 P1 (Need=2) 和 P2 (Need=2):
| 进程 | Need | Available | 能跑? |
|---|---|---|---|
| P1 | 2 | 1 | ✗ |
| P2 | 2 | 1 | ✗ |
两个都卡住,循环退出,仍有进程没完成 → 不安全状态。
P1 和 P2 各持有部分资源、又都在等更多资源,互相等待对方释放——典型的死锁前兆。
最终答案是 A。