当前位置:网站首页>死锁的产生条件和预防处理[通俗易懂]
死锁的产生条件和预防处理[通俗易懂]
2022-07-07 18:44:00 【全栈程序员站长】
大家好,又见面了,我是全栈君。
所谓死锁:是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象。若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。因为资源占用是相互排斥的,当某个进程提出申请资源后,使得有关进程在无外力协助下,永远分配不到必需的资源而无法继续执行。这就产生了一种特殊现象死锁。
尽管进程在执行过程中,可能发生死锁,但死锁的发生也必须具备一定的条件,死锁的发生必须具备下面四个必要条件。
1)相互排斥条件:
指进程对所分配到的资源进行排它性使用,即在一段时间内某资源仅仅由一个进程占用。假设此时还有其他进程请求资源,则请求者仅仅能等待,直至占有资源的进程用毕释放。
2)请求和保持条件:
指进程已经保持至少一个资源。但又提出了新的资源请求,而该资源已被其他进程占有,此时请求进程堵塞,但又对自己已获得的其他资源保持不放。
3)不剥夺条件:
指进程已获得的资源,在未使用完之前,不能被剥夺,仅仅能在使用完时由自己释放。
4)环路等待条件:
指在发生死锁时,必定存在一个进程——资源的环形链。即进程集合{P0,P1,P2,···,Pn}中的P0正在等待一个P1占用的资源。P1正在等待P2占用的资源。……。Pn正在等待已被P0占用的资源。
在系统中已经出现死锁后,应该及时检測到死锁的发生,并採取适当的措施来解除死锁。眼下处理死锁的方法可归结为下面四种:
1) 预防死锁。
这是一种较简单和直观的事先预防的方法。
方法是通过设置某些限制条件。去破坏产生死锁的四个必要条件中的一个或者几个,来预防发生死锁。预防死锁是一种较易实现的方法,已被广泛使用。可是因为所施加的限制条件往往太严格,可能会导致系统资源利用率和系统吞吐量减少。
2) 避免死锁。
该方法相同是属于事先预防的策略。但它并不须事先採取各种限制措施去破坏产生死锁的的四个必要条件,而是在资源的动态分配过程中,用某种方法去防止系统进入不安全状态,从而避免发生死锁。
3)检測死锁。
这样的方法并不须事先採取不论什么限制性措施。也不必检查系统是否已经进入不安全区,此方法同意系统在执行过程中发生死锁。
但可通过系统所设置的检測机构,及时地检測出死锁的发生,并精确地确定与死锁有关的进程和资源。然后採取适当措施,从系统中将已发生的死锁清除掉。
4)解除死锁。
这是与检測死锁相配套的一种措施。当检測到系统中已发生死锁时。须将进程从死锁状态中解脱出来。
经常使用的实施方法是撤销或挂起一些进程,以便回收一些资源,再将这些资源分配给已处于堵塞状态的进程。使之转为就绪状态,以继续执行。
死锁的检測和解除措施,有可能使系统获得较好的资源利用率和吞吐量,但在实现上难度也最大。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/116453.html原文链接:https://javaforall.cn
边栏推荐
- Apifox interface integrated management new artifact
- 开发那些事儿:Go加C.free释放内存,编译报错是什么原因?
- [MySQL - Basic] transactions
- 最新版本的CodeSonar改进了功能安全性,支持MISRA,C ++解析和可视化
- Is embedded system really safe? [how does onespin comprehensively solve the IC integrity problem for the development team]
- POJ 1742 Coins ( 单调队列解法 )「建议收藏」
- 恶魔奶爸 C
- Helix QAC 2020.2 new static test tool maximizes the coverage of standard compliance
- Mrs offline data analysis: process OBS data through Flink job
- 理财产品要怎么选?新手还什么都不懂
猜你喜欢

Optimization cases of complex factor calculation: deep imbalance, buying and selling pressure index, volatility calculation
SQL注入报错注入函数图文详解

Small guide for rapid formation of manipulator (11): standard nomenclature of coordinate system

C语言 整型 和 浮点型 数据在内存中存储详解(内含原码反码补码,大小端存储等详解)

使用高斯Redis实现二级索引

Helix QAC 2020.2 new static test tool maximizes the coverage of standard compliance

Cantata9.0 | new features

H3C s7000/s7500e/10500 series post stack BFD detection configuration method

Apifox interface integrated management new artifact

AADL Inspector 故障树安全分析模块
随机推荐
机械臂速成小指南(十二):逆运动学分析
阿洛的烦恼
Postgresql数据库character varying和character的区别说明
Cantata9.0 | new features
Implement secondary index with Gaussian redis
想杀死某个端口进程,但在服务列表中却找不到,可以之间通过命令行找到这个进程并杀死该进程,减少重启电脑和找到问题根源。
使用高斯Redis实现二级索引
恶魔奶爸 A0 英文零基础的自我提升路
Measure the height of the building
使用枚举实现英文转盲文
【网络原理的概念】
静态测试工具
取两个集合的交集
使用高斯Redis实现二级索引
目标:不排斥 yaml 语法。争取快速上手
Introduction to referer and referer policy
One click deployment of any version of redis
Alibaba cloud award winning experience: how to mount NAS file system through ECS
使用 BR 恢复 Azure Blob Storage 上的备份数据
C语言多角度帮助你深入理解指针(1. 字符指针2. 数组指针和 指针数组 、数组传参和指针传参3. 函数指针4. 函数指针数组5. 指向函数指针数组的指针6. 回调函数)