2.4.4-死锁的处理策略-检测和解除
知识总览
死锁的检测
用资源分配图这种数据结构来检测是否产生了死锁,资源分配图上有2种节点,进程节点用圆圈表示,一个圆圈代表一个进程,还有资源节点,一个矩形代表一类资源,用矩形中的圆圈表示当前类型的资源的数量,还有2种边,一个是圆圈指向矩形的即进程节点指向矩形节点的边,表示进程想请求资源,一条边表示请求一个资源,俩同样指向的边表示请求2个资源,另外一个是矩形执行圆圈的边,即资源分配给进程,一条边也表示分配了一个资源给某个进程,如下所示,p1一个指向R2,表示p1请求R2资源1个(R2资源现在有2个),P21个指向R1表示请求R1资源1个,R12个指向P1表示分配给了P1进程2个R1资源,R2 1个指向P2表示R2资源分配给了P2进程1个
检测死锁-未出现死锁:消除了所有边
如下所示,p1向申请了R2的1个资源,R2一共俩,一个分配给了P2,所以P1申请能满足,故p1正常运行不阻塞,P2申请R1的1个资源,R1一共仨,2个分配给了P1,1个分配给p2,此时R1资源数=0,故p2请求不能满足,p2阻塞,p1运行完之后P1归还所有资源,并把连接p1的所有边消除,归还之后R2=1,R1=2,则此时满足P2请求R1=1请求,故唤醒阻塞P2,开始分配资源运行,运行完之后归还所有资源消除所有边,所有边被消除未出现死锁,即该资源图可被完全简化
检测死锁-出现死锁:未消除所有边
如下所示:p1申请R2资源2个,R2一个一共俩,给了P3进程1个,给了P2进程1个,故R2=0,则P1请求不能满足,P1阻塞,P2申请R1资源1个,R1一共仨,给了P1进程2个,P2进程1个,故R1=0,则P2请求不能满足,P2阻塞,P3进程没有请求有1个R2资源,P3正常运行,运行完之后释放R2,归还所有资源并消除与P3相连的所有边,归还后R2=1,还是不满足P1请求,P1、P2继续阻塞,所有边未被消除,则出现死锁,连着边的进程P1、P2是处于死锁状态的进程
死锁定理
在资源分配图中,找出满足请求又连着线的进程,这意味着这个线程可以运行不阻塞,等它运行完之后会释放所有资源,因此修改系统资源数量,消除与它相连的所有边,让它称为孤立的节点,然后看现有的资源是否能唤醒其他阻塞的进程,能唤醒的话重复以上步骤,如果所有边能被消除则该图是可完全简化的,如果某时刻系统的资源分配图是不可完全简化的,则系统死锁
解除死锁方法
解除死锁方法:
1.资源剥夺。将死锁(阻塞)进程挂起放到外存,抢它们的资源分配给别的死锁进程,可能导致挂起的进程长时间得不到资源而饥饿
2.撤销进程。把一些或全部死锁进程强制关闭,然后把这些进程的资源分配给其他死锁进程,这样会导致有些死锁进程可能快运行完了现在关闭,还得重新运行,消耗大
3.进程回退。系统记录还原点,让一个或多个死锁进程回退到避免死锁的地步
让哪个进程牺牲(被剥夺资源/被关闭/被回退):
1.进程优先级。优先级低的先被牺牲
2.已执行多长时间。执行时间短的先被牺牲
3.还要多久才能完成。还要很长时间才能完成的先被牺牲
4.进程已经使用了多少资源。使用资源多的先被牺牲,这样释放的时候释放的资源多,别的死锁进程就能用的多了
4.进程是交互式的还是批处理式的。交互式的是跟用户打交道的,不能让用户等,所以先处理批处理的
知识回顾
。。。。。。。。。。。。。