1、死锁定义:如果一个进程集合中的每个进程都在等待只有这个集合中其他进程才能引发的事件,那么,该进程集合就是死锁的。
如果定义中的引发的事件是资源的释放,则是资源死锁。
2、资源
资源分为可抢占资源和不可抢占资源。只有请求不可抢占资源才可能发生死锁。
一般情况下,如果某个进程请求资源失败,那么它就进入休眠状态,等待一段时间后再请求。
3、资源死锁的必要条件
1>互斥条件。资源0和1
2>占有和等待条件。进程可以在占有资源的时候请求其它资源
3>不可抢占条件。进程不能强制抢占已经分配给另一个进程的资源。
4>环路等待条件。死锁发生时,系统中必定有一个环路。
死锁发生时,上述四个条件一定同时满足。有一个不成立,死锁就不会发生。
4、死锁检测
系统不试图阻止死锁产生,而是允许死锁,当检测到死锁后,采取措施进行恢复。
1>每种类型一个资源的情况
环路检测算法:依次将每个节点作为一棵树的根节点,进行深度优先搜索,如果碰到已经遇到过的节点,那么就算找到一个环。
如果从任何给定的节点出发的弧都被穷举了,那么就回朔到前面的节点。如果回溯到根并且不能继续深入下去,那么从当前节点出发的子图就不包含环。如果所有节点都是如此,那么整个图都不存在环,系统不存在死锁。
2>每种类型多个资源的情况
基于矩阵的检测算法:
现有资源向量E、可用资源向量A、当前分配矩阵C、请求矩阵R
所有进程按照一定顺序检测
5、死锁恢复
检测后的恢复方法:
1>利用抢占恢复
2>利用回滚恢复(设立检查点)
3>杀死进程,释放资源
6、死锁避免
6.1、安全状态和非安全状态
如果没有死锁发生,并且即使所有进程突然请求对资源的最大需求,也仍然存在某种调度次序能使得每个进程允许完毕,则称改状态是安全的。PS:不安全状态并不是死锁。安全只是不死锁的保证。
6.2死锁避免算法
单个资源的银行家算法
算法要做的是判断对请求的满足是否会导致不安全的状态。如果是,就拒绝请求;如果满足请求后是安全的,就予以分配。
多个资源的眼行家算法
现有资源向量E、已分配资源向量P、可用资源向量A、已分配资源矩阵、仍需要资源矩阵
PS:因为银行家算法需要预先知道所需资源的最大值,而且可用资源也可能突然变成不可用资源,所以极少系统使用银行家算法避免死锁。
7、死锁预防
既然本质上死锁避免是不可能的,那么实际中是采用破坏四个必要条件来完成死锁预防的:
a互斥:一切都使用假脱机技术
b占有和等待:在开始就请求全部资源
c不可抢占:可抢占
d环路等待:对资源按序编号,只能按序请求资源。
参考《现代操作系统》,以上基本交待了操作系统中死锁的框架,其中死锁检测和死锁避免是考察和研究的重点。