死锁

一、概述

1.1 定义

如果一个进程集合中的每个进程都在等待只能由该进程集合中的其他进程才能引发的事件,那么该进程集合就是死锁的。一般我们所说的死锁为资源死锁。通信死锁可以通过设立超时机制来解决。

1.2 死锁的条件

1)互斥等待(每个资源要么已经分配给了一个进程,要么就是可用的)
2)占有和等待条件(已经得到了某个资源的进程可以再请求新的资源)
3)不可抢占条件(已经分配给一个进程的资源不能强制性的被抢占,它只能被占有它的进程显示的释放)
4)循环等待条件(死锁发生时,系统中一定有由两个或两个以上的进程组成一条环路,该环路中的每个进程都在等待着下一个进程所占有的资源)

1.3 死锁建模

用有向图表示,圆形表示节点,方形表示资源,从资源节点到进程节点的有向边代表该资源已被请求、授权并被进程占用,从进程节点到资源节点的有向边表明当前进程正在请求该资源,并且该进程已被阻塞,处于等待该资源的状态。如下图所示。
这里写图片描述

二、处理死锁的算法

一般有四种处理死锁的策略:
1)忽略该问题,也许如果你忽略它,它也会忽略你
2)检测死锁并恢复,让死锁发生,检测它们是否发生,一旦发生死锁,采取行动解决问题
3)仔细对资源进行分配,动态的避免死锁
4)通过破坏引起死锁的四个必要条件之一,防止死锁的发生

2.1 鸵鸟算法

不避免发生死锁,当发生死锁时,手动处理,如重启,适用于发生死锁的概率很小,并且出现之后处理死锁会花费很大的代价。

2.2 死锁检测和恢复

2.2.1 每种类型一个资源的死锁检测

算法步骤如下图所示
这里写图片描述
这里写图片描述
算法本质为依次将每一个节点作为一棵树的根节点,并进行深度优先搜索,如果再次碰到已经遇到过的节点,那么就算找到了一个环。如果从任何给定的节点出发的弧段都被穷举了,那么久回溯到前面的节点,如果回溯到根并且不能再深入下去,那么从当前节点出发的子图就不包含任何环。如果所有的节点都是如此,那么整个图就不存在环,也就是说系统不存在死锁。

2.2.2 每种类型多个个资源的死锁检测

需要的四种数据结构
这里写图片描述
死锁检测算法就是基于向量的比较,定义向量A和向量B之间的关系为A<=B以表明A的每一个分量要么等于要么小于B向量对应的分量,从数学上来说,A<=B当且仅当 AiBi
算法流程如下:
这里写图片描述
何时检测?
一种方法是每当有资源请求时去检测,这种效率不高,耗费CPU时间,另一种是每隔 k <script type="math/tex" id="MathJax-Element-2">k</script>分钟检测一次,或者当CPU的使用率降低到某一阈值时去检测。

2.2.3 从死锁中恢复

1)利用抢占恢复(强制抢占某些资源)
2)利用回滚恢复(即将进程恢复到一个更早的时间状态)
3)通过杀死进程恢复(杀死环中的一个或多个进程)

2.3 死锁避免

避免死锁的算法是基于一个安全状态的概念,通过跟踪哪一个是安全状态,哪一个是不安全状态,可以避免死锁。安全状态就是这样一种状态:存在一个事件序列,保证所有的进程都能完成,不安全状态就不存在这样的保证。
如下图的阴影区域为不安全状态,通过避免到达这些状态来避免死锁。
这里写图片描述
这里写图片描述
这里写图片描述
避免死锁的经典算法为银行家算法,避免达到不安全状态,但银行家算法缺少实用价值,因为很少有进程能够在运行前就知道其所需资源的最大值,而且进程数也不确定,往往在不断地变化,况且原本可用的资源也可能突然变成不可用的。

2.4 死锁预防

从死锁的四个必要条件入手
这里写图片描述
破坏占有和等待条件的策略是规定所有进程在开始执行前请求所需的全部资源,如果所需的全部资源可用,那么就将他们分配给这个进程,否则进程等待。两个问题:一个是很多进程直到运行时才知道它需要多少资源,这显然不合理,另一个问题是效率问题。
破换环路等待给所有资源编号,进程可以在任何时刻提出资源请求,但是所有请求必须按照资源编号的顺序提出。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值