zoukankan      html  css  js  c++  java
  • 什么是死锁?其条件是什么?怎样避免死锁?

    死锁的概念: 
    在两个或多个并发进程中,如果每个进程持有某种资源而又都等待别的进程释放它或它们现在保持着的资源,在未改变这种状态之前都不能向前推进,称这一组进程产生了死锁 
    通俗地讲,就是两个或多个进程被无限期地阻塞、相互等待的一种状态

      死锁产生的原因主要是: 
       1.系统资源不足 
       2.进程推进顺序非法

      产生死锁的必要条件: 
      (1)互斥(mutualexclusion),一个资源每次只能被一个进程使用 
      (2)不可抢占(nopreemption),进程已获得的资源,在未使用完之前,不能强行剥夺 
      (3)占有并等待(hold andwait),一个进程因请求资源而阻塞时,对已获得的资源保持不放 
      (4)环形等待(circularwait),若干进程之间形成一种首尾相接的循环等待资源关系。

      这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之一不满足,就不会发生死锁。

      死锁的解除与预防: 
      理解了死锁的原因,尤其是产生死锁的四个必要条件,就可以最大可能地避免、预防和解除死锁。 
      在系统设计、进程调度等方面注意如何不让这四个必要条件成立,如何确定资源的合理分配算法,避免进程永久占据系统资源。 
      此外,也要防止进程在处于等待状态的情况下占用资源。因此,对资源的分配要给予合理的规划。

      死锁的处理策略:鸵鸟策略、预防策略、避免策略、检测与恢复策略

    鸵鸟策略:传说中鸵鸟看到危险就把头埋在地底下。当你对某一件事情没有一个很好的解决方法时,那就忽略它,就像鸵鸟面对危险时会把它深埋在沙砾中,装作看不到。这样的算法称为“鸵鸟算法“。这实在不算是一个算法,但却是目前实际系统采用最多的一种策略。例如在计算机操作系统中,当死锁真正发生且影响系统正常运行时,手动干预—重新启动。

    为使系统不发生死锁,必须设法破坏产生死锁的四个必要条件之一,或者允许死锁产生, 但当死锁发生时能检测出死锁,并有能力实现恢复。

    预防死锁

    设置某些限制条件,破坏产生死锁的四个必要条件中的一个或几个,以防止发生死锁。

    避免死锁

    在资源的动态分配过程中,用某种方法防止系统进入不安全状态,从而避免死锁。

    死锁的检测及解除

    无需釆取任何限制性措施,允许进程在运行过程中发生死锁。通过系统的检测机构及时 地检测出死锁的发生,然后釆取某种措施解除死锁。

    预防死锁和避免死锁都属于事先预防策略,但预防死锁的限制条件比较严格,实现起来 较为简单,但往往导致系统的效率低,资源利用率低;避免死锁的限制条件相对宽松,资源 分配后需要通过算法来判断是否进入不安全状态,实现起来较为复杂。

    死锁的几种处理策略的比较见表2-14。

    表2-14 死锁处理策略的比较
    -- 资源分配策略 各种可能模式 主要优点 主要缺点
    死锁预防 保守,宁可资源闲置 一次请求所有资源,资 源剥夺,资源按序分配 适用于做突发式处理 的进程,不必进行剥夺 效率低,进程初始化时 间延长;剥夺次数过多; 不便灵活申请新资源
    死锁避免 是”预防“和”检测“ 的折中(在运行时判断是 否可能死锁) 寻找可能的安全允许 顺序 不必进行剥夺 必须知道将来的资源 需求;进程不能被长时间 阻塞
    死锁检测 宽松,只要允许就分配 资源 定期检查死锁是否已 经发生 不延长进程初始化时 间,允许对死锁进行现场 处理 通过剥夺解除死锁,造 成损失

  • 相关阅读:
    解决EXC_BAD_ACCESS错误的一种方法--NSZombieEnabled
    关于deselectRowAtIndexPath
    CGRectInset、CGRectOffset、等对比整理
    代码设置UITableViewCell 各个组件间距
    UITableViewCell计算行高
    设置UITableView中UIImage的大小
    UILbale自动换行
    根据字体多少使UILabel自动调节尺寸
    ios通过url下载显示图片
    Python【requests】第三方模块
  • 原文地址:https://www.cnblogs.com/muyangshaonian/p/9650515.html
Copyright © 2011-2022 走看看