死锁 --- 全面总结

什么是死锁?

多线程以及多进程提高了资源的利用率,但同时并发执行也带来新的问题 — 死锁。

死锁的定义

两个或两个以上的进程(线程)在运行中因争夺资源而造成的一种僵局,每一个进程都无限等待另一个进程所占的资源,这些进程都无法向前拖进,这种现象就称为死锁。

死锁与饥饿
  • 饥饿是指进程一直得不到资源
  • 死锁与饥饿都是由进程竞争资源而引起的。饥饿一般不占有资源,死锁进程一定占有资源。
死锁的结论
  • 参与死锁的进程数至少为两个
  • 参与死锁的所有进程均等待资源
  • 参与死锁的进程至少有两个已经占用资源
  • 死锁进程是系统中当前进程集合的一个子集
  • 死锁会浪费大量系统资源,甚至导致系统崩溃

资源的类型

前面提到造成死锁的其中一个原因是由于并发的进程之间争夺资源而造成的。下面介绍资源的类型。

永久性资源与临时性资源

永久性资源:

可被多个进程多次使用,若所有的硬件

  • 只能分配给一个进程使用,不允许多个进程共享
  • 进程在使用这类资源时,必须按照请求资源、使用资源、释放资源这样的顺序
  • 系统中每一类永久型资源中的单元数目是相对固定的,进程在运行期间,既不能创建,也不能删除。

临时性资源:(可消耗性资源)

是由进程在运行期间动态创建和消耗的。

  • 临时性资源在进程运行期间是可以不断变化的,有时可能为0
  • 进程在运行过程中,可以不断地创造临时性资源的单元数,将它们放入该资源类的缓存区中,以增加该资源类的单元数目
  • 进程在运行过程中,可以请求若干个临时性资源单元,用于进程自己消化,不再将它们返回给该资源类中
可抢占性资源与不可抢占性资源
  • 可抢占性资源: 某进程获得这类资源后,该资源可以再被其他进程或系统抢占。对于这类资源是不会引起死锁的。CPU与主存属于可抢占资源
  • 不可抢占性资源: 一旦系统把某个资源分配给该进程之后,就不能将它强行收回,只能在进程用完之后自行释放。磁带机、打印机属于不可抢占性资源

死锁产生的原因

  • 竞争不可抢占性资源引起的进程死锁

    系统中的不可抢占性资源数量不能满足多个进程的需要,使得进程在运行过程中,会因争夺资源而陷入僵局。只有对不可抢占资源的竞争才可能产生死锁,对可抢占资源的竞争是不会引起死锁的。

    例如:两个进程P1,P2,这两个进程都要写文件F1和F2。而这两个文件属于不可抢占性资源,如果进程P1在打开F1的同时,P2进程打开F2。当P1想打开F2时,F2已经被占用,当P2想打开F1时,F1已经被占用,此时两个进程都没办法运行,无线等待,形成死锁。
    在这里插入图片描述

  • 竞争临时性资源引起的死锁
    在这里插入图片描述

  • 进程推进顺序不当引起的死锁
    A进程在等待B进程的资源,而B进程在等待A进程的资源。即双方都在等待对方的资源

产生死锁的4个必要条件

  • 互斥条件
  • 不可抢占条件: 其他进程不能强行剥夺该进程拥有的资源,只能由该进程自己释放
  • 请求和保持条件: 进程已经保持了至少一个资源,但又提出新的资源请求,而该资源已被其他进程占有,此时请求进程被阻塞,但对自己已获得的资源保持不放
  • 环路条件:存在一种进程的循环链,链中的每一个进程已经获得的资源同时被下一个进程所请求。
    在这里插入图片描述

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

处理死锁的方法

  • 预防死锁: 通过设置某些限制条件,去破坏死锁的四个必要条件中的一个或多个,来防止死锁。
  • 避免死锁: 不事先设置限制条件去破坏产生死锁的条件,而是在资源的动态分配中,用某种方法防止系统进入不安全状态,从而避免死锁的发生。
  • 检测死锁: 允许死锁发生,但可通过检测机构及时检测出死锁的发生,并精确确定与死锁有关的进程与资源,然后采取适当措施,将系统中已发生的死锁清除。
  • 解除死锁: 与检测死锁相配套,用于将进程从死锁状态解脱出来。常用的方法是撤销或挂起一些进程。以回收一些资源,再将它们分配给处于阻塞状态的进程,使之转为就绪状态
预防死锁
  • 破坏“互斥”条件:一般来说,“互斥”条件时无法破坏的。因此,在死锁预防里主要是破坏其他几个必要条件,而不涉及“互斥”条件。
  • 破坏“循环与等待”条件:不允许系统中进程在已获得某种资源的情况下,申请其他资源。即阻止进程在持有资源的同时申请其他资源。
    方法一: 创建进程时,要求它申请所需的全部资源,系统满足其所有要求或者什么都不给。
    方法二: 要求进程提出一个新的资源申请前,释放它所占用的资源。
  • 破坏“不可抢占”条件: 即允许对资源实行抢夺。
    方法一: 如果占有某些资源的进程进行进一步资源请求被拒绝,则该进程必须释放它最初占有的资源。
    方法二: 如果一个进程请求当前被另一个进程占有的一个资源,则操作系统可以抢占另一个进程,要求它释放资源。只有在任意两个进程的优先级都不相同的条件下,方法二才能预防死锁
  • 破坏“环路”条件:: 将系统中的所有资源统一编号,进程可在任何时刻提出资源申请,但所有申请必须按照资源的编号顺序提出。这样就能保证不出现死锁。
避免死锁

常见的避免死锁的方法: 银行家算法

检测死锁

在实际的操作系统中往往采用死锁的检测与恢复方法来排除死锁。死锁检测与恢复是指系统设有专门的机构,当死锁发生时,该机构能够检测到死锁发生的位置和原因,并能通过外力破坏死锁发生的必要条件,从而使得并发进程从死锁状态中恢复出来。

解除死锁

一旦检测出死锁,就应立即釆取相应的措施,以解除死锁。

死锁解除的主要方法有:

  • 资源剥夺法。挂起某些死锁进程,并抢占它的资源,将这些资源分配给其他的死锁进程。但应防止被挂起的进程长时间得不到资源,而处于资源匮乏的状态。
  • 撤销进程法。强制撤销部分、甚至全部死锁进程并剥夺这些进程的资源。撤销的原则可以按进程优先级和撤销进程代价的高低进行。
  • 进程回退法。让一(多)个进程回退到足以回避死锁的地步,进程回退时自愿释放资源而不是被剥夺。要求系统保持进程的历史信息,设置还原点。

参考链接:死锁,死锁的四个必要条件以及处理策略

发布了229 篇原创文章 · 获赞 169 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/qq_41257129/article/details/103956129
今日推荐