Appearance
题目
下列关于银行家算法的叙述中,正确的是( )。
错因
A
把"预防"和"避免"混了。死锁预防:从结构上破坏死锁四条件之一(如不允许请求和保持、可剥夺、按序申请等),事前杜绝;死锁避免:每次资源分配前算一下"分配后系统是否还安全",不安全就拒绝。银行家算法属于"避免",它没有破坏任何死锁条件,是动态判断。
C
把"不安全"和"死锁"画等号——但不安全 ≠ 死锁。"不安全状态"指有可能发展成死锁,但不一定真的死锁——只要后续进程的资源请求顺序合适,仍可能避开死锁。安全状态是个充分非必要条件:安全 → 一定不死锁,但不安全 ≠ 一定死锁。
D
银行家算法不破坏任何死锁四条件——它允许互斥、允许请求和保持、允许不剥夺、允许循环等待。它的工作机制是事前模拟:每次申请前算一下"如果给出去,剩下的进程还能按某顺序全跑完吗",能就给、不能就拒。条件没动,只是动态拒绝部分请求。
总解析
银行家算法的核心概念辨析:
| 概念 | 含义 |
|---|---|
| 死锁预防 | 从设计上破坏 4 条件之一,事前杜绝 |
| 死锁避免(银行家) | 每次分配前算"分配后还安不安全",不安全就拒绝;不破坏任何条件 |
| 安全状态 | 存在某个进程序列让所有进程都能拿到全部资源跑完 |
| 不安全状态 | 不存在这种序列;可能发展成死锁,但不一定真死锁 |
逐项核对:
| 选项 | 描述 | 判定 |
|---|---|---|
| A | 银行家可以预防死锁 | ✗ 是避免不是预防——预防破坏 4 条件,银行家不破坏 |
| B | 安全状态时一定无死锁进程 | ✓ —— 安全状态的定义就是"存在让所有进程跑完的序列",意味着没人陷入循环等待 |
| C | 不安全状态时一定有死锁 | ✗ "不安全"只是有风险,没真正死锁;只有等到资源分配走入死局才算死锁 |
| D | 破坏请求和保持 | ✗ 银行家不破坏任何条件,只是动态拒绝某些请求 |
安全 vs 不安全 vs 死锁的关系:
安全 ⊂ 无死锁 ⊂ {可能再分配}
不安全 = 不安全 = 有风险
死锁 = 不安全的子集(已经发生)
安全 → 必无死锁
不安全 → 不一定死锁(只是有风险)
死锁 → 必不安全速记:安全和死锁是"非对称关系"——安全是充分否定死锁,但不安全不等于死锁。
最终答案是 B。