【操作系统】死锁

1 死锁概念

操作系统中的死锁:
如果在一个进程集合中的每个进程都在等待只能有该集合中的其它进程才能引起的事件,而无限期陷入僵持的局面称为死锁
在这里插入图片描述

2 死锁产生的因素

  • 系统拥有的资源数量
  • 资源分配策略
  • 进程对资源的使用要求
  • 并发进程的推荐顺序

3 死锁的必要条件

3.1 互斥条件

进程互斥使用资源,一旦某个资源被占用,欲使用该资源的进程必须等待。

3.2 占有和等待条件(部分分配条件)

进程申请新资源得不到满足而等待时,不释放已占有资源。

3.3 不剥夺条件

一个进程不能抢夺其它进程占有的资源。

3.4 循环等待条件(环路条件)

存在一组进程循环等待资源的现象

前三个条件是死锁产生的必要条件,不是充分条件。第四个条件是前三个条件同时存在时产生的结果。只要破坏这四个条件之一,死锁就可防止。

如何解决(by清华大学陈渝-操作系统)

在这里插入图片描述

以上的四个方法的约束一个比一个弱,死锁预防的约束最强,而死锁恢复的约束最差。

  • 方法一:确保系统永远不会进入死锁状态
    操作系统的功能会被限制,应用系统无法重复的利用cpu执行开销也很大

  • 方法二:运行系统进入死锁状态,然后恢复
    但是判断死锁的开销非常大

  • 方法三:忽略这个问题,假装系统中从来没有发生死锁;用于绝大多数的操作系统。
    靠假设来忽略这个问题,实际操作的常用方法

4 死锁预防

死锁防止通过破坏产生死锁的四个条件之一来实现。

4.1 破坏互斥条件

使资源可同时访问而不是互斥使用。
该办法对于磁盘适用,对于磁带机、打印机等多数资源不仅不能破坏互斥使用条件,还要加以保证。

4.2 破坏占有和等待条件

静态分配可以破坏占有和等待条件。
静态分配是指一个进程必须在执行前就申请它所需要的全部资源,并且直到它所需要的资源都得到满足后才开始执行资源利用率低

4.3 破坏不剥夺条件

采用剥夺式调度方法。
当进程申请资源未获准许时,在等待前主动释放已占有资源。剥夺调度方法目前只适用于内存资源和处理器资源。

4.4 破坏循环等待条件

采用层次分配策略可以破坏循环等待条件。
层次分配策略将资源被分成多个层次,进程按照由低到高的层次顺序申请和得到资源,按照由高到低的层次顺序释放资源。当进程得到某一层的一个资源后,如果需要申请该层的另一个资源,则必须先释放该层中的已占资源

假设有三类资源:A、B、C,分别属于三个不同的层次(从低到高)
进程P1:需要按顺序申请资源A和B。
进程P2:需要按顺序申请资源B和C。
根据层次分配策略:
进程P1首先申请A,然后可以申请B。
进程P2首先申请B,然后可以申请C。
由于P1和P2都遵循由低到高的顺序来申请资源,不会形成循环等待。例如,如果P1已经持有A并且正在等待B,那么P2不可能持有B并等待A(持有顺序从高到低违反分配策略),因此,死锁就被避免了.
缺点:
灵活性受限(所有资源指定合理的层次可能比较困难)
增加开销(进程在同一层频繁释放和申请资源

5 死锁避免

5.1 避免死锁的策略

死锁避免方法允许系统中同时存在死锁的三个必要条件,即互斥、占有且等待和非抢占;
每当进程提出资源申请时,系统分析满足该资源请求时系统是否会发生死锁,若不会发生则实施分配,否则拒绝分配。
银行家算法就是避免死锁的一种方法。

5.2 银行家算法思想

一个银行家拥有资金M,被N个客户共享,银行家对客户提出下列约束条件:
① 每个客户必须预先说明自己所要求的最大资金量;
② 每个客户每次提出部分资金量申请和获得分配;
③ 如果银行满足了客户对资金的最大需求量,则客户在资金运作后一定可以很快归还资金。
在这里插入图片描述

5.3 银行家算法在死锁问题上的应用

步骤:
① 系统中的所有进程进入进程集合;
② 在安全状态下对进程请求的资源进行试探性分配;
③ 系统用剩余的可用资源和进程集合中其它进程还要的资源数作比较,找到剩余资源能满足最大需求量的进程A,保证A运行完毕并归还全部资源;
④ 把进程A从集合中去掉,相当于回收其资源。如果进程集合非空,则返回②;
⑤ 若进程集合为空,则系统处于安全状态,可实施本次分配;否则,系统处于不安全状态,本次资源分配暂不实施,申请进程等待。

安全状态与不安全状态:

如果系统能够按某种进程顺序(P1,P2,… … ,Pn)(称< P1,P2,… … ,Pn >序列为安全序列),为每个进程Pi分配其所需资源,直至满足每个进程对资源的最大需求,使每个进程都能顺利完成,则称系统处于安全状态。
如果找不到这样的安全序列,则称系统处于不安全状态。

基本概念:
最大需求矩阵(Max Matrix):每个进程对每种资源类型的最大需求量。
已分配矩阵(Allocation Matrix):当前已经分配给每个进程的各类资源数量。
需求矩阵(Need Matrix):每个进程还需要的各类资源数量,计算公式为 Need[i][j] = Max[i][j] - Allocation[i][j]
可用向量(Available Vector):系统当前可用的各类资源数量。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.4 银行家算法的缺点

① 使用银行家算法时,很难在进程运行前知道其所需的资源最大量;
② 算法要求系统中的进程必须是无关的,相互间没有同步要求;
③ 进程的个数和分配的资源数目应该是固定的;
这些要求事先难以满足,因而银行家算法缺乏实用价值。

6 死锁检测

6.1 死锁检测策略

死锁检测和解除对资源分配不加任何限制,也不采取死锁避免措施,但系统定时运行一个“死锁检测”程序,如果检测到系统发生了死锁,再采取措施解除它。

进程-资源分配图是描述进程和资源间申请与分配关系的一种有向图,可用以检测系统是否处于死锁状态。

6.2 进程-资源分配图的结构

进程-资源分配图由进程结点P、资源结点R和有向边组成。

有向边:
① 请求边:
从进程指向资源的有向边Pi→Rj为请求边,表示进程Pi申请资源类Rj中的一个资源。
② 分配边:
从资源指向进程的有向边Rj→Pi为分配边,表示Rj类中的一个资源已分配给进程Pi。
在这里插入图片描述

6.3 进程-资源分配图与死锁判断的关系

① 如果进程-资源分配图中无环路
——>则此时系统没有发生死锁
② 如果进程-资源分配图中有环路,且每个资源类中仅有一个资源
——>则系统中发生了死锁,此时,环路是系统发生死锁的充要条件,环路中的进程便为死锁进程
③ 如果进程-资源分配图中有环路,且涉及的资源类中有多个资源
——>则环的存在只是产生死锁的必要条件而不是充分条件

6.4 死锁的检测和解除方法

6.4.1 死锁定理

系统为死锁状态的充分条件是:当且仅当该状态的进程-资源分配图是不可完全简化的。该充分条件称为死锁定理。

6.4.2 简化进程-资源分配图

① 从进程-资源分配图中找到一个既不阻塞又非独立的进程,消去所有与该进程相连的有向边,相当于该进程能够执行完成而释放资源,回收资源使之成为孤立结点。
② 然后将所回收的资源分配给其它进程,再从进程-资源分配图中找到下一个既不阻塞又非独立的进程,消去所有与该进程相连的有向边,使之成为孤立结点。
③ 不断重复该过程,直到所有进程成为孤立结点,则称该图是可完全化简的;否则称该图是不可完全化简的。

死锁检测实例:
在这里插入图片描述
问题求解:
解决思路:无法应用死锁判定原则,需要化简。按照P1、P2和P3的顺序逐一考察每个进程,判断其是否孤立和阻塞。
① P1、P2和P3三个进程均不孤立,接下来需要判断它们是否阻塞。
② P1:该进程请求资源R1,而R1仅有的一个资源已经分配给P2,所以P1阻塞;
③ 该进程请求资源R2,而R2仅有的一个资源已经分配给P3,所以P2阻塞。
④ 该进程请求资源R3,而R3的两个资源已经分别分配给P1和P2,所以P3阻塞。
结论:进程-资源分配图无法完全化简,因此进程集合发生死锁。

6.5 死锁的解除方法

① 立即结束所有进程的执行,并重新启动操作系统。以前工作全部作废,损失可能很大。
② 剥夺陷于死锁的进程占用的资源,但并不撤销它,直至死锁解除。
③ 撤销陷于死锁的所有进程,解除死锁继续运行。
④ 逐个撤销陷于死锁的进程,回收其资源,直至死锁解除。
⑤ 根据系统保存的检查点,使所有进程回退,直到足以解除死锁。
⑥ 当检测到死锁时,如果存在某些未卷入死锁的进程,且它们会进一步建立一些新的抑制进程能执行到结束,则它们可能释放足够的资源来解除死锁。

在这里插入图片描述
都存在某种程度上的强制性和不合理性。所以死锁恢复是最后的手段。
在这里插入图片描述

7 死锁检测算法与死锁避免算法比较

① 死锁检测算法考虑了检查每个进程还需要的所有资源能否满足要求;
死锁避免算法则仅根据进程的当前申请资源量来判断系统是否进入了不安全状态。

② 死锁检测算法处理的进程-资源图中可以同时存在多个进程的请求边。
在银行家算法中,一次仅允许一个进程提出资源请求,做安全分析并分配资源后,才允许下一个进程提出资源请求。

8 相关扩展

1 一文弄懂如何发现 MySQL 死锁?
2 go语言 lock free 队列第三方库
3 清华大学陈渝-操作系统课程
4 Golang 竞态检测 race detector
5 Golang并发bug论文–Understanding Real-World Concurrency Bugs in Go
6 并发缺陷暴露、检测与规避研究综述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值