Appearance
题目
下列准则中,实现临界区互斥机制必须遵循的是( )。
Ⅰ、两个进程不能同时进入临界区
Ⅱ、允许进程访问空闲的临界资源
Ⅲ、进程等待进入临界区的时间是有限的
Ⅳ、不能进入临界区的执行态进程立即放弃 CPU
错因
A
只挑了"互斥"和"让权"两个最直观的准则。漏了 Ⅱ"空闲让进"和 Ⅲ"有限等待"——但这两个才是互斥机制不能塌的底线:临界区空着却谁也进不去(Ⅱ 不成立),或者某个进程被排在队尾永远轮不到(Ⅲ 不成立),都是死锁 / 饥饿,互斥机制就废了。Ⅳ 反而不是必要条件(见 Ⅳ 说明)。
B
只看到 Ⅱ"空闲让进"和 Ⅲ"有限等待"是温和合理的描述,反而漏了最硬核的 Ⅰ"互斥进入"——这恰恰是互斥机制存在的全部理由,没有这条整个机制就名存实亡。漏选 Ⅰ 一般是看走眼或读题太快,把视线锁死在了"温和的"准则上。
D
把 Ⅳ"立即放弃 CPU"误当成必要条件。让权等待确实是常见的好实践(避免忙等浪费 CPU),但"必须"这个词太强——自旋锁(spin lock)就是典型的不让权互斥机制:拿不到锁就在原地反复测试,照样保证互斥、空闲让进、有限等待。所以 Ⅳ 是"经常这么做"而不是"必须这么做"。
总解析
互斥机制的四条经典准则需要分清"必须遵循"和"通常这么做":
| 准则 | 含义 | 必须遵循? |
|---|---|---|
| Ⅰ 空闲让进 | 临界资源空闲时,请求的进程应能进入 | ✓ 不然临界区永远没人用,机制失败 |
| Ⅱ 忙则等待(题面"两个进程不能同时进入") | 已有进程在临界区,别的不能再进 | ✓ 这就是互斥的本意 |
| Ⅲ 有限等待 | 等待进入的进程等待时间不能无限长 | ✓ 不然某个进程会饿死 |
| Ⅳ 让权等待 | 进不去临界区的进程应让出 CPU | ✗ 是优化建议,不是硬性要求(自旋锁不让权也能互斥) |
题面四条 Ⅰ、Ⅱ、Ⅲ、Ⅳ 与上面对应(注意题里的"Ⅰ 两个进程不能同时进入"对应表里的"忙则等待","Ⅱ 允许进程访问空闲临界资源"对应"空闲让进"——名字略微对调,含义不变)。
互斥机制必须遵循的是 Ⅰ、Ⅱ、Ⅲ 这三条;Ⅳ 让权等待是为了避免忙等浪费 CPU,但自旋锁这种不让权的机制依然是合法的互斥实现,所以 Ⅳ 不是"必须"。
最终答案是 C。
编者注(解题技巧):四准则里让权等待是唯一可选项——记住反例自旋锁就不会失分。问"必须遵循"答 Ⅰ Ⅱ Ⅲ;问"通常遵循 / 应当遵循"才答四条。