Skip to content
难度基础(★)
建议时长45分钟

2.4 死锁资源数计算

本课核心知识点整理
本课核心知识点手绘流程图(SVG)

本节导学

死锁是并发进程资源竞争的极端结果:两个或多个进程相互等待对方占有的资源,谁都无法继续运行。字幕里用“拼积木差最后一块”的例子解释:每个人手里都拿着一部分资源,又都等别人手里的资源,如果大家都不放手、资源也不能被抢走,就会卡住。

本节有两个考点:一是死锁四个必要条件;二是同类资源数量的计算。资源数公式不要机械背,要从“最悲观分配”推出来。

死锁四个必要条件

条件本节的理解
互斥资源同一时刻只能一个进程用
保持和等待进程占着已有资源,还继续等待新资源
不剥夺已分配资源不能被强行拿走
环路等待进程之间形成闭环等待

形成死锁时这四个条件必然同时具备;破坏任意一个条件都可以预防死锁。反过来,题目若只是说四个条件具备,要理解为系统进入“可能发生死锁”的风险状态,是否已经死锁还要看具体资源分配图或等待关系。

互斥的反面是共享。如果一个资源可以任意共享,例如空气,就不会因为排队独占而死锁。保持和等待表示进程拿着已有资源不放,同时继续等待新资源。不剥夺表示系统不能强行把已分配资源抢回来。环路等待表示等待关系形成闭环,例如 P1 等 P2 的资源,P2 又等 P1 的资源。

最悲观分配模型

若有 m 个进程,每个最多需要 w 个同类资源,最悲观情况是每个进程都已经拿到 w-1 个资源,但都还差 1 个。

此时可能死锁的资源数是:

m(w1)

只要再多 1 个资源,就一定能让至少一个进程完成并释放资源,所以不可能死锁的下界是:

m(w1)+1

注意题目问的是“可能发生死锁”,还是“不会发生死锁”。公式本身不难,难点在审题。

公式为什么成立

假设有 5 个进程,每个最多需要 4 个同类资源。最危险的分配方式是每个进程都拿到 3 个资源,都还差 1 个才能完成。此时系统一共分出:

5×(41)=15

如果系统只有 15 个资源,就可能出现所有进程都差最后一个资源的僵局。只要资源总数达到 16,就一定能让某个进程拿到第 4 个资源并完成;它完成后释放 4 个资源,又能让其他进程继续完成,死锁链条被打破。

审题路线

  1. 问“保证不发生死锁至少需要多少资源”,用 m(w1)+1
  2. 问“最多多少资源仍可能死锁”,用 m(w1)
  3. 问“四个必要条件”,按互斥、保持和等待、不剥夺、环路等待判断。
  4. 问“如何预防死锁”,破坏任一必要条件即可。
  5. 不要把“死锁”与“饥饿”混淆:死锁是互相等待形成僵局,饥饿是某些进程长期得不到资源或 CPU。

例题

单选
死锁形成的必要条件之一是资源具有:
单选
m 个进程每个最多需要 w 个同类资源,保证不发生死锁的资源数下界是:
单选
死锁资源数计算题最重要的审题点是:

自查要点

  1. 死锁四个必要条件分别是什么?
  2. 为什么最悲观情况是每个进程都差一个资源?
  3. m*(w-1)m*(w-1)+1 分别对应什么问题?