【死锁检测】
死锁检测通过检测系统状态,以确定系统中是否发生死锁
为了能对系统中是否发生死锁进行检测,在系统中,必须满足:
- 保存有关资源的请求与分配信息
- 提供一种利用信息检测系统是否进入死锁的算法
资源分配图
资源分配图,是由点集 $V$ 与边集 $E$ 组成的一个图 $G(V,E)$,其定义为:
- 将 $V$ 分为两个互斥的子集,一组是用圆圈表示的进程结点 $P$,一组是方框表示的资源结点 $R$
- 凡属于 $E$ 中的一个边 $e$,都连接着 $P$ 中的一个结点与 $R$ 中的一个结点,$e= < P_i,R_i > $ 是资源请求边,$e= < R_i, P_i >$ 是资源分配边
死锁定理
利用资源分配图的简化来检测死锁,流程如下:
- 在资源分配图中找出一个既不阻塞又非独立的进程结点 $P_i$,在顺利的情况下运行完毕,释放其占有的全部资源
- 由于释放了资源,这样能使其它被阻塞的进程获得资源继续运行,从而消去了 $P_i$ 的边
- 经过一系列简化后,若能消去图中所有边,使结点都孤立,称该图是可完全简化的
因此,死锁定理内容为:当且仅当 $S$ 状态的资源分配图是不可完全简化的,$S$ 状态即为死锁状态
【死锁解除】
若利用死锁检测算法检测出系统中已发生死锁,那么应立即采取相应的措施,以解除死锁
常采用的解除死锁方法有三种:
- 资源剥夺法:挂起某些死锁进程,并抢占其资源分配给其他死锁进程,需要防止被挂起的进程饥饿
- 撤销进程法:强制终止部分甚至全部死锁进程,并剥夺资源,实现简单,但会使前一段工作失效
- 进程回退法:让一或多个进程退回到可避免死锁的地步,要求系统记录进程历史信息,设置还原点