一、引起死锁的原因
- 竞争不可抢占性资源引起死锁
- 竞争可消耗资源引起死锁
- 进程推进顺序不当引起死锁
二、产生死锁的四个必要条件
- 互斥条件:进程所分配到的资源只能被一个进程使用。
- 请求和保持条件:进程已经保持了一个资源,但又提出新的资源请求。
- 不可抢占条件:进程已获得的资源在未使用之前不能被抢占。
- 循环等待条件:在发生死锁时,必然存在一个进程-资源循环链。即
P0等待P1, P1等待P2, ..... Pn 等待P0
三、处理死锁的方法
1. 预防死锁
只要破坏死锁的四个条件之一就可以预防死锁,其中第一个条件互斥是非共享资源必须的,不能够破坏。所以只能破坏其他三个条件。
a. 破坏请求和保持条件
- 在进程开始运行之前,一次性获取进程运行的全部资源。缺点:因为某项资源不满足,进程无法启动,而其他已经满足了的资源也不会得到利用,严重降低了资源的利用率,造成资源浪费。容易造饥饿现象。
- 允许进程只获得运行初期所需要的资源,便可以运行。在运行过程中逐步释放掉已经使用完毕并接下来不再需要的资源,再去请求新的资源。优点:资源的利用率会得到提高,也会减少进程的饥饿问题。
b. 破坏不可抢占条件
当一个已经持有了一些资源的进程在提出新的资源请求没有得到满足时,它必须释放已经保持的所有资源,待以后需要使用的时候再重新申请。意味着进程已占有的资源会被短暂地释放或者说是被抢占了。
这种方法代价较大,反复的申请和释放资源会导致进程的执行被无限的推迟,这不仅会延长进程的周转周期,还会影响系统的吞吐量。
c. 破坏循环等待条件
系统给进程编号,按某一顺序申请资源,释放资源则反序释放。破坏循环等待条件。
2. 避免死锁
在使用前进行判断,只允许不会产生死锁的进程申请资源。
两种方法:
- 如果一个进程的请求会导致死锁,则不启动该进程
- 如果一个进程的增加资源请求会导致死锁 ,则拒绝该申请
银行家算法:
四种数据结构:
- Available向量:系统中可利用的资源数目
- Max矩阵:每个进程对每种资源的最大需求
- Allocation矩阵:每个进程已分配的各类资源的数目
- Need矩阵:每个进程还需要的各类资源数
3. 检测死锁
建立资源分配表和进程等待表。
4. 解除死锁
- 抢占资源:从一个或多个进程中抢占足够数量的资源分配给死锁进程,以解除死锁状态。
- 终止(或撤销)进程:终止或撤销系统中的一个或多个死锁进程,直至打破死锁状态。
一般根据如下几个方面来决定终止哪个进程:
- 进程的优先级
- 进程已运行时间以及运行完成还需要的时间
- 进程已占用系统资源
- 进程运行完成还需要的资源
- 终止进程数目
- 进程是交互还是批处理