死锁现象
一.死锁
死锁指的是多个进程因为竞争资源,而造成相互等待的请款,在没外力的作用下,这些进程将永远处于阻塞状态。死锁产生必须满足下面四个条件:
- 资源互斥条件:资源不能共享,只能由一个进程使用。
- 资源不可剥夺条件:资源一旦分配给某个进程,除非进程主动释放,不能被剥夺
- 请求保持条件:进程得到资源之后,还可以继续申请其它资源
- 循环等待条件:若干进程组成环路,该环路中每个进程都在等待相邻进程中正在占用的资源。
二.死锁的解决
死锁产生有四个必要条件,只要破坏其中的任意一个条件,死锁就不会产生。一般而言解决死锁的方法分为预防、避免、检测与恢复。
- 死锁的预防。通过破坏死锁产生的四个必要条件。破话资源互斥条件,提高资源的共享性、可剥夺性质。除此之外进程在执行之前一次性向系统申请所有的资源,破坏进程之间的循环关系。
- 死锁的避免。死锁的预防是静态排除死锁的策略,限制进程对资源的申请。死锁的避免则相反是系统对进程所发出的每一个资源申请命令进行动态检查,根据结果决定是否进行资源的分配。在资源分配过程中若预测有发生死锁的可能性,则加以避免。
- 死锁的检测和恢复。由于操作系统有并发,共享以及随机性等特点,通过预防和避免的手段达到排除死锁的目的是很困难的。这需要较大的系统开销,而且不能充分利用资源。为此,一种简便的方法是系统为进程分配资源时,不采取任何限制性措施,但是提供了检测和解脱死锁的手段:能发现死锁并从死锁状态中恢复出来。因此,在实际的操作系统中往往采用死锁的检测与恢复方法来排除死锁。常利用资源分配图、进程等待图来协助这种检测。死锁检测与恢复是指系统设有专门的机构,当死锁发生时,该机构能够检测到死锁发生的位置和原因,并能通过外力破坏死锁发生的必要条件,从而使得并发进程从死锁状态中恢复出来。一旦在死锁检测时发现了死锁,就要消除死锁,使系统从死锁状态中恢复过来。 (1)最简单,最常用的方法就是进行系统的重新启动,不过这种方法代价很大,它意味着在这之前所有的进程已经完成的计算工作都将付之东流,包括参与死锁的那些进程,以及未参与死锁的进程。(2)撤消进程,剥夺资源。终止参与死锁的进程,收回它们占有的资源,从而解除死锁。这时又分两种情况:一次性撤消参与死锁的全部进程,剥夺全部资源;或者逐步撤消参与死锁的进程,逐步收回死锁进程占有的资源。一般来说,选择逐步撤消的进程时要按照一定的原则进行,目的是撤消那些代价最小的进程,比如按进程的优先级确定进程的代价;考虑进程运行时的代价和与此进程相关的外部作业的代价等因素。 此外,还有进程回退策略,即让参与死锁的进程回退到没有发生死锁前某一点处,并由此点处继续执行,以求再次执行时不再发生死锁。虽然这是个较理想的办法,但是操作起来系统开销极大,要有堆栈这样的机构记录进程的每一步变化,以便今后的回退,有时这是无法做到的。