目录
前言
死锁的检测
数据结构资源分配图
基于“图”检测死锁
可以消除所有边
不能消除所有边
结论
死锁定理
死锁的解除
本节思维导图
前言
如果系统中既不采取预防死锁的措施,也不采取避免死锁的措施,系统就很可能发生死锁,在这种情况下,系统应当提供两个算法:
①死锁检测算法:用于检测系统状态,以确定系统中是否发生了死锁
②死锁解除算法:当认定系统中已经发生了死锁,该算法可将系统从死锁状态中解脱出来
死锁的检测
①用某种数据结构来保持资源的请求和分配信息
②提供一种算法,利用上述信息来检测系统是否已经进入死锁状态
数据结构资源分配图
基于“图”检测死锁
核心思想:根据是否可以消除所有边确定系统是否发生死锁
能消除所有的边,即称该图是可完全简化地,一定未发生死锁,相当于找到了一个安全序列
检测规则:
- 系统中剩余的可用资源数足够满足进程的需求,那么这个进程暂时不会被阻塞,可顺利执行
- 进程执行结束将资源归还系统,就可能使某些正在等待资源地进程被激活,开始执行
- 被激活进程执行完后又会归还一些资源,这可能又会激活另外一些阻塞的进程
可以消除所有边
- P1进程向R2资源请求了一个资源,R2此时被分配后还有一个资源,所以P1进程不会被阻塞
- P2进程向R1资源请求了一个资源,R1此时被分配后没用资源,所以P2进程被阻塞
- 当P1进程完成后会将R1分配的资源和向R2请求的资源全部返回,此时P2进程就可以被唤醒
- P2进程被唤醒后,执行完后也会将被分配的资源和申请的资源返回,至此所有边均被消除
不能消除所有边
- P1进程向R2申请两个资源,但R2没有资源剩余,P1进程阻塞
- P2进程向R1申请一个资源,但R1也没有资源剩余,P2进程也被阻塞
- P3进程在接收完R2进程提供的资源后可以顺利执行,执行完后释放一个R2资源
- 此时R2有一个资源,但是P1要两个资源所以P1进程依然被阻塞,同样的P1阻塞导致R1的剩余资源不满足P2的要求,所以P2也依然会被阻塞
分配边表示已经为进程分配的资源个数,请求边表示在已有资源基础上仍需要的资源个数
结论
最终还连着边的那些进程就是处于死锁状态的进程
死锁定理
如果某时刻系统的资源分配图是不可完全简化的,那么此时系统死锁
死锁的解除
基本思想:一旦检测出死锁的发生,就应该立即解除死锁
注意事项:并不是系统中所有的进程都是死锁状态,用死锁检测算法简化资源分配图后还连着边的进程就是死锁进程
实现方法:
- 资源剥夺法:挂起(暂时放到外存上)某些死锁进程,并抢占它的资源,将这些资源分配给其他的死锁进程。但是应防止被挂起的进程长时间得不到资源而饿死
- 撤销进程法:(或称终止进程法)强制撤销部分、甚至全部死锁进程,并剥夺这些进程的资源。这些方式的优点是实现简单,但所付出的代价可能会很大,因为有些进程可能已经运行了很长时间了,已经接近结束了,一旦被终止可谓功亏一篑,以后还得从头再来
- 进程回退法:让一个或多个死锁进程回退到足以避免死锁的地步,这就要求系统要记录进程的历史信息,设置还原点
如何决定对谁动手(剥夺、撤销还是回退):
- 进程优先级
- 已执行多少时间
- 还要多久能完成
- 进程已经使用了多少资源
- 进程是交互式还是批处理式的
本节思维导图
~over~