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

死锁的概念 ⚠️

1. 死锁的定义

死锁:多个进程因循环等待对方占有的资源而陷入的僵局,若无外力干预,进程将永远无法推进。

核心特征

  • 相互等待:每个进程都在等待其他进程释放资源。
  • 不可推进:无外力时,所有进程均阻塞。

生活实例:两座桥两端的汽车互不相让,都占用部分桥面并等待对方后退。
计算机实例:进程P1占用输入设备并请求打印机,进程P2占用打印机并请求输入设备,二者循环等待。


 

2. 死锁与饥饿的区别

对比项

死锁

饥饿

进程数量

至少2个进程(循环等待)。

可仅1个进程(长期得不到资源)。

进程状态

均处于阻塞态(等待资源)。

可处于就绪态(如CPU饥饿)或阻塞态(如I/O饥饿)。

本质原因

循环等待资源(4个必要条件同时满足)。

资源分配策略不公平(如优先级低、短作业优先导致长作业长期等待)。

是否可恢复

需外力干预(如杀死进程、剥夺资源)。

可能自动恢复(如高优先级进程完成,低优先级进程获得资源)。


 

3. 死锁产生的原因

(1)资源竞争
  • 不可剥夺资源(如打印机、磁带机):数量有限,多个进程争夺时易导致死锁。
  • 可剥夺资源(如CPU、内存):不会导致死锁(可强行剥夺)。
(2)进程推进顺序非法
  • 请求/释放资源的顺序不当(如循环请求对方已占资源)。
  • 信号量使用错误(如进程相互等待对方发送消息)。

 

4. 死锁产生的4个必要条件(缺一不可)

  1. 互斥条件:资源只能被一个进程独占(如打印机)。
  2. 不可剥夺条件:资源一旦分配,只能主动释放(不可强行夺走)。
  3. 请求并保持条件:进程占有部分资源,又请求新资源而阻塞,且不释放已占资源。
  4. 循环等待条件:存在进程-资源循环等待链(如P1等待P2的资源,P2等待P1的资源)。

关键:破坏任一条件即可预防死锁。


 

5. 死锁的处理策略

策略

核心思想

优点

缺点

死锁预防

破坏4个必要条件之一(如资源预分配、可剥夺资源)。

实现简单,系统不会发生死锁。

资源利用率低,限制进程灵活性(如预分配导致资源浪费)。

死锁避免

动态检查资源分配安全性,避免进入“不安全状态”(如银行家算法)。

资源利用率较高,允许动态分配。

实现复杂(需实时计算安全性),仅适用于可预测资源需求的场景。

死锁检测与解除

允许死锁发生,通过检测算法发现死锁,再通过撤销进程或剥夺资源解除

资源利用率最高,限制最少。

检测和解除死锁需额外开销,可能导致部分进程被强行终止。


核心考点 📌

  1. 死锁的4个必要条件:互斥、不可剥夺、请求并保持、循环等待(需能举例区分)。
  2. 死锁与饥饿的差异:死锁是循环等待(多进程阻塞),饥饿是长期等待(单进程可能就绪)。
  3. 死锁处理策略的对比:预防(破坏条件)、避免(安全检查)、检测解除(允许发生后处理)。  

总结 

       死锁是指多个进程因循环等待资源而陷入僵局,其四大必要条件为互斥、不可剥夺、请求并保持、循环等待。与饥饿不同,死锁涉及多进程相互阻塞,而饥饿是单进程长期得不到资源。死锁处理策略包括预防(破坏条件)、避免(银行家算法)及检测解除(事后恢复),需权衡资源利用率与系统开销。核心在于理解死锁的本质及应对方法的适用场景。    

一句话记忆:死锁是“循环等待资源”的僵局,需4个条件同时满足;处理策略从“预防(破坏条件)”“避免(安全分配)”到“检测解除(事后处理)”,平衡资源利用率与系统复杂度! ✨

 

http://www.dtcms.com/a/275459.html

相关文章:

  • 告别频繁登录!Nuxt3 + TypeScript + Vue3实战:双Token无感刷新方案全解析
  • TinyBERT:知识蒸馏驱动的BERT压缩革命 | 模型小7倍、推理快9倍的轻量化引擎
  • python-for循环
  • 【Elasticsearch】昂贵算法与廉价算法
  • UI前端大数据可视化实战策略分享:如何设计符合用户认知的数据可视化流程?
  • 让 VSCode 调试器像 PyCharm 一样显示 Tensor Shape、变量形状、变量长度、维度信息
  • 「日拱一码」025 机器学习——评价指标
  • Android音视频探索之旅 | C++层使用OpenGL ES实现音频渲染
  • 单片机学习笔记.根据芯片数据手册写驱动程序(这里使用的是普中开发版,以DS1302为例)
  • 创建Spring Boot项目
  • 解决‘vue‘ 不是内部或外部命令,也不是可运行的程序
  • 前端开发的「设计鸿沟」:为什么我学了CSS却做不出好看的网页?
  • 用YOLOv5系列教程(1)-用YOLOv5轻松实现设备状态智能监控!工业级教程来了
  • 【工具】什么软件识别重复数字?
  • C++结构体的定义与使用
  • 机器学习(ML)、深度学习(DL)、强化学习(RL)关系和区别
  • Redis 基本操作笔记
  • 关于wpf的自适应
  • 基于 Redisson 实现分布式系统下的接口限流
  • [特殊字符] 深入掌握 dsquery:Active Directory 高效查询与安全运维指南
  • sqli-labs靶场通关笔记:第7-8关 布尔盲注
  • Gemini CLI 代理问题解决[API Error: exception TypeError: fetch failed sending request]
  • 【Linux-云原生-笔记】数据库操作基础
  • 【机器学习|学习笔记】详解决策树CART算法,并对比ID3 C4.5和CART算法
  • 系统分析师-计算机系统-计算机系统概述存储系统
  • 内网穿透系列九:开源的网络穿透与组网工具 EasyTier,支持多种数据传输通道,去中心化,兼具高效与安全
  • 【Java八股文总结 — 包学会】(二)计算机网络
  • PyTorch的计算图是什么?为什么绘图前要detach?
  • 【设计模式】单例模式 饿汉式单例与懒汉式单例
  • 人工智能自动化编程:传统软件开发vs AI驱动开发对比分析