一、死锁的定义
假若在一个进程集合中的每个进程都在等待,只能由该集合中的其它一个进程才能引发的事件,那么这种状态被看成死锁。
一旦产生死锁,若无外力作用,这些进程都将永远不能再向前推进。
二、产生死锁的主要原因
竞争资源
三、资源死锁的条件
四个必要条件:
- 互斥条件:每个资源要么分配给了一个进程,要么就是可用的;
- 占有和等待条件:已经得到了某个资源的进程可以再请求新的资源;
- 不可抢占条件:已经分配给一个进程的资源不能强制性地被抢占,它只能被占有它的进程显式地释放;
- 环路等待条件:死锁发生时,系统中一定有由两个或两个以上的进程组成的一条环路,该环路中的每个进程都在等待着下一个进程所占有的资源。
五、死锁的建模
Holt(1972)指出如何用有向图建立上述四个条件的模型。
在有向图中有两类节点:圆形表示进程;用方形表示资源。
SRAG:System Resource Allocation Graph:系统资源分配图
六、四种处理死锁的策略
- 忽略该问题
- 检测死锁并恢复
- 仔细地对资源进行动态分配,以避免死锁
- 通过破除所述四个必要条件之一,用以防止死锁产生
七、鸵鸟算法
八、资源检测
1.单种资源类型下死锁的检测:作出有箱图之后,观察是否有环的存在,环就是死锁。
2.多种资源类型下死锁的检测:?
九、死锁定理
- 若SRAG中未出现任何环路,则此时系统内不存在死锁;
- 若SRAG中出现了环路,且环中的每类资源只有一个个体,则有环就有死锁。此时环路是存在死锁的充分必要条件;
- 若SRAG中出现了环路,且环中的每类资源的个体数不全为1,则环路的存在只是死锁的必要条件。此时是否死锁,还需要通过对SRAG的简化来判定。
十、死锁的恢复
- 利用抢占恢复recovery through preemption:人工干涉将某些资源从其持有者手里转移到另一个进程中。
- 利用回滚恢复recovery through rollback
- 通过杀死进程恢复recovery through killing processes:要么杀死环中的某个进程,要么杀死环外的某个进程,原则是尽量杀死不重要或可重复执行不带副作用的进程。
十一、死锁的避免
1.资源轨迹图Resource Trajectories
2.安全状态和不安全状态:
- 从安全状态出发,系统能保证所有进程都能完成;而从不安全状态出发,则不存在这样的保证。
- 一个进程序列(P1,P2,······,Pn)是安全序列:对于序列中的每一个Pi,其资源剩余需求量均可由系统可用资源加上所有Pj(j<i)当前已占用的资源来满足的话。?
3.单资源银行家算法:
- 对每一个请求进行检查,检查如果满足它是否会 引起不安全状态
- 如果是,那么不能满足该请求;如果否,则可以 同意满足此请求
- 检查状态是否安全的方法:看他是否有足够的资源满足一个距最大需求最近的客户。如果可以,那么这笔投资认为是能够收回的,然后接着检查下一个距最大需求最近的客户,如此反复下去。 如果所有投资都能被收回,那么该状态是安全的,最初的请求可以批准
4.多资源银行家算法:?
十二、死锁预防
通过破坏产生死锁的四个条件中的一个过多个使系统不会进入死锁状态
条件 | 方法 |
互斥 | 对所有资源进行Spooling假脱机 |
占有并等待 | 初始化所有资源 |
不可剥夺 | 剥夺资源 |
循环等待 | 对资源进行顺序编号 |
十三、其它问题
- 两阶段加锁
- 非资源死锁
- 饥饿
- 活锁
饥饿包括活锁,活锁包括死锁。