Linux-死锁

一、什么是死锁

  死锁是指两个或两个以上的进程在执行过程中,为争夺同一资源而造成的 一种互相等待的现象。

二、产生死锁的四个必要条件

1、互斥条件。每个资源要么已经分配给了一个进程,要么就是可用的。

2、占有和等待条件。已经得到了某个资源的进程可以再请求新的资源。

3、不可抢占条件。已经分配给一个进程的资源不能强制性地被抢占,它只能被占有它的进程显式的释放。

4、循环等待条件。死锁发生时,系统中一定有两个或两个以上的进程组成的一条环路,该环路中的每一个进程都在等待着下一个进程所占有的资源。

死锁发生时,以上四个条件一定是同时满足的。如果有任意一条不成立,那么死锁就不会发生。

三、如何有效的避免死锁

防死锁的根本办法就是要使死锁产生的4个必要条件之一不存在。下面来分析一下破坏这些条件的可能性。

1、破坏互斥条件

  破坏互斥条件即允许多个进程同时访问资源。由于多数资源的必须互斥访问这一固有特性不能改变,因此,死锁的预防通过破坏这个必要条件实现在很多场合是行不通的。例

如,打印机资源必须互斥使用,否则几个进程同时使用,每个进程各打印一行,这种输出信息的方式显然是不能被用户接受的。

2、破坏占有和等待条件

  采用资源静态分配法可破坏这一条件,该方法是指在进程运行前,一次性地_请分配它运行所需的全部资源。若系统有足够的资源分配给某一进程,则一次性地将其所需资源分

配给该进程,这样,在进程运行期间便不会再提出任何资源请求,从而使等待条件不成立。如果分配时有一种资源要求不能满足,则进程需要的其他资源也先不分配给进程,从

而避免进程在等待期间占用任何资源,破坏了占用条件,从而避免死锁的发生。

  优缺点:该方法控制简单且容易实现,但由于进程运行期间对所需资源的全部占用,使得某些使用时间很短的资源被长时间占用,这样会严重影响系统资源的充分利用,导致

资源利用率降低,同吋也影响到未获得全部资源的进程推迟运行。


3、破坏不剥夺条件

  采用剥夺式控制方法可以破坏该条件,该方法是使一个已保持了某些资源的进程,由于新的资源要求目前得不到满足,它必须先暂时释放巳保持的所有资源(一种剥夺式),

然后去等待,以后再一起向系统提出巾请,这样也能防止死锁。

  优缺点:这种方法实现起来相对较难,为了保护进程自动放弃资源的现场以及后来的再次恢复,需要付出高昂的代价,并且这种方法只适用于处理机和存储器资源,对其他资

源,此法不宜使用。

4、破坏循环等待条件

  采用资源顺序分配法可破坏该条件。这种分配方法的基本思想是:把系统的全部资源分成多个层次,一个进程得到某一层的一个资源后,它只能再_请较高一层的资源;当一个

进程要释放某层的一个资源时,必须先释放所占有的较高层的资源;当一个进程获得了某一层的一个资源后,它想再申请该层中的另一个资源,就必须先释放在该层中巳占有的

资源。或者说,进程释放资源的顺序是按照中请资源的相反顺序进行的。这样可以预防循环等待现象的发生,因此不会发生死锁。使用该方法要特別注意的问题是对资源所处层

次的安排。在通常情况下,把各进程经常用到的、比较普遍的资源安排在较低的层次上,把重要且相对匮乏的资源安排在较高的层次上,以便实现对各资源的最大限度的利用。

优缺点:该方法相对于前面介绍的方法,在资源利用率和系统吞吐量上都有明显的改善。但也存在一些缺陷:

(1)低层次的资源必须在进程请求分配髙层次的资源之前提前申请,这对于暂时不需使用的低层次资源来说,会因空闲等待而产生浪费。

(2)各类设备的资源层次一经设定,便不能经常随意改动,这就限制了新类型设备的增加。

(3)各资源的层次是按照大多数进程使用资源的顺序设置的。对于资源使用与此层次相闪配的进程,资源能得到有效的利用,否则,资源的浪费现象将仍然存在。

四、如何解除死锁

死锁的解除实质上就是如何让释放资源的进程能够继续运行. 

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

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

(2)重新运行或回到某一点开始继续运行.若从一个进程那里剥夺了资源,要为该进程作些什么事情?显然,这个进程是不能继续正常执行了.必须将该进程

回到七点或某个状态,以后在重新开始执行.令进程夭折的方法虽然简单,但代价大;而更有效的方法是只让它退回到足以解除死锁的地步即可.那么,问题转换成进

程回退的状态由什么组成?怎样才能更方便的确定该状态,这就要求系统保持根多的有关进程运行的信息. 

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

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

(a)进程的优先级

(b)进程已经运行了多长时间了,该浸沉完成其任务还需要多长时间 

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

(d)为完成任务,进程还需要多少资源?

(e)有多少进程要被撤销 

(f)该进程被重新启动运行的次数. 

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值