死锁的产生及避免

死锁是指在一组进程中的各个进程均占有不会释放的资源,但因互相申请被其他进程所站用不会释放的资源而处于的一种永久等待状态。

死锁的四个必要条件:
(1)互斥条件(Mutual exclusion):资源不能被共享,只能由一个进程使用。
(2)请求与保持条件(Hold and wait):已经得到资源的进程可以再次申请新的资源。
(3)非剥夺条件(No pre-emption):已经分配的资源不能从相应的进程中被强制地剥夺。
(4)循环等待条件(Circular wait):系统中若干进程组成环路,该环路中每个进程都在等待相邻进程正占用的资源。

死锁避免的方法

(1)   死锁检测和恢复(deadlock detection and recovery):

  死锁检测(deadlock detection)即探查和识别死锁的方法。这种策略并不采取任何动作来使死锁不出现,而是系统事件触发执行一个检测算法。,也即在系统运行过程中,及时地探查和识别死锁的存在,并识别出处于死锁之中的进程和资源等。死锁恢复(deadlock recovery)是指当检测并识别出系统中出现处于死锁之中的一组进程时,如何使系统回复到正常状态并继续执行下去。死锁恢复常采用下述两种方法。

1)   撤消进程即当发现死锁时,就撤消(夭折)一些处于死锁状态的进程,并收回它的占用的资源,以解除死锁,使其它进程能继续运行,或者在提供检查点(checkpoint)信息情况下回退(rolled back)到一个较早的状态。这里有一个开销问题,即撤消哪个(些)进程比较“划算”。

2)   挂起进程即当发现死锁时,挂起一些进程,抢占它们占用的资源,使得处于死锁之中的其它进程继续执行。待以后条件满足后,再恢复被挂起的进程。

常利用资源分配图、进程等待图来协助这种检测。

(2)   死锁预防(deadlock prevention):

  死锁预防(deadlock prevention)是在系统运行之前,事先考虑防止死锁发生的对策,即在最初设计各种资源调度算法时,就没法防止在系统运行过程中可能产生的死锁。

  Coffmman 等人[1971]曾提出进程在利用可重用性资源时产生死锁的四个必要条件:

1)   互斥使用(mutual exclusion):系统中存在一次只能给一个进程使用的资源。

2)   占用并等待(resource holding and waiting):系统中存在这样的进程,它(们)已占有部分资源并等待得到另外的资源,而这些资源又被其它进程所占用还未释放。

3)   非抢占分配(nonpreemption):资源在占有它的进程自愿交出之前,不可被其它进程所强行占用。

4)   部分地分配(partial allocation)或循环等待(circular waiting):存在一个两个或都个进程的循环链,链中每一个进程等待被链中下一个进程占有的资源。即在一定条件下,若干进程进入了相互无休止地等待所需资源的状态。

   所有这四个必要条件都应该在死锁时出现。

  Havender[1968]提出了若干死锁预防方法。他认为,只要设法破坏产生死锁的任一必要条件,死锁就不会发生。为此,可采用如下策略:

1)   每个进程必须一次性地请求它所需要的所有资源。若系统无法满足这一要求,则它不能执行。这是一种预分资源方法,它破坏了产生死锁的第三个必要条件。

2)   一个已占有资源的进程若要再申请新资源,它必须先释放已占资源。若随后它还需要它们,则需要重新提出申请。换言之,一个进程在使用某资源过程中可以放弃该资源,从而破坏了产生死锁的第二个必要条件。

3)    将系统中所有资源顺序编号,规定进程只能依次申请资源,这就是说,一个进程只有在前面的申请满足后,才能提出对其后面序号的资源的请求。这是一种有序使用资源法,它破坏了产生死锁的第四个必要条件。

(3)   死锁避免(deadlock avoidence):

  死锁避免(deadlock avoidence)是在系统运行过程中注意避免死锁的发生。这就要求每当申请一个资源时,系统都应根据一定的算法判断是否认可这次申请,使得在今后一段时间内系统不会出现死锁。这面方最著名的算法首推Dijkstra[1965]提出的银行家(banker)算法。

posted @ 2016-03-13 13:00  独孤流  阅读(1845)  评论(0编辑  收藏