当前位置: 首页 > ops >正文

(操作系统)死锁是什么 必要条件 解决方式

一、什么是死锁?

死锁(Deadlock) 是指两个或多个进程(或线程)在执行过程中,因争夺资源而造成一种相互等待的现象。
如果没有外力作用,它们将永远陷入等待,程序无法继续执行。

👉 简单来说:大家都在等别人先释放资源,结果谁也不释放,形成无限等待。


二、死锁产生的必要条件

根据操作系统理论,死锁产生必须同时满足以下四个条件

  1. 互斥条件

    • 资源在同一时间只能被一个进程占用。

    • 例如:一张数据库记录只能被一个事务持有锁。

  2. 占有且等待条件

    • 进程已经持有至少一个资源,同时还在等待其他资源。

    • 例如:线程 A 已经拿到了订单表的锁,还在等待库存表的锁。

  3. 不可剥夺条件

    • 已经获得的资源,不能被强行剥夺,只能主动释放。

  4. 循环等待条件

    • 存在一个进程—资源的环形等待链。

    • 例如:线程 A 等待 B 的资源,线程 B 等待 A 的资源,形成闭环。

⚠️ 死锁发生的必要条件是四个条件同时满足,如果破坏掉其中一个条件,就能避免死锁。


三、业务场景举例

📍 电商下单场景

  • 线程 A:先锁定订单表 → 再等待库存表。

  • 线程 B:先锁定库存表 → 再等待订单表。
    结果:两个线程互相等待对方释放锁 → 死锁。


四、死锁的解决方式

  1. 预防死锁(避免四个条件之一)

    • 破坏“循环等待”:规定所有线程必须按照统一的顺序申请资源,例如必须先锁库存表,再锁订单表。

    • 破坏“占有且等待”:要求进程一次性申请所需资源。

    • 破坏“不可剥夺”:如果申请不到资源,就主动释放已持有的资源。

  2. 避免死锁(动态检测)

    • 通过算法(如银行家算法)在分配资源前进行检测,确保系统不会进入不安全状态。

  3. 检测并解除死锁

    • 定期检测是否存在环形等待。

    • 一旦检测到死锁,选择“牺牲者”进程强制中止,释放资源。

  4. 实际工程手段

    • 加锁顺序一致:所有业务代码按统一顺序获取锁。

    • 锁超时机制:等待超时自动回滚,释放资源。

    • 乐观锁(版本号机制):避免长时间持有锁。


五、总结

  • 死锁是并发编程中常见的棘手问题,必须理解其 四个必要条件

  • 解决死锁的核心思想是 破坏死锁条件避免环形等待

  • 在实际业务中,更常用的是 加锁顺序统一、加锁超时、乐观锁 等工程化手段。

http://www.xdnf.cn/news/18646.html

相关文章:

  • 【Task05】:向量数据库实践(第三章3、4节)
  • Fory序列化与反序列化
  • ArcGIS JSAPI 高级教程 - 创建渐变色材质的自定义几何体
  • MYSQL(DDL)
  • 算法:驱动智能社会的核心引擎
  • OpenIM应用机器人自动应答
  • Zabbix 7.0中文乱码矫正
  • AI产品经理面试宝典第75天:Agentic RAG系统优化策略面试题实战解析
  • 08-系统能力调用与权限管理
  • BERT(Bidirectional Encoder Representations from Transformers)模型详解
  • 【RAGFlow代码详解-1】概述
  • 【Android】从一个AndroidRuntime看类的加载
  • 结构化智能编程:用树形向量存储重构AI代码理解范式
  • 第16届蓝桥杯C++中高级选拔赛(STEMA)2025年4月真题
  • More Effective C++ 条款05: 谨慎定义类型转换函数
  • 【Flex SerialPort】一个基于Qt6的支持自定义按键指令的串口工具
  • Kubernetes保姆级教学
  • centos搭建gitlab服务器
  • 【贪心算法】day2
  • 邮箱创建时间打标与自动删除功能设计思路
  • 13种常见机器学习算法面试总结(含问题与优质回答)
  • MySQL视图有什么用?一文读懂虚拟表的六大核心价值
  • String的最大长度剖析
  • 港口集装箱编号识别误识率↓79%!陌讯多模态融合算法落地优化
  • docker 镜像问题(解决了)
  • 第二重境:视角切换——用心灵的望远镜,看见问题的全局
  • 基于 Redis + JWT 的跨系统身份共享方案
  • Vue2+Vue3前端开发笔记合集
  • 【运维进阶】case、for、while、until语句大合集
  • VSCode+Qt+CMake详细地讲解