首先我们了解一下 什么是死锁
死锁:
同一时间 两个或多个线程 同时竞争一个资源 产生僵持 在无外力作用下 系统无法进行下去 这样的现象叫死锁
产生的原因 :推进顺序不当
资源不足
产生的四个必要条件:
互斥条件
请求与保持
不剥夺条件
循环等待条件
死锁的预防:
破坏互斥条件
破坏请求
破坏不剥夺条件
破坏循环等待条件
死锁的避免:
1.安全序列
2.银行家算法
死锁的检测和解除:
死锁检测
1、画出资源分配图
系统死锁,可利用资源分配图来描述。如下图所示,用长方形代表一个进程,用框代表一类资源。由于一种类型的资源可能有多个,用框中的一个点代表一类资源中的一个资源。从进程到资源的有向边叫请求边,表示该进程申请一个单位的该类资源;从资源到进程的边叫分配边,表示该类资源已经有一个资源被分配给了该进程。
2、简化资源分配图
第一步:先看A资源,它有三个箭头是向外的,因此它一共给进程分配了3个资源,此时,A没有空闲的资源剩余。
第二步:再看B资源,它有一个箭头是向外的,因此它一共给进程分配了1个资源,此时,B还剩余一个空闲的资源没分配。
第三步:看完资源,再来看进程,先看进程P2,它只申请一个A资源,但此时A资源已经用光了,所以,进程P2进入阻塞状态,因此,进程P2暂时不能化成孤立的点。
第四步:再看进程P1,它只申请一个B资源,此时,系统还剩余一个B资源没分配,因此,可以满足P1的申请。这样,进程P1便得到了它的全部所需资源,所以它不会进入阻塞状态,可以一直运行,等它运行完后,我们再把它的所有的资源释放。相当于:可以把P1的所有的边去掉,变成一个孤立的点,如下图所示:
第五步:进程P1运行完后,释放其所占有的资源(2个A资源和1个B资源),系统回收这些资源后,空闲的资源便变成2个A资源和1个B资源,由于进程P2一直在申请一个A资源,所以此时,系统能满足它的申请。这样,进程P2便得到了它的全部所需资源,所以它不会进入阻塞状态,可以一直运行,等它运行完后,我们再把它的所有的资源释放。相当于:可以把P2的所有的边都去掉,化成一个孤立的点,变成下图:
(若能消去图中所有的边,则称该图是可完全简化的,如上图)
3、使用死锁定理判断
死锁定理: ①如果资源分配图中没有环路,则系统没有死锁; ②如果资源分配图中出现了环路,则系统可能有死锁。 或者说: 当且仅当S状态的资源分配图是不可完全简化的时候,系统状态则是死锁状态
死锁的解除
1、资源剥夺法
挂起某些死锁进程,并抢占它的资源,将这些资源分配给其他的死锁进程。但应防止被挂起的进程长时间得不到资源,而处于资源匮乏的状态。
2、撤销进程法
强制撤销部分、甚至全部死锁进程并剥夺这些进程的资源。撤销的原则可以按进程优先级和撤销进程代价的高低进行。
3、进程回退法
让一(多)个进程回退到足以回避死锁的地步,进程回退时自愿释放资源而不是被剥夺。要求系统保持进程的历史信息,设置还原点。