跳转至

死锁资源计算:最少资源数与最小需求量

这类题属于 操作系统 → 进程管理 → 死锁与资源分配。两种常见问法其实围绕同一个边界:所有进程都还没拿够时,最多能占住多少资源?

  • 已知进程数和每个进程的需求,求保证不死锁的最少资源数。
  • 已知进程数和资源总数,反过来求可能死锁的最小需求量。

1. 符号和适用条件

符号 含义
N 竞争资源的进程数量
k 每个进程最多需要的资源数量;下面第二道题把它记为 i
R 可供这些进程使用的同类资源总数

本文讨论教材中的单类可重用资源模型,主要前提是:

  • 资源属于同一种类型,各实例可以互相替代,但同一个实例不能同时分配给多个进程。
  • 各进程的最大需求相同,均为 k,且单个进程的需求可以被资源总量满足。
  • 进程可以分次申请,等待新资源时继续持有已经分配的资源,资源不能随意强制收回。
  • 进程拿齐所需资源后能够完成并释放资源,没有其他阻塞依赖。
  • 不额外假设系统会强制串行执行,或通过特定分配策略主动避免不安全分配。

R 是资源总数,不是某一时刻尚未分配的剩余数量。 如果题目同时给出“已分配”和“当前空闲”,不能只把空闲数量代入。下面“可用数为 8”的题目没有给出已有分配,按供三个进程争用的资源总量为 8 理解。

多类资源、不同最大需求或者具体时刻的分配状态,需要按相应模型分析,不能直接套用本文的同需求公式。

2. 公式为什么是 N × (k − 1) + 1

每个进程需要 k 个资源才能完成。若它还没有拿够,最多可以持有 k−1 个。

N 个进程全都还没拿够时,最多合计占用:

N × (k − 1)

如果资源总数恰好就是这个数,可以让每个进程各拿 k−1 个:资源全部分完,每个进程都差一个,便可能相互等待而无法完成。

在这个最不利分配上再多一个资源,就能让至少一个进程凑齐需求。 它完成后释放持有的全部资源,其他进程便能继续。

因此,保证不会因争抢这一类资源而死锁的最少资源数为:

R最少 = N × (k − 1) + 1

这是对可能出现的分配情况给出数量保证,不是要求所有进程同时拿满资源,也不保证调度公平或不会出现饥饿。

3. 例题一:3 个进程,每个需要 5 个资源

题目:系统有 3 个并发进程,每个进程都需要 5 个同类资源。至少有多少资源,才能保证不发生这类资源死锁?

1
2
3
4
5
N = 3
k = 5

R最少 = 3 × (5 − 1) + 1
      = 13

答案是 13,选 B。

为什么 12 个可能死锁

考虑下面的分配:

进程 已持有 还需要
P1 4 1
P2 4 1
P3 4 1

已经分配 4 + 4 + 4 = 12 个,剩余 0 个。三个进程都没有拿齐,都需要等待新资源,又都不能完成后释放旧资源,因此可能死锁。

为什么 13 个足够

从同样的“各持有 4 个”状态出发:

  1. 还剩 1 个资源,将它分给 P1。
  2. P1 拿齐 5 个,执行完成,释放全部 5 个;此时空闲资源为 5 个。
  3. 再给 P2 补 1 个,P2 完成后释放全部 5 个;此时空闲资源为 9 个。
  4. P3 也能拿齐并完成,最终 13 个资源全部归还。

资源可以释放后重复使用,因此不需要三个进程同时拿满。

为什么答案不是 15 个

3 × 5 = 15

15 个当然足够,它能同时满足三个进程的全部需求。但题目问的是 保证不死锁的最少数量,13 个就已经足够。

如果系统另有严格串行分配策略,甚至可以让进程轮流使用更少的资源完成;本题要求的是在允许并发、分次申请的模型下给出数量保证。

4. 例题二:8 个资源,3 个进程,每个需要 i 个

题目:系统共有 8 个同类资源,3 个进程竞争这些资源,每个进程都需要 i 个。可能发生死锁的最小 i 是多少?

这次 R 和 N 已知,需要反过来求需求量。

先建立“可能死锁”的条件

要让全部资源都分完,却没有任何进程拿够,每个进程最多只能持有 i−1 个。三个进程在没拿够的情况下,必须有能力合计占住全部 8 个:

1
2
3
4
3 × (i − 1) ≥ 8

3i ≥ 11
i ≥ 11 / 3

i 是整数,向上取整后最小为 4,选 D。

一般形式是:

1
2
3
4
N × (k − 1) ≥ R
k ≥ R / N + 1

k最小 = ⌈R / N⌉ + 1

⌈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 + 2 = 6

还剩 2 个资源,可以让至少一个进程拿够、完成并释放资源。

也可以用第一种公式验证:

保证不死锁所需的最少资源 = 3 × (3 − 1) + 1 = 7
实际资源数 8 ≥ 7

如果每个进程只需要 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 个资源可能死锁

两侧的临界关系是:

1
2
3
4
所有进程都没拿够时,最多合计占 N × (k − 1) 个

资源比这个数多 → 能保证至少一个进程获得足量资源并完成
资源不超过这个数 → 可能全部被占住,而仍没有进程拿够

第二种问法一定要注意取整。例如 N=3、R=9 时,⌈9/3⌉+1=4,不是 5。直接写出不等式再求最小整数,比混记取整公式更稳妥。

6. 解题检查与易错点

  1. 看清问“保证不死锁”还是“可能死锁”。 这决定不等式方向;可能死锁不等于任何分配顺序都会死锁。
  2. 看清要求哪个未知数。 第一题求资源总数,第二题求单个进程的需求量。
  3. 资源能释放复用。 总需求相加得到的是同时拿满所需数量,不一定是保证不死锁的最小数量。
  4. 等号属于可能死锁的一侧。 恰好 N × (k − 1) 个时,每个进程都差一个就可能卡住;多 1 个才能跨过保证边界。
  5. 用具体分配验证。 例如 12 个按 4、4、4 分配,8 个按 3、3、2 分配,直观看每个进程能否完成。
  6. 不要只凭资源总数判断某个实际状态已经死锁。 实际检测还要查看当前请求、持有量和空闲量;可以结合资源分配图化简或其他检测方法。

7. 思维导图

--- markmap: height: 560 initialExpandLevel: 2 autoFit: true colorFreezeLevel: 2 maxWidth: 280 spacingHorizontal: 80 spacingVertical: 12 nodeMinHeight: 24 paddingX: 10 --- # 死锁资源数量计算 ## 模型前提 - N 个进程竞争同类可重用资源 - 每个进程的最大需求相同,为 k - 允许持有并等待,拿齐后能完成并释放 - R 是资源总量,不只是当前空闲量 ## 核心边界 - 未拿够的单个进程最多持有 k − 1 个 - 所有进程未拿够时最多占 N × (k − 1) 个 - 再多一个,保证至少有进程能完成 ## 求最少资源数 - R最少 = N × (k − 1) + 1 - 3 个进程各需 5 个:最少 13 个 - 12 个可按 4、4、4 分完并等待 - 15 个足够,但不是最少 ## 求最小需求量 - 可能死锁:N × (k − 1) ≥ R - k最小 = ⌈R / N⌉ + 1 - 8 个资源、3 个进程:需求最小为 4 - 可按 3、3、2 分完,各自还没拿够 ## 易错点 - 可能死锁不等于一定死锁 - 资源释放后可以重复使用 - 多类资源或具体状态需要另作分析

相关笔记:死锁与资源分配图 · 进程同步与互斥。

返回操作系统章节