登录/注册

死锁的原因及解决方法

更多

死锁是指在多进程或多线程系统中,两个或多个进程/线程彼此永久阻塞的状态,每个进程/线程都在等待被其他进程/线程占用的资源,且都不释放自己已持有的资源,导致所有相关进程/线程都无法继续推进。

死锁产生的四个必要条件(必须同时满足):

  1. 互斥: 资源是独占的、排他的。一个资源一次只能被一个进程/线程使用。如果一个进程/线程在请求一个已经被占用的资源,它必须等待。
  2. 请求保持(持有并等待): 进程/线程在持有至少一个资源的同时,又在请求其他进程/线程持有的资源。
  3. 不可抢占: 资源不能被强制地从持有它的进程/线程中夺走。资源只能由持有它的进程/线程在使用完毕后自愿释放。
  4. 循环等待: 存在一个进程/线程-资源的循环等待链。进程/线程 P1 持有资源 R1 并请求资源 R2;进程/线程 P2 持有资源 R2 并请求资源 R3;...;进程/线程 Pn 持有资源 Rn 并请求资源 R1。形成了一个封闭的环形等待链。

解决死锁的方法:

解决死锁的思路主要围绕破坏上述四个必要条件之一,或者允许死锁发生但能检测和恢复

  1. 死锁预防: (在系统设计时就确保四个必要条件中至少一个永不成立

    • 破坏互斥: 对于某些类型的资源(如只读文件),允许非互斥访问。但绝大多数资源(如打印机、共享变量、写锁)本质上是互斥的,此方法适用性有限。
    • 破坏请求保持:
      • 一次性分配: 进程在开始执行前,必须申请它所需要运行期间的全部资源。只有所有资源都可用时才分配给它。缺点是资源利用率低,可能导致进程饥饿(某些资源一直被别的进程占用)。
      • 资源预分配: 类似一次性分配,但更早进行。
    • 破坏不可抢占: 如果一个进程请求资源失败(该资源被其他进程占用且它在等待其他资源),则强制释放它当前持有的所有资源。如果另一个进程请求这些被释放的资源,并且这些资源加上它所持有的资源能满足其请求,系统将这些资源分配给它。缺点是增加了实现复杂性,可能导致进程之前的工作无效。
    • 破坏循环等待:
      • 资源有序分配: 给所有类型的资源规定一个全局的线性顺序编号。进程在请求资源时必须严格按照递增的顺序请求。即一个进程只有在持有编号为 i 的资源时,才能请求编号 j > i 的资源。这样就不会出现进程持有高编号资源去请求低编号资源而形成循环。这是最实用、最常用的预防方法(如锁排序)。
  2. 死锁避免: (在资源分配的每一步进行动态检查,以确保系统永远不会进入不安全状态

    • 核心思想: 系统根据进程的最大需求(进程声明最多需要多少资源)和当前可用资源,判断分配资源后系统是否仍处于安全状态【安全状态:存在一个安全序列(进程执行顺序),使得即使某个进程最大需求全部满足,也能保证所有进程都能顺利完成】。
    • 银行家算法: 最经典的死锁避免算法(针对每种资源类型有多个实例)。当一个进程请求资源时,系统模拟分配资源,然后检查系统是否仍处于安全状态。只有分配后仍是安全状态时才实际分配资源。缺点是要求进程事先声明最大资源需求,进程数量和资源数量固定(或变化不频繁),系统开销较大。
  3. 死锁检测与恢复: (允许死锁发生,但系统能检测到死锁并采取措施解除它

    • 检测算法: 定期(或根据CPU利用率下降等触发)运行算法,检测系统中是否存在循环等待链(构造资源分配图并检测环)。需要维护进程和资源的占用/等待关系信息。
    • 恢复机制(解除死锁):
      • 进程终止:
        • 终止所有死锁进程: 简单粗暴,代价高。
        • 按优先级/代价终止: 一次终止一个死锁进程(选代价最小的),释放其资源,直到死锁解除。
      • 资源抢占: 从某些死锁进程中强行抢占资源分配给其他进程。
        • 需要选择牺牲进程(根据优先级、运行时间、所需资源量等)。
        • 回退: 将牺牲进程回退到某个安全的检查点,再重新启动。需要系统支持检查点机制。
        • 饥饿: 需要确保同一进程不会总是被选为牺牲品。
  4. 鸵鸟策略: 忽略死锁问题,假装死锁永远不会发生。适用于死锁发生概率极低或解决死锁代价过高(超预期)的系统(早期Windows、Unix内核通常采用此策略)。

总结:

方法 思路 优点 缺点 适用场景
死锁预防 破坏必要条件之一 简单,从根本上杜绝死锁 限制并发性,资源利用率低,实现约束多 对安全性要求极高的系统
(常用:资源有序分配) (尤其是资源有序分配) (资源有序分配相对易实现)
死锁避免 动态检查分配的安全性 允许更灵活的资源请求 进程需声明最大需求,开销大,适用性受限 特定资源类型(如银行家算法)
(如银行家算法)
死锁检测与恢复 允许死锁发生但能检测并解除 资源利用率高,对进程约束少 检测开销,恢复复杂(回滚、丢失工作),可能造成饥饿 死锁不频繁但后果可接受的系统
鸵鸟策略 忽略 零开销 发生死锁时系统可能崩溃或挂起 死锁概率极低或代价过高的系统

实际开发中的建议(针对程序员):

理解死锁的原因和必要条件,并在设计和编码时应用预防策略(尤其是锁排序)是避免死锁的关键。根据系统要求和特性选择合适的死锁处理策略也很重要。

无功补偿故障原因解决方法

无功补偿故障可能由多种原因引起,以下是一些常见的故障原因及其解决方法:

2025-01-29 14:25:00

接地网阻值偏大的原因解决方法

 地网接地电阻测试仪是保障电气设备安全运行的重要组成部分,但在实际使用中,我们可能会遇到接地网阻值偏大的情况。接下来,鸿蒙小小编介绍造成这种情况的原因,并提供一些解决方法。   1、接地体积不足

2024-06-17 09:19:49

PCB焊盘脱落的原因解决方法

PCB焊盘脱落的原因及解决方法? PCB(印刷电路板)焊盘的脱落是一个常见的问题,它会导致电子设备无法正常工作。本文将详细介绍焊盘脱落的原因以及

2024-01-18 11:21:51

电感啸叫的常见原因以及解决方法

电子发烧友网站提供《电感啸叫的常见原因以及解决方法.docx》资料免费下载

资料下载 gujingdz 2023-10-15 11:03:15

电感啸叫的原因解决方法剖析

环形电感或工形电感啸叫问题,在稳压电源电路的设计经常遇到,根据稳压电源芯片的不同和外围电路的不同,解决方法也各不相同,本文档的宗旨是分析电感啸叫的根本原因,并综合各种不同的

资料下载 h1708587244.0670 2022-02-11 11:05:03

稀疏投影CT重建图像的条形伪影解决方法

稀疏投影CT重建图像的条形伪影解决方法

资料下载 佚名 2021-06-18 11:43:05

压力变送器输出过大可能的原因解决方法资料下载

电子发烧友网为你提供压力变送器输出过大可能的原因和解决方法资料下载的电子资料下载,更有其他相关的电路图、源代码、课件教程、中文资料、英文资料、参考设计、用户指南、解决方案等资料,希望可以帮助到广大的电子工程师们。

资料下载 王兰 2021-04-05 08:46:48

PCB工艺中底片变形原因解决方法资料下载

电子发烧友网为你提供PCB工艺中底片变形原因与解决方法资料下载的电子资料下载,更有其他相关的电路图、源代码、课件教程、中文资料、英文资料、参考设计、用户指南、解决方案等资料,希望可以帮助到广大的电子工程师们。

资料下载 欲望都市 2021-04-03 08:41:36

变频器过热的故障原因解决方法

变频器过热的故障原因和解决方法

2023-10-24 10:09:30

PCBA加工焊点失效的原因解决方法

  一站式PCBA智造厂家今天为大家讲讲PCBA加工焊点失效是什么原因?PCBA加工焊点失效的解决方法。焊点质量是PCBA加工中最重要的一环。焊点质量的可靠性决定了PCBA产品的可靠性和使用寿命

2023-06-25 09:27:49

激光焊接的缺点原因解决方法

焊接缺陷,下面介绍激光焊接的缺点原因及解决方法。 常见的激光焊缝缺点原因及解决方法

2022-08-26 09:25:29

死锁是什么?产生死锁的主要原因有哪些

,就会造成系统死锁。产生死锁的三大主要原因:①系统资源不足②进程运行推进的顺序不合适③资源分配不当

2021-12-22 07:34:42

减速机漏油原因解决方法

减速机漏油是设备使用中常见的故障现象。正确分析和诊断减速机漏油的原因,并针对原因采取有效解决方法,是保证减速机正常运行、延长减速机使用寿命的关键

2021-09-17 14:50:35

串口使用中断模式发现程序有时候会进去死锁状态

用STM32 HAL库,串口使用中断模式,发现程序有时候会进去死锁状态,原因应该是串口在发送过程中,这时候数据又被发送过去了,然后就很容易会死锁

2021-08-13 07:36:11

加湿器不喷雾的原因解决方法

在使用加湿器的过程中发现不喷雾或喷雾小了是什么原因呢?有什么解决方法。

2020-04-04 16:09:00

7天热门专题 换一换
相关标签