以上小节讨论了死锁预防和死锁避免的几种方法,但是这些方法都比较保守,并且都是以牺牲系统效率和浪费资源为代价的,这恰恰与操作系统设计目标相违背。假如系统为进程分配资源时,不采取任何限制性措施来避免和预防死锁,减少因避免和预防死锁策略带来的开销,同时本着提高资源利用率的原则分配资源,但操作系统在运行过程中,不断地监督 进程的执行和资源占用状态,判定死锁是否真的发生;并且,一旦死锁发生,则釆取专门的 措施解除死锁,并以最小代价使整个系统恢复正常,这就是死锁的检测和解除。
一、 死锁检测的时机
操作系统可定时运行一个“死锁检测”.程序,该程序按一定的算法去检测系统中是否 存在死锁。检测死锁的实质是确定是否存在“循环等待”条件,检测算法确定死锁的存在 并识别出与死锁有关的进程和资源,以供系统采取适当的解除死锁措施。
通常,死锁检测可以在任何一次资源分配后,也可以在每次调度后,或者利用定时器定 时运行检测,还有一种方法是当系统中某个进程长期位于阻塞态或阻塞进程过多时,启动死 锁检测程序。
二、 死锁检测的算法
死锁检测的算法依不同的系统而不同,下面介绍一种死锁检测的算法。
(1)为每个进程和每个资源指定唯一编号。
(2)设置一张资源分配状态表,每个表目包含“资源号”和占有该资源的“进程号”两项,资源分配表中记录了每个资源正在被哪个进程所占有。
(3)设置一张进程等待分配表,每个表目包含“进程号”和该进程所等待的“资源号” 两项。
(4)算法规则:当任一进程P,申请一个已被其他进程占用的资源时,进行死锁检测。 检测算法通过反复查找资源分配表和进程等待表,来确定进程P,.对资源I的请求是否导致形成环路,若是,便确定出现死锁。
【例7】进程死锁检测算法。
系统中有进程P1、P2和P3共享资源r1、r2和r3。在某一时刻资源使用情况如图5-9a所示。此后依次发生P1请求r1,P2请求r3, P3请求r1。当执行死锁检测算法后,得到图5-9b; 再执行死锁检测算法,得到图5-9c;再执行死锁检测算法,得到图5-9d。检查图5-9d与图 5-9a,确定是否出现死锁。
三、死锁的解除方法
一旦检测到死锁,便要立即设法解除死锁。一般说来,只要让某个进程释放一个或多个资源就可以解除死锁。死锁解除后,释放资源的进程应恢复