这两个是允许死锁发生的方法
死锁的检测
为了能对系统是否已经发生了死锁进行检测,必须:
1.用某种数据结构来保存资源的请求和分配信息;
2.提供一种算法。利用上述的信息来检测系统是否已经进入了死锁状态
数据结构资源分配图
两种节点:
进程节点:对应一个进程
资源节点:对应一类资源,一类资源可能有多个个数
两种边:
进程节点-》资源节点:表示想要申请几个资源,每一条边代表一个
资源节点-〉进程节点:表示已经分配了几个资源,每一条边代表一个
如果系统中剩余的可用资源数足够满足进程的需求,那么这个进程暂时不会阻塞,可以顺利执行下去。
如果这个进程执行结束了吧资源归还给系统,就可能使某些正在等待资源的进程被激活,并顺利执行下去
如果按照上述的过程分析可以消除所有的变,那么就称这个图是可完全简化的。此时一定没有发生死锁(相当于能找到一个安全序列)
如果最终不能消除所有的边,那么此时就发生了死锁
最终还连着边的那些进程就是处于死锁状态的进程
检测死锁的算法:
1.在资源分配图中,找出几步阻塞又不是孤点点进程Pi(即找出一条有向边与它相连,且该有向边对应资源的申请数量小于系统中已经有的空闲资源数量)
消去它所有的请求边和分配边,使之成为孤立的节点
2.进程所释放的资源可以唤醒因为等待这些资源而阻塞的进程,原来的阻塞进程可能变为非阻塞进程
死锁定理
如果某时刻系统的资源分配图是不可完全简化的,那么此时系统死锁
死锁的解除
一旦检测出死锁的发生,就应该立刻解除死锁
1.资源剥夺法。挂起某些死锁进程,并抢占它的资源,把这些资源分配给其他死锁进程,但是应放置被挂起的进程长时间得不到资源而饥饿
2.撤销进程法(终止进程法)。强制撤销部分,甚至全部的死锁进程,并剥夺这些进程的资源。虽然实现简单,但是付出的代价很大,有些可能快要执行结束了,你一断开,又要从头再来
3.进程退回法。让一个或多个死锁进程退回到足以避免死锁的地步,这就要求系统记录进程的历史信息,设置还原点