一、什么是死锁
死锁是指多个进程竞争有限数量的资源,并且互相等待其他进程占有的资源才能运行,导致进程循环等待再也无法改变状态。
二、产生死锁的四个条件
如果系统中以下四个条件同时成立,那么就能引起死锁:
- 互斥:资源必须处于非共享模式,即一次只有一个进程可以使用。如果另一进程申请该资源,那么必须等待直到该资源被释放为止。
- 占有并等待:一个进程至少应该占有一个资源,并等待另一资源,而该资源被其他进程所占有。
- 非抢占:资源不能被抢占。只能在持有资源的进程完成任务后,该资源才会被释放。
- 循环等待:有一组等待进程
{P0, P1,..., Pn}
,P0
等待的资源被P1
占有,P1
等待的资源被P2
占有,…,Pn-1
等待的资源被Pn
占有,Pn
等待的资源被P0
占有。
注意,只有四个条件同时成立时,死锁才会出现。
三、死锁检测与解除
一个简单的死锁检测算法
给每个进程、每个资源指定唯一编号;设置一张资源分配表记录各进程与其占用资源之间的关系;设置一张进程等待表记录各进程与要申请资源之间的关系。从资源等待表出发,看有没有形成等待的环路。即可以利用资源分配图的思想来检测是否有死锁发生。
死锁避免
死锁避免的重要是以最小的代价恢复系统的运行,具体的死锁解除的方法有几个:(1)撤消所有死锁进程,代价较大;(2)进程回退(Roll back)再启动,进程在执行过程中,系统会为进程记录一些中间节点,当出现死锁的时候进行回退再一起重新运行,由于需要记录每个进程的现场,所以系统代价也比较大;(3)按照某种原则逐一撤消死锁进程,直到没有死锁;(4)按照某种原则逐一抢占资源(资源被抢占的进程必须回退到之前的对应状态),直到没有死锁。
进一步可通过银行家算法和哲学家就餐问题来了解死锁的避免。