死锁资源计算:最少资源数与最小需求量¶
这类题属于 操作系统 → 进程管理 → 死锁与资源分配。两种常见问法其实围绕同一个边界:所有进程都还没拿够时,最多能占住多少资源?
- 已知进程数和每个进程的需求,求保证不死锁的最少资源数。
- 已知进程数和资源总数,反过来求可能死锁的最小需求量。
1. 符号和适用条件¶
| 符号 | 含义 |
|---|---|
| N | 竞争资源的进程数量 |
| k | 每个进程最多需要的资源数量;下面第二道题把它记为 i |
| R | 可供这些进程使用的同类资源总数 |
本文讨论教材中的单类可重用资源模型,主要前提是:
- 资源属于同一种类型,各实例可以互相替代,但同一个实例不能同时分配给多个进程。
- 各进程的最大需求相同,均为 k,且单个进程的需求可以被资源总量满足。
- 进程可以分次申请,等待新资源时继续持有已经分配的资源,资源不能随意强制收回。
- 进程拿齐所需资源后能够完成并释放资源,没有其他阻塞依赖。
- 不额外假设系统会强制串行执行,或通过特定分配策略主动避免不安全分配。
R 是资源总数,不是某一时刻尚未分配的剩余数量。 如果题目同时给出“已分配”和“当前空闲”,不能只把空闲数量代入。下面“可用数为 8”的题目没有给出已有分配,按供三个进程争用的资源总量为 8 理解。
多类资源、不同最大需求或者具体时刻的分配状态,需要按相应模型分析,不能直接套用本文的同需求公式。
2. 公式为什么是 N × (k − 1) + 1¶
每个进程需要 k 个资源才能完成。若它还没有拿够,最多可以持有 k−1 个。
N 个进程全都还没拿够时,最多合计占用:
如果资源总数恰好就是这个数,可以让每个进程各拿 k−1 个:资源全部分完,每个进程都差一个,便可能相互等待而无法完成。
在这个最不利分配上再多一个资源,就能让至少一个进程凑齐需求。 它完成后释放持有的全部资源,其他进程便能继续。
因此,保证不会因争抢这一类资源而死锁的最少资源数为:
这是对可能出现的分配情况给出数量保证,不是要求所有进程同时拿满资源,也不保证调度公平或不会出现饥饿。
3. 例题一:3 个进程,每个需要 5 个资源¶
题目:系统有 3 个并发进程,每个进程都需要 5 个同类资源。至少有多少资源,才能保证不发生这类资源死锁?
答案是 13,选 B。
为什么 12 个可能死锁¶
考虑下面的分配:
| 进程 | 已持有 | 还需要 |
|---|---|---|
| P1 | 4 | 1 |
| P2 | 4 | 1 |
| P3 | 4 | 1 |
已经分配 4 + 4 + 4 = 12 个,剩余 0 个。三个进程都没有拿齐,都需要等待新资源,又都不能完成后释放旧资源,因此可能死锁。
为什么 13 个足够¶
从同样的“各持有 4 个”状态出发:
- 还剩 1 个资源,将它分给 P1。
- P1 拿齐 5 个,执行完成,释放全部 5 个;此时空闲资源为 5 个。
- 再给 P2 补 1 个,P2 完成后释放全部 5 个;此时空闲资源为 9 个。
- P3 也能拿齐并完成,最终 13 个资源全部归还。
资源可以释放后重复使用,因此不需要三个进程同时拿满。
为什么答案不是 15 个¶
15 个当然足够,它能同时满足三个进程的全部需求。但题目问的是 保证不死锁的最少数量,13 个就已经足够。
如果系统另有严格串行分配策略,甚至可以让进程轮流使用更少的资源完成;本题要求的是在允许并发、分次申请的模型下给出数量保证。
4. 例题二:8 个资源,3 个进程,每个需要 i 个¶
题目:系统共有 8 个同类资源,3 个进程竞争这些资源,每个进程都需要 i 个。可能发生死锁的最小 i 是多少?
这次 R 和 N 已知,需要反过来求需求量。
先建立“可能死锁”的条件¶
要让全部资源都分完,却没有任何进程拿够,每个进程最多只能持有 i−1 个。三个进程在没拿够的情况下,必须有能力合计占住全部 8 个:
i 是整数,向上取整后最小为 4,选 D。
一般形式是:
⌈x⌉ 表示向上取整。这里讨论多个进程、单个需求不超过资源总量的通常情形;求出的需求量也应满足题目原有条件。
用一个具体状态验证 i = 4¶
| 进程 | 已持有 | 总需求 | 还需要 |
|---|---|---|---|
| P1 | 3 | 4 | 1 |
| P2 | 3 | 4 | 1 |
| P3 | 2 | 4 | 2 |
资源全部分完:3 + 3 + 2 = 8。每个进程都没拿够,可以出现全部等待新资源的死锁状态。
不要求每个进程都恰好差一个。 P3 差两个也可以;关键是资源已经分完,而所有持有者都无法完成并释放。
为什么 3 个需求还不会导致这类死锁¶
如果每个进程只需要 3 个,在都没拿够时,每个最多占 2 个:
还剩 2 个资源,可以让至少一个进程拿够、完成并释放资源。
也可以用第一种公式验证:
如果每个进程只需要 2 个,三个进程全部拿满也只需 6 个,8 个更是足够。
5. 两种问法放在一起记¶
| 问法 | 条件或公式 | 本文例题 |
|---|---|---|
| 已知 N、k,求保证不死锁的最少资源数 | R最少 = N × (k − 1) + 1 |
3 × (5 − 1) + 1 = 13 |
| 已知 N、R,求可能死锁的最小需求量 | k最小 = ⌈R / N⌉ + 1 |
⌈8 / 3⌉ + 1 = 4 |
| 判断资源数量是否足以保证不死锁 | R ≥ N × (k − 1) + 1 |
3 个进程各需 3 个,8 个资源足够 |
| 判断数量上是否存在死锁的可能 | R ≤ N × (k − 1) |
3 个进程各需 4 个,8 个资源可能死锁 |
两侧的临界关系是:
第二种问法一定要注意取整。例如 N=3、R=9 时,⌈9/3⌉+1=4,不是 5。直接写出不等式再求最小整数,比混记取整公式更稳妥。
6. 解题检查与易错点¶
- 看清问“保证不死锁”还是“可能死锁”。 这决定不等式方向;可能死锁不等于任何分配顺序都会死锁。
- 看清要求哪个未知数。 第一题求资源总数,第二题求单个进程的需求量。
- 资源能释放复用。 总需求相加得到的是同时拿满所需数量,不一定是保证不死锁的最小数量。
- 等号属于可能死锁的一侧。 恰好
N × (k − 1)个时,每个进程都差一个就可能卡住;多 1 个才能跨过保证边界。 - 用具体分配验证。 例如 12 个按 4、4、4 分配,8 个按 3、3、2 分配,直观看每个进程能否完成。
- 不要只凭资源总数判断某个实际状态已经死锁。 实际检测还要查看当前请求、持有量和空闲量;可以结合资源分配图化简或其他检测方法。