操作系统2.4.4 死锁的检测和解除
一、死锁检测
为了能系统是否已经发生死锁进行检测,必须
1、用一种数据结构来保存资源的请求和分配信息
2、用一种算法,利用上述信息来检测系统是否进入死锁状态
如果系统中剩余的可用资源足够满足进程的需求,那么这个进程暂时不会被堵塞,可以顺利执行下去。
如果这个进程执行结束了把资源归还给系统,就可能使得某些正在等待的进程被**,并且顺利的执行下去。
相应地,这些被**的进程执行完之后又会归还一些资源,这样可能**另外一些阻塞的进程...
如果按上述过程,最终能消除所有的边,就称这个图是可以完全简化的。此时一定没有发生死锁(相当于可找到一个安全序列)。
反之,最终不能消除所有的边,那么此时就是发生了死锁,最终还连着边的那些进程就是处于死锁状态的进程
死锁定理:如果某时刻系统的资源分配图不可完全简化,那么此时系统死锁(用于检测是否为死锁状态)
二、死锁解除
补充:并不是系统中所有的进程都是 死锁状态,用死锁检测算法化简资源分配图后,还连着边的那些进程就是死锁进程
1、资源剥夺法:挂起(暂时放到外存上)某些死锁进程,并抢占它的资源,将这些资源分配给 其他死锁进程。但是应防止被挂起的进程长时间得不到进程而导致饥饿
2、撤销进程法(终止进程法):强制撤销部分,甚至是全部死锁进程,并且剥夺这些进程的全部资源,这种方式的优点是实现简单,但是付出的代价可能会很大。因为有些进程可能已经运行很长时间,已经接近结束,一旦被终止可谓是功亏一篑
3、进程回退法:让一个或者多个进程回退到足以避免死锁的地步。这就要求系统要记录进程的历史消息,设置还原点(也不太容易实现)
如何决定对哪些进程下手?
1)进程的的优先级低的先下手
2)已经执行的时间长度短的
3)还要很久进程才能结束
4)进程使用的资源数多的
5)优先牺牲批处理式进程,不是交互式的