死锁的原因及解决方法
死锁是指在多进程或多线程系统中,两个或多个进程/线程彼此永久阻塞的状态,每个进程/线程都在等待被其他进程/线程占用的资源,且都不释放自己已持有的资源,导致所有相关进程/线程都无法继续推进。
死锁产生的四个必要条件(必须同时满足):
- 互斥: 资源是独占的、排他的。一个资源一次只能被一个进程/线程使用。如果一个进程/线程在请求一个已经被占用的资源,它必须等待。
- 请求保持(持有并等待): 进程/线程在持有至少一个资源的同时,又在请求其他进程/线程持有的资源。
- 不可抢占: 资源不能被强制地从持有它的进程/线程中夺走。资源只能由持有它的进程/线程在使用完毕后自愿释放。
- 循环等待: 存在一个进程/线程-资源的循环等待链。进程/线程 P1 持有资源 R1 并请求资源 R2;进程/线程 P2 持有资源 R2 并请求资源 R3;...;进程/线程 Pn 持有资源 Rn 并请求资源 R1。形成了一个封闭的环形等待链。
解决死锁的方法:
解决死锁的思路主要围绕破坏上述四个必要条件之一,或者允许死锁发生但能检测和恢复。
-
死锁预防: (在系统设计时就确保四个必要条件中至少一个永不成立)
- 破坏互斥: 对于某些类型的资源(如只读文件),允许非互斥访问。但绝大多数资源(如打印机、共享变量、写锁)本质上是互斥的,此方法适用性有限。
- 破坏请求保持:
- 一次性分配: 进程在开始执行前,必须申请它所需要运行期间的全部资源。只有所有资源都可用时才分配给它。缺点是资源利用率低,可能导致进程饥饿(某些资源一直被别的进程占用)。
- 资源预分配: 类似一次性分配,但更早进行。
- 破坏不可抢占: 如果一个进程请求资源失败(该资源被其他进程占用且它在等待其他资源),则强制释放它当前持有的所有资源。如果另一个进程请求这些被释放的资源,并且这些资源加上它所持有的资源能满足其请求,系统将这些资源分配给它。缺点是增加了实现复杂性,可能导致进程之前的工作无效。
- 破坏循环等待:
- 资源有序分配: 给所有类型的资源规定一个全局的线性顺序编号。进程在请求资源时必须严格按照递增的顺序请求。即一个进程只有在持有编号为
i的资源时,才能请求编号j > i的资源。这样就不会出现进程持有高编号资源去请求低编号资源而形成循环。这是最实用、最常用的预防方法(如锁排序)。
- 资源有序分配: 给所有类型的资源规定一个全局的线性顺序编号。进程在请求资源时必须严格按照递增的顺序请求。即一个进程只有在持有编号为
-
死锁避免: (在资源分配的每一步进行动态检查,以确保系统永远不会进入不安全状态)
- 核心思想: 系统根据进程的最大需求(进程声明最多需要多少资源)和当前可用资源,判断分配资源后系统是否仍处于安全状态【安全状态:存在一个安全序列(进程执行顺序),使得即使某个进程最大需求全部满足,也能保证所有进程都能顺利完成】。
- 银行家算法: 最经典的死锁避免算法(针对每种资源类型有多个实例)。当一个进程请求资源时,系统模拟分配资源,然后检查系统是否仍处于安全状态。只有分配后仍是安全状态时才实际分配资源。缺点是要求进程事先声明最大资源需求,进程数量和资源数量固定(或变化不频繁),系统开销较大。
-
死锁检测与恢复: (允许死锁发生,但系统能检测到死锁并采取措施解除它)
- 检测算法: 定期(或根据CPU利用率下降等触发)运行算法,检测系统中是否存在循环等待链(构造资源分配图并检测环)。需要维护进程和资源的占用/等待关系信息。
- 恢复机制(解除死锁):
- 进程终止:
- 终止所有死锁进程: 简单粗暴,代价高。
- 按优先级/代价终止: 一次终止一个死锁进程(选代价最小的),释放其资源,直到死锁解除。
- 资源抢占: 从某些死锁进程中强行抢占资源分配给其他进程。
- 需要选择牺牲进程(根据优先级、运行时间、所需资源量等)。
- 回退: 将牺牲进程回退到某个安全的检查点,再重新启动。需要系统支持检查点机制。
- 饥饿: 需要确保同一进程不会总是被选为牺牲品。
- 进程终止:
-
鸵鸟策略: 忽略死锁问题,假装死锁永远不会发生。适用于死锁发生概率极低或解决死锁代价过高(超预期)的系统(早期Windows、Unix内核通常采用此策略)。
总结:
| 方法 | 思路 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| 死锁预防 | 破坏必要条件之一 | 简单,从根本上杜绝死锁 | 限制并发性,资源利用率低,实现约束多 | 对安全性要求极高的系统 |
| (常用:资源有序分配) | (尤其是资源有序分配) | (资源有序分配相对易实现) | ||
| 死锁避免 | 动态检查分配的安全性 | 允许更灵活的资源请求 | 进程需声明最大需求,开销大,适用性受限 | 特定资源类型(如银行家算法) |
| (如银行家算法) | ||||
| 死锁检测与恢复 | 允许死锁发生但能检测并解除 | 资源利用率高,对进程约束少 | 检测开销,恢复复杂(回滚、丢失工作),可能造成饥饿 | 死锁不频繁但后果可接受的系统 |
| 鸵鸟策略 | 忽略 | 零开销 | 发生死锁时系统可能崩溃或挂起 | 死锁概率极低或代价过高的系统 |
实际开发中的建议(针对程序员):
- 锁排序: 多线程编程时,强制规定获取多个锁的顺序(破坏循环等待),这是最常用且有效的预防手段。
- 锁超时: 尝试获取锁时设置超时(如
tryLock(timeout))。超时后放弃或重试(破坏无限等待,间接缓解死锁)。 - 避免嵌套锁: 尽量避免在持有一个锁的情况下去请求另一个锁。如果必须,务必使用锁排序。
- 减少锁的范围和粒度: 使用更细粒度的锁(如读写锁),降低锁竞争和持有时间。只在绝对必要的地方加锁。
- 使用原子操作: 对于简单的计数器等操作,优先使用原子操作而非锁。
- 静态分析工具: 利用工具检测代码中可能的死锁路径。
- 精心设计资源请求顺序: 在分布式系统或数据库事务设计中,注意操作序列可能引发的死锁风险。
理解死锁的原因和必要条件,并在设计和编码时应用预防策略(尤其是锁排序)是避免死锁的关键。根据系统要求和特性选择合适的死锁处理策略也很重要。
接地网阻值偏大的原因及解决方法
地网接地电阻测试仪是保障电气设备安全运行的重要组成部分,但在实际使用中,我们可能会遇到接地网阻值偏大的情况。接下来,鸿蒙小小编介绍造成这种情况的原因,并提供一些解决方法。 1、接地体积不足
PCB焊盘脱落的原因及解决方法?
PCB焊盘脱落的原因及解决方法? PCB(印刷电路板)焊盘的脱落是一个常见的问题,它会导致电子设备无法正常工作。本文将详细介绍焊盘脱落的原因以及
2024-01-18 11:21:51
电感啸叫的原因及解决方法剖析
环形电感或工形电感啸叫问题,在稳压电源电路的设计经常遇到,根据稳压电源芯片的不同和外围电路的不同,解决方法也各不相同,本文档的宗旨是分析电感啸叫的根本原因,并综合各种不同的
资料下载
h1708587244.0670
2022-02-11 11:05:03
压力变送器输出过大可能的原因和解决方法资料下载
电子发烧友网为你提供压力变送器输出过大可能的原因和解决方法资料下载的电子资料下载,更有其他相关的电路图、源代码、课件教程、中文资料、英文资料、参考设计、用户指南、解决方案等资料,希望可以帮助到广大的电子工程师们。
资料下载
王兰
2021-04-05 08:46:48
PCB工艺中底片变形原因与解决方法资料下载
电子发烧友网为你提供PCB工艺中底片变形原因与解决方法资料下载的电子资料下载,更有其他相关的电路图、源代码、课件教程、中文资料、英文资料、参考设计、用户指南、解决方案等资料,希望可以帮助到广大的电子工程师们。
资料下载
欲望都市
2021-04-03 08:41:36
PCBA加工焊点失效的原因及解决方法
一站式PCBA智造厂家今天为大家讲讲PCBA加工焊点失效是什么原因?PCBA加工焊点失效的解决方法。焊点质量是PCBA加工中最重要的一环。焊点质量的可靠性决定了PCBA产品的可靠性和使用寿命
2023-06-25 09:27:49
减速机漏油原因及解决方法
减速机漏油是设备使用中常见的故障现象。正确分析和诊断减速机漏油的原因,并针对原因采取有效解决方法,是保证减速机正常运行、延长减速机使用寿命的关键
2021-09-17 14:50:35
串口使用中断模式发现程序有时候会进去死锁状态
用STM32 HAL库,串口使用中断模式,发现程序有时候会进去死锁状态,原因应该是串口在发送过程中,这时候数据又被发送过去了,然后就很容易会死锁
换一换
- 如何分清usb-c和type-c的区别
- 中国芯片现状怎样?芯片发展分析
- vga接口接线图及vga接口定义
- 芯片的工作原理是什么?
- 华为harmonyos是什么意思,看懂鸿蒙OS系统!
- 什么是蓝牙?它的主要作用是什么?
- ssd是什么意思
- 汽车电子包含哪些领域?
- TWS蓝牙耳机是什么意思?你真的了解吗
- 什么是单片机?有什么用?
- 升压电路图汇总解析
- plc的工作原理是什么?
- 再次免费公开一肖一吗
- 充电桩一般是如何收费的?有哪些收费标准?
- ADC是什么?高精度ADC是什么意思?
- EDA是什么?有什么作用?
- dtmb信号覆盖城市查询
- 中科院研发成功2nm光刻机
- 苹果手机哪几个支持无线充电的?
- type-c四根线接法图解
- 华为芯片为什么受制于美国?
- 怎样挑选路由器?
- 元宇宙概念股龙头一览
- 锂电池和铅酸电池哪个好?
- 什么是场效应管?它的作用是什么?
- 如何进行编码器的正确接线?接线方法介绍
- 虚短与虚断的概念介绍及区别
- 晶振的作用是什么?
- 大疆无人机的价格贵吗?大约在什么价位?
- 苹果nfc功能怎么复制门禁卡
- 单片机和嵌入式的区别是什么
- amoled屏幕和oled区别
- 复位电路的原理及作用
- BLDC电机技术分析
- dsp是什么意思?有什么作用?
- 苹果无线充电器怎么使用?
- iphone13promax电池容量是多少毫安
- 芯片的组成材料有什么
- 特斯拉充电桩充电是如何收费的?收费标准是什么?
- 直流电机驱动电路及原理图
- 传感器常见类型有哪些?
- 自举电路图
- 通讯隔离作用
- 苹果笔记本macbookpro18款与19款区别
- 新斯的指纹芯片供哪些客户
- 伺服电机是如何进行工作的?它的原理是什么?
- 无人机价钱多少?为什么说无人机烧钱?
- 以太网VPN技术概述
- 手机nfc功能打开好还是关闭好
- 十大公认音质好的无线蓝牙耳机