在多道程序设计环境下,多个进程可能竞争一定数量的资源。一个进程申请资源,如果资源不可用,那么进程进入等待状态。如果所申请的资源被其他等待进程占有,那么该等待进程可能无法改变状态,这种情况称为死锁。
系统模型:
在正常操作模式下,进程按如下顺序使用资源:
1 申请:如果申请不能立即被允许,那么申请进程必须等待直到它获得该资源为止。
2 使用:进程对资源进行操作
3 释放
死锁特点
引起死锁的4个条件:
1 互斥,至少有一个资源必须处于非共享模式
2 占有并等待,一个进程必须占有至少一个资源,并等待另一资源。而该资源为其他进程所占有
3 非抢占,资源不能被抢占,只有进程完成其任务后,才会释放资源
4 循环等待,有一组进程,互相等待资源
资源分配图:
死锁问题可用称为系统资源分配图的有向图进行更为精确地描述。
根据资源分配图的定义,可以证明:如果图没有环,那么系统就没有进程死锁,如果图有环,那么可能存在死锁。
死锁处理方法:
1 可使用协议以预防或避免死锁,确保系统决不会进入死锁状态
2 可允许系统进入死锁状态,然后检测它,并加以恢复
3 可忽视这个问题,认为死锁不可能在系统内发生。这种方法为绝大多数操作系统如unix所使用。
死锁预防
互斥:
对于非共享资源,必须要有互斥条件。
共享资源不要求互斥访问,因此不会涉及死锁。
通常不能通过否定互斥条件来预防死锁,有的资源本身是非共享的。
占有并等待:
为了确保占有并等待条件不会在系统内出现,必须保证:当一个进程申请一个资源时,它不能占有其他资源。
有两种协议可以实现这种方案:
1 每个进程在执行前申请并获得所有资源。
2 允许进程在没有资源时才可申请资源
这两种协议的缺点:
1 资源利用率可能比较低
2 可能发生饥饿
非抢占
第三个必要条件是对已分配的资源不能抢占。为了确保这一条件不成立,可使用如下协议:
如果一个进程占有资源并申请另一个不能立即分配的资源,那么其现已分配的资源都被抢占。
当一个进程处于等待时,其部分资源可以被抢占。
这个协议通常应用于其状态可以保存和恢复的资源,如CPU寄存器和内存空间。
循环等待
死锁的第四个也是最后一个条件是循环等待。
一个确保此条件不成立的方法是对所有资源类型进行完全排序,且要求每个进程按递增顺序来申请资源。
当一个进程申请资源类型为最高序列时,它必须先释放所有资源。
死锁避免:
死锁预防算法中通过限制资源申请的方法来预防死锁,确保四个必要条件之一不会发生,但是设备使用率低和系统吞吐率低。
避免死锁的另一种方法要求有关如何申请资源的附加信息。根据每个进程可能申请的每种资源类型实例的最大需求的事先信息,可以构造一个算法以确保系统决不会进入死锁状态。这种算法定义了死锁避免方法。
安全状态:
如果系统能按某个顺序为每个进程分配资源(不超过其最大值)并能避免死锁,那么系统状态就是安全的
死锁检测:
如果一个系统既不采用死锁预算算法也不采用死锁避免算法,那么可能出现死锁。
系统应提供:
1 一个用来检查系统状态从而确定是否出现了死锁的算法
2 一个用来从死锁状态中恢复的算法
检测恢复方案会有额外开销,包括维护所需信息和执行检测算法的运行开销,而且也包括死锁恢复所引起的损失。
每种资源类型只有单个实例:
等待图:从图中检测环的算法需要n^2级别操作,其中n为图中的节点数
每种资源类型的多个实例:
类似银行家算法
应用检测算法:
应何时调用检测算法,答案取决于两个因素:
1 死锁可能发生的频率是多少
2 当死锁发生时,有多少进程会受影响
死锁恢复:
进程终止:
1 终止所有死锁进程:代价大
2 一次只终止一个进程直到取消死锁循环为止:开销大
资源抢占:
1 选择一个牺牲品:
2 回滚
3 饥饿