初夏小谈:带你解剖“死锁”的奇门五行

来说说这传说中的死锁:


一、死锁是什么?

死锁是一组进程中的进程都在等着仅由其它进程才能引发的事件,形成的一种僵持状态。

通俗的说就是:进程在等待被其它进程抢先占用了自己想要的资源。而那些其它进程并没有占据它们所有需要的资源。也在等待别人占据了它们所需要的资源。这样导致都无法运行,因为运行条件不够也不释放自己的资源想让别人用。从而一直等待下去。

二、死锁产生的原因

死锁产生的原因主要是1.相互抢占资源造成。2.进程的推进顺序非法。

(一)竞争资源可分为:(1)竞争不可抢占性资源 和(2)竞争可消耗资源

什么是不可抢占性资源?

不可抢占性资源就是操作系统一旦把一个资源分配给进程后,就不能将它强行收回或者被其它进程抢占这块资源。(刻录机,磁带机,打印机都是不可抢占性资源)

什么是可消耗资源?

可消耗资源的另一个名字叫临时性资源。它是在进程运行期间,由进程动态地创建和消耗的。

可消耗性资源性质:

  1. 每种可消耗资源的单元数目在进程运行期间可以不断调整,根据需求有时可以很多有时也可以没有。
  2. 进程运行过程中可以不断地创造可消耗资源的单元。把它们放入缓冲区中,以增加该资源的数目
  3. 进程在运行中科请求可消耗资源供自己消耗,用完不再把它们返回资源类中。(典型的就是用于进程间通信的消息)

三、死锁产生的必要条件

死锁产生的四个条件缺一不可。

(1)互斥条件:在一段时间内某个资源只能被一个进程占用。如果此时还有其他进程请求该资源将会等待,直到占用这块资源的进程释放这块资源。

2)请求与保持条件:进程已经保持(占)了一个资源,有需要另一资源,而这种资源被其它进程占用。此时进程阻塞自己也不释放拿到的资源。

(3)不可抢占条件:进程自己拿到的资源没用完之前,不可被抢走,只能由自己释放。

(4)循环等待(环路等待)::在发生死锁时,必然存在一个环(进程--资源的循环链)一个进程占了一个进程的资源。而自己的资源也是别人所需要的。自己占有的不释放,想要的拿不到。

四、如何处理死锁?总结为四种

第一大类属于事先预防类

(一)预防死锁

预防死锁的方法是用过破坏四个必要条件当中的一个或多个。由于互斥条件是非共享设备所必需的。它是锁的基本条件。不仅不能改变,还要加以保护。主要破坏后三个条件。

(1)破坏“请求与保持”条件。时系统要确保进程不能占据不可抢占资源。否则无法剥离资源。

第一种协议实现:

所有进程开始运行前都必须一次性申请自己所需的所有资源。系统发现满足哪一个进程所需的所有资源就一次性将需要的所有资源分配给它。不满足的进程则一点资源也不给它,让它等待,等资源满足它的所有条件再进行分配。被分配资源的进程在运行中不再提出资源需求,破坏了请求条件。未分配资源的进程,再等待时间内没有占据资源破坏了保持条件。

这种缺点也很明显:

  • 资源浪费严重
  • 使进程动不动就处于饥饿状态

优点也很明显:

  • 简单,容易实现也很安全

第二种协议实现:

在第一种协议上进行改进。就是系统为进程就开始运行所需要的资源满足后就为它分配资源。进行在运行过程中逐渐释放自己已用的资源。然后再提出请求自己所需的资源。

优点:

  • 提高了设备利用率,减少进程发生饥饿的几率。

(2)破坏“不可抢占”条件

当进程中已经占据了一块不可抢占资源,又提出资源申请得不到时就必须释放已经占有的资源。等以后需要时再重新申请。

这种实现起来比较复杂,要付出很大代价,它可能会造成进程前一阶段的工作失效。采取措施也会是间断处信息不连续。反复的申请和释放可能导致进程无限延迟。

缺点:

  • 延长了进程周转时间,增加了系统开销,降低了系统的吞吐量。

(三)破坏“循环等待(环路等待)”条件

就是对资源进行线性排成一列,并且每个进程在获取资源时只能从低到高来获取,如果再较高地序列获取到资源又想获取序列号较低的资源就必须释放序列号大于较低序列号的资源。采用这种策略,不可能产生环路等待。这样进程可以一直向前推进。

优点:

  • 提高了资源的利用率和系统的吞吐量。

缺点:

  • 为资源排序目的是为了顺序的相对稳定,这样限制了新资源的假如。
  •    进程所需资源顺序和资源的排序不同时造成资源浪费。
  • 这种按次序申请资源会程序员的简单,自主编程。   

(二)避免死锁

是在资源动态分配的过程中,采用某种方法来防止系统进入不安全状态(死锁就是不安全,但不安全不代表有死锁。)来避免锁。

安全状态就是资源顺序使得所有进程就可以顺利的完成。

(1)通过银行家算法来避免死锁。

就是进程进入系统准备运行时,必须说明需要每种资源的最大数目。当进程请求一组资源时,系统必须确保是否有足够的资源给它,如果有会接着计算如果给它资源后,会不会是系统处于不安全状态,如果不会,才将资源给它。否则让它等待。

第二大类属于事后处理类

如果事前没有针对处理,那么事后就必须采取措施了。

(三)检测死锁

想要检测系统中是否发生了死锁,系统必须做两件事:1.保存相关资源申请和分配的信息。2.通过一种算法来根据保存的信息来判断系统是否已经进入死锁状态。

1.资源分配图

上图中,方框里面的小圆圈代表每个资源,方框代表每种资源。P代表进程,有两个进程。进程已占有的资源是指向自己的,起于进程,终于资源是进程申请资源。

P1进程得到了两个R1资源又在申请R2资源。P2得到一个R2资源和一个R1资源又在申请一个R1资源。

死锁定理:当且仅当S状态的资源分配图是不可简化的。

(四)解除死锁

当检测到死锁时,就必须把系统从死锁中解脱出来。常用方法有两种:

1.抢占资源:从一个或多个进程中抢占足够多的资源,分配给死锁进程,以解除死锁状态。

2.终止进程:终止系统中一个或多个进程来打破循环环路,是系统从死锁状态解脱出来。

这四种方法对思索地防范程度逐渐降低,但对资源的利用率是提高了。以及进程因资源因素而阻塞的频度下降(并发程度提高)。

                                                                                                                                                              珍&源码

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值