操作系统中提前检测死锁和死锁解除的方法

以上小节讨论了死锁预防和死锁避免的几种方法,但是这些方法都比较保守,并且都是以牺牲系统效率和浪费资源为代价的,这恰恰与操作系统设计目标相违背。假如系统为进程分配资源时,不采取任何限制性措施来避免和预防死锁,减少因避免和预防死锁策略带来的开销,同时本着提高资源利用率的原则分配资源,但操作系统在运行过程中,不断地监督 进程的执行和资源占用状态,判定死锁是否真的发生;并且,一旦死锁发生,则釆取专门的 措施解除死锁,并以最小代价使整个系统恢复正常,这就是死锁的检测和解除。

一、 死锁检测的时机

操作系统可定时运行一个“死锁检测”.程序,该程序按一定的算法去检测系统中是否 存在死锁。检测死锁的实质是确定是否存在“循环等待”条件,检测算法确定死锁的存在 并识别出与死锁有关的进程和资源,以供系统采取适当的解除死锁措施。

通常,死锁检测可以在任何一次资源分配后,也可以在每次调度后,或者利用定时器定 时运行检测,还有一种方法是当系统中某个进程长期位于阻塞态或阻塞进程过多时,启动死 锁检测程序。

二、 死锁检测的算法

死锁检测的算法依不同的系统而不同,下面介绍一种死锁检测的算法。

(1)为每个进程和每个资源指定唯一编号

(2)设置一张资源分配状态表,每个表目包含“资源号”和占有该资源的“进程号”两 项,资源分配表中记录了每个资源正在被哪个进程所占有

(3)设置一张进程等待分配表,每个表目包含“进程号”和该进程所等待的“资源号” 两项

(4)算法规则:当任一进程P,申请一个已被其他进程占用的资源时,进行死锁检测。 检测算法通过反复查找资源分配表和进程等待表,来确定进程P,.对资源I的请求是否导致形成环路,若是,便确定出现死锁

【例7】进程死锁检测算法。

系统中有进程P1、P2和P3共享资源r1、r2和r3。在某一时刻资源使用情况如图5-9a所 示。此后依次发生P1请求r1,P2请求r3, P3请求r1。当执行死锁检测算法后,得到图5-9b; 再执行死锁检测算法,得到图5-9c;再执行死锁检测算法,得到图5-9d。检查图5-9d与图 5-9a,确定是否出现死锁。

三、死锁的解除方法

一旦检测到死锁,便要立即设法解除死锁。一般说来,只要让某个进程释放一个或多个资源就可以解除死锁。死锁解除后,释放资源的进程应恢复它原来的状态,才能保证该进程 的执行不会出现错误。因此,死锁解除实质上就是如何让释放资源的进程能够继续运行。

为解除死锁就要剥夺资源,此时,需要考虑以下几个问题。

(1)选择一个牺牲进程,即要确定剥夺哪个进程的哪些资源。

(2)重新运行或回退到某一点开始继续运行。若从一个进程那里剥夺了资源,要为该进程做些什么事情?显然,这个进程是不能继续正常执行了。必须将该进程回退到起点或某个 状态,以后再重新开始执行。令进程夭折的方法虽然简单,但代价大;而更有效的方法是只 让它退回到足以解除死锁的地步即可。那么,问题转换成进程回退的状态由什么组成?怎样 才能方便地确定该状态,这就要求系统保持更多的有关进程运行的信息。

(3)怎样保证不发生“饿死”现象,即如何保证并不总是剥夺同一进程的资源,而导致 该进程处于“饥饿”状态。

(4)“最小代价”,即最经济合算的算法,使得进程回退带来的开销最小。但是,“最小 开销”是很不精确的,进程重新运行的开销包括很多因素。

①进程的优先级。

②进程已经运行了多长时间,该进程完成其任务还需要多长时间?

③该进程使用的资源种类和数量?这些资源能简单地剥夺吗?

④为完成其任务,进程还需要多少资源?

⑤有多少进程要被撤销?

⑥该进程被重新启动运行的次数。

一旦决定一个进程必须回退,就一定要确定这个进程回退多少。最简单的办法是从头来,让其重新运行,这将会使一个进程的工作“前功尽弃”。

死锁的解除方法可归纳为两大类。

1、剥夺资源

使用挂起/激活机制挂起一些进程,剥夺它们占有的资源给死锁进程,以解除死锁,待以后条件满足时,再激活被挂起的进程。

由于死锁是由进程竞争资源而引起的,所以,可以从一些进程那里强行剥夺足够数量的 资源分配给死锁进程,以解除死锁状态。剥夺的顺序可以是以花费最小资源数为依据。每次 剥夺后,需要再次调用死锁检测算法。资源被剥夺的进程为了再得到该资源,必须重新提出 申请。为了安全地释放资源,该进程就必须返回到分配资源前的某一点。经常使用的方法如 下。

(1)还原算法,即恢复计算结果和状态

(2)建立检查点主要是用来恢复分配前的状态。这种方法对实时系统和长时间运行的数 据处理来说是一种常用技术。在实时系统中,经常在某些程序地址插人检查的程序段,即采 用检查点的技术来验证系统的正确性,如发现故障,可从检查点重新启动。因此,在有些实 时系统中,一旦发现死锁,可以在释放某进程的资源后,从检查点重新启动。

2、撤销进程

撤销死锁进程,将它们占有的资源分配给另一些死锁进程,直到死锁解除为止。

可以撤销所有死锁进程,或者逐个撤销死锁进程,每撤销一个进程就检测死锁是否继续 存在,若已没有死锁,就停止进程的撤销。

如果按照某种顺序逐渐地撤销已死锁的进程,直到获得为解除死锁所需要的足够可用的 资源为止,那么在极端情况下,这种方法可能造成除一个死锁进程外,其余的死锁进程全部 被撤销的局面。

按照什么原则撤销进程?较实用而又简便的方法是撤销那些代价最小的进程,或者使撤 销进程的数目最小。以下几点可作为衡量撤销代价的标准。

(1)进程优先数,即被撤销进程的优先数

(2)进程类的外部代价。不同类型的进程可以规定出各自的撤销代价。系统可根据这些 规定,撤销代价最小的进程,达到解除死锁的目的。

(3)运行代价,即重新启动进程并运行到当前撤销点所需要的代价。这一点可由系统记 账程序给出。

撤销法的优点是简单明了,但有时可能不分青红皂白地撤销一些甚至不影响死锁的进程。

当死锁的进程中包含有操作系统的进程单元时,死锁会变得复杂,采用上述方法可能导致系统重新启动,从而付出较高代价。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值