操作系统--死锁--死锁恢复

8.7 死锁恢复

当死锁检测算法确定死锁已存在,那么可以采用多种措施。一种措施是通知操作员死锁发生,以便操作人员人工处理死锁。另一种措施是让系统从死锁状态中自动恢复过来。打破死锁有两个方法。一个方法是简单地终止一个或多个进程以打破循环等待。另一个方法是从一个或多个死锁进程那里抢占一个或多个资源。

8.7.1 进程终止

有两个方法通过终止进程以取消死锁。不管用哪种,系统都会回收分配给被终止进程的所有资源。

  1. 终止所有死锁进程:这样方法显然终止了死锁循环,但是其代价也大;这些进程可能已计算了很长时间,这些部分计算结果必然放弃,以后可能还要重新计算。
  2. 一次只终止一个进程直到取消死锁循环为止:这种方法的开销会相当大,这是因为每次终止一个进程,都必须调用死锁检测算法以确定进程是否仍处于死锁。
    终止一个进程并不简单。如果进程正在更新文件,那么终止它会使文件处于不一致状态。类似的,如果进程正在打印文件,那么系统必须将打印机重新设置到正确状态,以便打印下一个文件。
    如果采用了部分终止,那么对于给定死锁过程,必须确定终止哪个进程或那些进程可以打破死锁。这个确定类似于CPU调度问题,是个策略选择。该问题基本上是个经济问题;应该终止代价最小的进程。然而,“代价最小”并不精确。许多因素都影响着应选择哪个进程,包括:
  3. 进程的优先级是什么?
  4. 进程已计算了多久,进程在完成其指定任务之前还需要多久?
  5. 进程使用了多少什么类型的资源(例如,这些资源是否容易抢占)?
  6. 进程需要多少资源以完成?
  7. 多少进程需要被终止?
  8. 进程是交互的还是批处理的?

8.7.2 资源抢占

通过抢占资源已取消死锁,逐步从进程中抢占资源给其他进程使用,知道死锁环被打破为止。
如果要求使用抢占来处理死锁,那么有三个问题需要处理:

  1. 选择一个牺牲品:抢占哪些资源和哪个进程?与进程取消一样,必须确定抢占顺序以最小化代价。代价因素包括许多参数如死锁进程所拥有的资源数量,死锁进程到现在为止在其执行过程中所消耗的时间。
  2. 回滚:如果从一个进程那里抢占一个资源,那么应对该进程做些什么安排?显然,该进程不能正常执行;它缺少其所需要的资源。必须将进程回滚到某个安全状态,以便从该状态重启进程。
    通常确定一个安全状态并不容易,所以最简单的方法是完全回滚:终止进程并重新执行。然而,更为有效的方法是只将进程回滚到足够打破死锁。另一方面,这种方法要求系统维护有关运行进程状态的更多信息。
  3. 饥饿:如何确保饥饿不会发生?即, 如何保证资源不会总是从同一进程中被抢占。如果一个系统是基于代价来选择牺牲进程,那么同一进程可能总是被选为牺牲品。结果,这个进程永远不能完成其指定任务,任何实际系统都需要处理这种饥饿情况。显然,必须确保一个进程只能有限次地被选择为牺牲品。最为常见的方法是在代价因素中加上回滚次数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值