2.4 死锁
多个进程因竞争资源而造成的一种僵局。若无外力,这些进程都无法推进。
2.4.1 死锁的概念
死锁,饥饿,死循环的对比
死锁产生的原因:
(1)系统资源的竞争
(2)进程不合理的推进顺序
(3)信号量使用不恰当也会造成死锁
总结:对不可剥夺的资源的不合理分配导致死锁
死锁产生的必要条件:
(1)互斥条件
(2)不可剥夺条件
(3)请求并保持条件
(4)循环等待条件
死锁处理策略:
(1)死锁预防【破坏产生的必要条件】
(2)死锁避免【资源分配时采取某些方法防止系统进入不安全状态】
(3)死锁的检测和解决【允许发送死锁,需要在检查出死锁后及时解除】
2.4.2 死锁预防
破坏死锁的四个必要条件之一即可
(1)破坏互斥条件
- 使用
SPOOLING技术
将互斥设备改造成逻辑上可以共享的设备
缺陷:并非所有设备都可以共享
(2)破坏不可剥夺条件
- 已经拥有部分资源的进程无法获取剩余资源,只能将已拥有资源全部归还操作系统
- 操作系统
协助
优先级高的进程剥夺其他进程的资源
缺陷:①实现复杂 ②释放资源的进程需要重新允许,造成资源浪费 ③反复申请资源,导致进程饥饿
(3)破坏请求并保持条件
- 静态分配资源,在允许前分配完需要的全部资源。
若没得到全部资源,禁止运行
缺陷:资源利用率低,可能进程运行时间很长而使用资源的时间很短
(4)破坏循环等待条件条件
- 将资源编号,进程只能申请比自己拿到的资源编号更大的资源。这样就不会反过来等待编号小的资源。
缺陷:①新增资源需要重新编号 ②使用资源的顺序和编号递增的顺序可能不一致 ③用户编程麻烦
2.4.3死锁避免
银行家算法
【不能检测死锁】
安全状态无死锁。
不安全状态不一定死锁。可能有进程提前归还资源
使用矩阵记录进程对各种资源的最大需求
,已分配数量
,还需要分配的数量
。
检查否能找到一个安全序列使之能够合理分配资源和回收
c++模拟银行家算法:https://blog.csdn.net/qq_61249949/article/details/137028640
2.4.4 死锁检测和解除
圆圈
:进程
框包含n个圆
:有n和同类资源
矩形到圆圈的有向边
:进程正在使用一个资源
圆圈到矩形的有向边
:进程申请一个资源
S为死锁的条件时S状态的资源分配图不可以简化死锁定理
死锁解除:
(1)资源剥夺法:挂起死锁进程并抢占其资源
(2)撤销进程法:撤销部分甚至全部死锁进程并剥夺其资源
(3)进程回退法:让一个或多个进程回退到足以回避死锁的地步【资源释放资源】
决定对谁动手:
①进程优先级
②已经执行时间
③还需要多久完成
④已经使用了多少资源