发布时间:2024-12-16 18:01
概念来说就是在两个或者多个并发进程中,如果每个进程持有某种资源而又等待其它进程释放它或它们现在保持着的资源,在未改变这种状态之前都不能向前推进,称这一组进程产生了死锁。通俗的讲,就是两个或多个进程无限期的阻塞、相互等待的一种状态。
举一个很详细的例子
2个人一起吃饭但是只有一双筷子,2人轮流吃(同时拥有2只筷子才能吃)。某一个时候,一个拿了左筷子,一人拿了右筷子,2个人都同时占用一个资源,等待另一个资源,这个时候甲在等待乙吃完并释放它占有的筷子,同理,乙也在等待甲吃完并释放它占有的筷子,这样就陷入了一个死循环,谁也无法继续吃饭。。。
参与死锁的进程数至少为两个
参与死锁的所有进程均等待资源
参与死锁的进程至少有两个已经占有资源
死锁进程是系统中当前进程集合的一个子集
死锁会浪费大量系统资源,甚至导致系统崩溃。
饥饿(Starvation)指一个进程一直得不到资源。
死锁和饥饿都是由于进程竞争资源而引起的。饥饿一般不占有资源,死锁进程一定占有资源。
比如俩个线程对俩个资源产生了死锁, 而第三个线程想要这俩个资源其中的一个, 那么这时第三个线程就是饥饿状态
又称临时性资源,是由进程在运行期间动态的创建和消耗的。
消耗性资源在进程运行期间是可以不断变化的,有时可能为0。
可消耗资源通常是由生产者进程创建,由消费者进程消耗。最典型的可消耗资源是用于进程间通信的消息。
可抢占资源指某进程在获得这类资源后,该资源可以再被其他进程或系统抢占。对于这类资源是不会引起死锁的。也可以抽象理解为无限制的资源, 不会因为这个资源发生死锁
CPU 和主存均属于可抢占性资源。
一旦系统把某资源分配给该进程后,就不能将它强行收回,只能在进程用完后自行释放。
这也是死锁产生的一个重要原因
磁带机、打印机等属于不可抢占性资源。
[](()死锁的产生原因
通常系统中拥有的不可抢占资源,其数量不足以满足多个进程运行的需要,使得进程在运行过程中,会因争夺资源而陷入僵局,如磁带机、打印机等。只有对不可抢占资源的竞争 才可能产生死锁,对可抢占资源的竞争是不会引起死锁的。
系统中拥有三个进程P1、P2和P3,m1、m2、m3是3可消耗资源。进程P1一方面产生消息m1,将其发送给P2,另一方面要从P3接收消息m3。而进程P2一方面产生消息m2,将其发送给P3,另一方面要从P1接收消息m1。类似的,进程P3一方面产生消息m3,将其发送给P1,另一方面要从P2接收消息m2。
如果三个进程都先发送自己产生的消息后接收别人发来的消息,则可以顺利的运行下去不会产生死锁,但要是三个进程都先接收别人的消息而不产生消息则会永远等待下去,产生死锁。
[](()产生死锁的四个必要条件
以上这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之一不满足,就不会发生死锁。
[](()死锁的预防
就是在系统里取消互斥。若资源不被一个进程独占使用,那么死锁是肯定不会发生的。但一般来说在所列的四个条件中,“互斥”条件是无法破坏的。因此,在死锁预防里主要是破坏其他几个必要条件,而不去涉及破坏“互斥”条件。
注意:互斥条件不能被破坏,否则会造成结果的不可再现性。
破坏“占有并等待”条件,就是在系统中不允许进程在已获得某种资源的情况下,申请其他资源。即要想出一个办法,阻止进程在持有资源的同时申请其他资源。
方法一:创建进程时,要求它申请所需的全部资源,系统或满足其所有要求,或什么也不给它。这是所谓的 “ 一次性分配”方案。
LeetCode 题解 | 1. 两数之和 Javascript 版
干货!Labeling Trick: 一个图神经网络多节点表示学习理论
Python当我在 IDLE中执行时是200,但是在Terminal中执行时是404
机器学习相关笔记__数学知识扩展(内容杂且多,部分总结较浅)
[ROC-RK3568-PC] [Firefly-Android] 10min带你了解ADC的使用
2022-06-07 工作记录--Git-查看远程仓库 + 添加远程仓库 + 删除远程仓库
实时降噪(Real-time Denoising):Nvidia Real-time Denoisers 源码剖析