考研帮 > 数学 > 每日一练

2.8 死锁

2.8.7 从死锁中恢复

  当检测算法确定系统中存在死锁时,可以有多种选择。可以通知操作员死锁发生,让操作员手工解除死锁,也可以使系统自动从死锁中恢复。有两种解除死锁的方法。一种方法是简单地异常终止一个或多个进程来打断这个循环等待。另一种方法是从一个或多个死锁的进程中抢占资源。
  1.进程终止
  为了通过异常终止进程来消除死锁,我们有两种方法可以选择。在这两种方法中,系统都需要回收被终止进程所持有的所有资源。
  异常终止所有的死锁进程:这种方法无疑可以打断死锁循环,但是代价高昂:这些进程可能已经计算了很长一段时间,而且必须丢弃这些计算结果并稍后可能需要重新计算。
  每次异常终止一个进程直到消除死锁循环:这种方法会招致相当可观的开销,因为每次终止进程之后都需要执行一次死锁解除算法来确定是否仍旧有进程死锁。
  异常终止一个进程并不容易。如果进程正在更新一个文件,那么终止这个进程将导致文件处于错误状态。类似地,如果进程正在打印,那么系统在打印下一个作业前必须要重新启动打印机来达到一个正确的状态。
  如果采用部分终止方法,那么给定一个死锁进程序列,我们必须确定应该终止哪个(或哪些)进程来解除死锁。这取决于具体的策略,类似于CPU 调度问题。很多因素影响到进程的选择,这包括:
  (1)进程的优先级是什么?
  (2)进程计算了多长时间?进程在完成任务前还要计算多长时间?
  (3)进程使用的数量和种类(例如,是否资源被抢占)?
  (4)进程尚需多少资源?
  (5)需要终止多少进程?
  (6)进程是交互式的还是分批的?
  2.抢占资源
  为了采用抢占资源的方式来消除死锁,我们不断抢占进程的资源并将这些资源分配给其他进程,直到打破死锁循环。
  如果需要利用抢占来解除死锁,那么需要应付以下三件事。
  (1)选择一个进程:要抢占哪些资源和哪些进程呢?像在终止进程方式中的那样,我们必须确定抢占资源的顺序以求代价的最小化。代价因素可能包括死锁进程持有的资源数量以及死锁进程以消耗的时间量。
  (2)回卷:如果我们抢占了一个进程的资源,那么这个进程应该做什么呢?很明显,它不再能够继续执行,它失去了所需的一些资源。我们必须将进程回卷到某种安全状态,并使它从这个状态重新开始。
  因为通常难以确定安全状态是什么样子,所以最简单的方法是全部回卷:撤销这个进程并重新开始。然而,只在有必要消除死锁的时候回卷进程更加高效。另一方面,这种方法需要系统保持所有运行进程的状态信息。
  (3)饥饿:我们怎样确定不将发生饥饿呢?更确切地说,我们怎样保证不总是从同一个进程中抢占资源呢?
  在系统中,选择哪个进程主要依据开销因素,可能会有总是选择同一个进程的情况。结果,这个进程永远不能完成设定的任务,在实际的系统中需要处理这种饥饿现象,无疑,我们必须确保在一个(小的)有限的次数内选中同一个进程,最常用的解决方案是在代价因素中包含回卷的次数。

关于"最后阶段,真题的正确打开方式_备考经验_考研帮"15名研友在考研帮APP发表了观点

扫我下载考研帮

考研帮地方站更多

你可能会关心:

来考研帮提升效率

× 关闭