Skip to content

2018年 408 操作系统 第 26 题

操作系统2018年选择题2分

题目

假设系统中有 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
P1422
P2312
P3101

第 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):

进程NeedAvailable能跑?
P121
P221

两个都卡住,循环退出,仍有进程没完成 → 不安全状态。

P1 和 P2 各持有部分资源、又都在等更多资源,互相等待对方释放——典型的死锁前兆。

最终答案是 A

最后更新:

🎬 可视化演示
加载中...

提示:可在可视化区直接操作播放、步进、修改参数