如何处理死锁
处理死锁的常用方法有
-
鸵鸟策略
-
死锁检测与死锁恢复
-
死锁预防
-
死锁避免
1.鸵鸟策略
不采取任何措施,当发生死锁时不会对用户造成多大影响,或发生死锁的概率很低,可以采用鸵鸟策略。因为解决死锁问题的代价很高,因此鸵鸟策略这种不采取任务措施的方案会获得更高的性能。
2.死锁检测与死锁恢复
不试图阻止死锁,而是当检测到死锁发生时,采取措施进行恢复。
死锁检测
安全状态的检测与死锁的检测类似,因为安全状态必须要求不能发生死锁。下面的银行家算法与死锁检测算法非常类似,可以结合着做参考对比。
在银行家算法的基础上,对每个执行完的进程做了一个标记,每个进程最开始时都不被标记,执行过程有可能被标记。当算法结束时,任何没有被标记的进程都是死锁进程。
死锁恢复:
利用抢占恢复
不通知原进程的情况下,将某一资源从一个进程强行取走给另一个进程使用,接着送回。
利用回滚回复
周期性对进程进行检查和备份,新的检查点不覆盖原有的文件,而是写到新文件中。检测到死锁时,从一个较早的检查点开始,将该进程复位到更早的状态。
利用杀死进程恢复
杀死环中的一个或多个进程;杀死一个环外的进程以释放该进程的资源。(最好杀死可以从头开始重新运行且不会带来副作用的进程)
3.死锁预防
1.破坏互斥条件
一个资源每次只能被一个进程使用。一般不使用
2.破坏占有和等待条件
方法一:系统要求所有进程执行前要一次性的申请在整个运行过程中所需要的全部资源,只要有一个资源申请不成功,其他所有资源也不分配给该进程,并阻塞该进程。
方法二:对某些进程在申请其他资源前要求要求该进程必须释放已经分配给他的所有其他资源。
一个进程因请求资源而阻塞时,对已获得的资源保持不放。
3.破坏不可抢占条件
一个已保持了某些资源的进程,当它再提出新的资源的要求而不能立即得到满足时,必须释放它已经保持的所有资源。
4.破坏环路等待
进程必须按规定的顺序申请资源,对所有不同类型的资源排序,要求每个进程必须按照规定的顺序申请资源。
4.死锁避免
避免死锁的方法是把系统的资源分配状态分为安全状态和不安全状态,只要资源分配使系统资源分配状态处于安全状态,死锁就不会发生。
安全状态:没有死锁,并且即使所有进程突然请求对资源的最大需求,页仍存在某种调度次序能使每一个进程运行完毕。
不安全状态并不是死锁。从安全状态出发,系统能保证所有进程都完成,从不安全状态出发没有这样的保证。
进程 | 最大需求 | 已分配 | 可用 |
P1 | 10 | 5 | 3 |
P2 | 4 | 2 | |
P3 | 9 | 3 |
可用资源还剩下3个,分配给P2进程2个,还剩下1个,P2进程执行完毕之后释放自己的4个资源,此时可用为5个,在分配给P1进程,P1进程执行完毕时候释放,此时可用达到10个,最后执行P3进程,可以使每一个进程都执行完毕,则为安全状态。
进程 | 最大需求 | 已分配 | 可用 |
P1 | 10 | 5 | 2 |
P2 | 4 | 2 | |
P3 | 9 | 3 |
银行家算法基本思想:一个线程提出资源请求后,系统先进行资源的试分配,然后检测本次试分配是否使系统处于安全状态,若安全则按试分配方案分配资源,否则不分配资源。
银行家算法
进程名 |
已分配 (A,B,C) |
最大需求 (A,B,C) |
需要 (A,B,C) |
可用 (A,B,C) |
P0 | 0 1 0 | 7 5 3 | 7 4 3 | 3 3 2 |
P1 | 2 0 0 | 3 2 2 | 1 2 2 | |
P2 | 3 0 2 | 9 0 2 | 6 0 0 | |
P3 | 2 1 1 | 2 2 2 | 0 1 1 | |
P4 | 0 0 2 | 4 3 3 | 4 3 1 |
试分配过程:
先分配给进程P3,可用资源还剩下(3,2,1)个资源,P3执行完释放资源后,可用资源为(5,4,3)。再分配给P1,可用资源还剩下(4,2,1),P1执行完后释放资源,可用资源为(7,4,3)。再分配给P4,可用资源还剩下(3,1,2),P4执行完释放资源,可用资源为(7,4,5)。再分配给P2,可用资源还剩下(1,4,5),P2执行完释放资源,可用资源为(10,4,7)。最后执行P0,可用资源为(3,0,4),执行完P0,可用资源为(10,5,7)= 资源总数。
执行过程(P3->P1->P4->P2->P0),其中进程的顺序只要满足可以使每一个进程都执行完毕即可。