如果一个正在等待的进程所申请的资源被其他等待进程占有,那么该等待进程有可能无法改变状态,这种情况称为死锁。
当一组进程的每个进程等待一个事件,而这一事件只能由这一组进程的另一进程引起,则这组进程处于死锁状态。
一、系统模型
系统拥有一定数量的资源,资源分成多种类型,每种类型有一定数量的实例。
进程在使用资源前必须申请资源,在使用资源之后必须释放资源。
开发多线程应用必须特别关注这个问题,因为多个线程可能因为竞争共享资源而容易产生死锁。
二、死锁的特点
1、必要条件
- 互斥:至少有一个资源必须处于非共享模式,即一次只有一个进程使用。如果另一资源申请该资源,那么申请进程必须延迟直到该资源释放为止。
- 占有并等待:一个进程必须至少占有一个资源,并等待另一资源,而该资源为其他进程所占有。
- 非抢占:资源不能被抢占,只有在进程完成其任务之后,才会释放其资源。
- 循环等待:一组进程中一个进程等待的资源被另一个进程占有。
2、资源分配图
死锁问题可以用系统资源分配图的有向图进行更精确的描述。
资源分配图中有两种节点和两种边。节点为:系统活动进程、系统所有资源;边为:申请边和分配边。
可以证明,如果资源分配图中没有环,那么系统就没有进程死锁,如果有环,就可能存在死锁。
如果每个资源有多个实例,那么有环不一定会出现死锁。这时只是必要条件。
死锁出现的充要条件:
如果每个资源类型只有一个实例,那么有环就意味着出现死锁;
如果环涉及到一组资源类型,而每个类型只有一个实例,那么就出现了死锁
三、死锁的处理方法
从原理上分析,有三种方式可以处理死锁:
- 可以使用协议预防或避免死锁,确保系统不会进入死锁状态;
- 可允许系统进入死锁状态,然后检测它,加以恢复;
- 忽视这个问题,认为死锁不可能在系统内发生。
死锁预防,确保至少一个必要条件不成立;
死锁避免,要求系统事先得到有关进程申请资源和使用资源的额外信息,有了这些额外信息,可确定:对于一个申请,进程是否应等待。
四、死锁预防
出现死锁有四个必要条件,确保至少一个不成立,就能预防死锁发生。
五、死锁避免
死锁避免算法比预防算法要求低些,只要事先了解进程使用资源的情况即可。
1、安全状态——按特定顺序为进程分配资源
2、资源分配图算法
3、银行家算法——需要知道每个进程所请求的每种资源的最大数量。
六、死锁检测
一个系统如果既没有死锁预防也没有死锁避免,则应该提供:
- 一个用来检查系统状态从而确定是否出现死锁的算法;
- 一个用来从死锁状态中恢复的算法;
七、死锁恢复
1、进程终止;
2、资源抢占