死锁检测
        为了能检测系统是否发生了死锁,必须对系统进行死锁检测。

死锁检测的步骤:
①用某种数据结构(资源分布图)来保存资源的请求和分配信息;
②提供一种算法,利用上述信息来检测系统是否已进入死锁状态。

1、资源分布图(有向图)

sbtest 死锁 死锁检测的方法_死锁

sbtest 死锁 死锁检测的方法_死锁_02


        如果系统中剩余的可用资源数足够满足进程的需求,那么这个进程暂时是不会阻塞的,可以顺利地执行下去。如果这个进程执行结束了把资源归还系统,就可能使某些正在等待资源的进程被激活,并顺利地执行下去。相应的,这些被激活的进程执行完了之后又会归还一些资源,这样可能又会激活另外一些阻塞的进程…

        如果按上述过程分析,最终能消除所有边,就称这个图是可完全简化的。此时一定没有发生死锁(相当于能找到一个安全序列)如果最终不能消除所有边,那么此时就是发生了死锁。最终还连着边的那些进程就是处于死锁状态的进程。

可以消除所有边,即不发生阻塞的情况

sbtest 死锁 死锁检测的方法_数据结构_03

       如图,进程P1已经有了2个R1资源,P2已经有了1个R2资源和申请了1个R1资源并得到了满足。此时,R1资源还剩下0个,R2资源还剩下1个。进程P1此时申请1个R2资源,此时R2资源正好有1个,可以满足。P1和P2进程都得到了资源满足(每条边都可进行消去),故不会发生阻塞。

无法消除所有边,即会发生阻塞的情况

sbtest 死锁 死锁检测的方法_死锁检测_04

如图,进程P1已经有了2个R1资源,P2已经有了1个R2资源和申请了1个R1资源并得到了满足。此时,R1资源还剩下0个,R2资源还剩下1个。此刻,进程P1申请2个R2资源,进程P3申请1个R2资源,一共需要3个R2资源。但此时R2资源只有1个,无法满足。P1和P3进程请求的资源无法满足(无法消除所有),则发生阻塞。

死锁检测算法

1)在资源分配图中,找出既不阻塞又不是孤点的进程Pi(即找出一条有向边与它相连,且该有向边对应资源的申请数量小于等于系统中已有空闲资源数量。如下图中,R1没有空闲资源,R2有一个空闲资源。若所有的连接该进程的边均满足上述条件,则这个进程能继续运行直至完成,然后释放它所占有的所有资源)。消去它所有的请求边和分配变,使之称为孤立的结点。在下图中,P1 是满足这一条件的进程点,于是将P1的所有边消去。
2)进程Pi 所释放的资源,可以唤醒某些因等待这些资源而阻塞的进程,原来的阻塞进程可能变为非阻塞进程。在下图中,P2 就满足这样的条件。根据1)中的方法进行一系列简化后,若能消去途中所有的边,则称该图是可完全简化的。

sbtest 死锁 死锁检测的方法_死锁_05

2、类似于银行家算法

         建立相应数据结构:资源总向量、剩余资源总向量、进程总需求矩阵、进程请求矩阵。

        先对请求矩阵进行检查,检查其中是否存在全0的行。若存在,则进行下一步资源假定分配,后续进行新的检查(分配后,进程如果满足了则请求矩阵归0),如此反复进行。若最后存在无法归0的行,则系统处于死锁状态。