首页 > 编程知识 正文

什么是死锁定理,发生死锁的必要条件是什么

时间:2023-05-06 00:50:44 阅读:176861 作者:4296

多线程和多进程概述可以提高系统资源的利用率,提高系统的处理能力。 但是,同时执行带来了新的问题——死锁。 死锁是指两个或多个进程(线程)在运行过程中争夺资源所导致的僵局。如果没有外力,这些进程(线程)将无法前进。

通过几个例子说明死锁现象。

首先来看看生活的一个例子。 两个人一起吃饭,但只有一根筷子。 两个人轮流吃(必须同时拿两根筷子才能吃)。 一次,一个人拿着左边的筷子,一个人拿着右边的筷子,两个人都同时占有一个资源,等待另一个资源。 此时,甲方正在等待乙方吃完,释放占有的筷子。 同样,乙方也在等待甲方吃完,释放占有的筷子。 这样的话,就会陷入死亡循环,谁也不能继续吃饭。

计算机系统也有同样的情况。 例如,在一个计算机系统中只有一台打印机和输入设备,进程P1占用输入设备,同时要求使用打印机,但此时打印机被进程P2占用,P2在释放打印机之前被P1占用这样,两个进程相互继续等待,任何一个都无法继续执行,陷入死锁状态。

关于死锁的几个结论:

3358 www.Sina.com/http://www.Sina.com/http://www.Sina.com/3358 www.Sina.com/1,死锁

死锁和饥饿是由进程的竞争资源引起的。 一般来说,饥饿不占用资源,死锁过程一定会占用资源。

2、死锁的发生原因1、由于竞争的不可优先资源导致的死锁:通常系统中有不可优先的资源,其数量不足以满足多个进程运行的需要。 因此,在执行过程中,进程因争夺磁带机、打印机等资源而陷入僵局。 只有对可抢占资源的竞争才可能发生死锁,对可抢占资源的竞争不会发生死锁。 2、竞争消耗资源导致死锁3、进程推进顺序不当导致死锁:在进程运行过程中,如果请求和释放资源的顺序不当,同样会发生死锁。 例如,并发进程P1、P2各自持有资源R1、R2,但进程P1申请资源R2,进程P2申请资源R1后,两者都将被所需的资源占用并屏蔽。 如果弄错信号量的使用方法,也会导致死锁。 因为进程之间在等待来自彼此的信息,所以最终无法在这些进程之间前进。 例如,进程a等待来自进程b的消息,进程b等待来自进程a的消息。 可知进程a和b不是在竞争同一资源,而是因为在等待对方的资源而陷入死锁。 3 .产生死锁的四个必备条件互斥条件:进程要求互斥地控制分配的资源,如打印机。 也就是说,某个资源在一定期间内只有一个进程被占用。 如果此时另一个进程请求资源,则请求进程只能等待。

5.2不可剥夺条件:进程获得的资源在未使用完毕之前不得被其他进程强制剥夺。 也就是说,获得该资源的进程自身只能释放。 只能自主释放。

5.3请求和保留条件:进程至少已拥有一个资源,但如果提出新的资源请求,且资源已被其他进程占用,则请求进程被阻止,但对自己获得的资源却置之不理。

5.4循环等待条件:存在进程资源循环等待链,链中每个进程获得的资源同时被链中下一个进程请求。 即,存在处于等待状态的进程的集合{Pl、P2、…、Pn},其中Pi等等待资源被p(I1 )占用) I=0、1、…、n-1 )、pn等等待资源由P0 如图2-15所示。

直观上,循环等待条件看起来和死锁的定义一样,但其实不然。 死锁定义要求配置等待环路所要求的条件更严格,Pi等待的资源必须由p(I1 )来满足,但循环等待条件没有这种限制。 例如,系统中有2台输出机器,P0占用1台,PK占用另1台,并且k不属于集合{ 0,1,…,n}。

Pn正在等待输出设备。 它可以从P0获得,也可以从PK获得。 因此,如图2-16所示,Pn、P0和其他一些过程形成循环等待环,而PK不在热心的八宝粥中。 PK释放输出设备时,可以打破循环等待。 因此,循环等待是死锁的必要条件。 在这里写照片的说明

资源分配图中有圆圈,系统不一定会发生死锁的原因是同类资源的数量大于1。 但是,如果系统中每种类型的资源只有一个资源,则资源分配图中标有圆圈是系统发生死锁的充分必要条件。 这4个条件是死锁的必要条件,只要系统不发生死锁,这些条件必然成立,只要不满足上述条件的任一个,就不会发生死锁。

4 .死锁的处理方法死锁的预防:为了防止死锁的发生,设置破坏发生死锁的4个必要条件中的1个或几个的限制条件。 避免死锁:在资源动态分配过程中,通过某种方式防止系统进入不安全状态,从而避免死锁的发生。 死锁检测:允许在系统运行过程中发生死锁,但可以设置检测机制及时检测并采取相应措施清除死锁的发生。 解除死锁:检测到死锁后,采取适当的措施使进程从死锁状态中释放出来。 防止死锁破坏“互斥”条件:是在系统中解除互斥。 如果资源未被进程独占使用,则不会发生死锁。 但是,在普遍列举的四个条件中,“互斥”的条件是不可破坏的。 因此,死锁预防中主要是破坏其他几个必要条件,不参与

破坏“互斥”条件。

注意:互斥条件不能被破坏,否则会造成结果的不可再现性。

破坏“占有并等待”条件:

破坏“占有并等待”条件,就是在系统中不允许进程在已获得某种资源的情况下,申请其他资源。即要想出一个办法,阻止进程在持有资源的同时申请其他资源。
方法一:创建进程时,要求它申请所需的全部资源,系统或满足其所有要求,或什么也不给它。这是所谓的 “ 一次性分配”方案。
方法二:要求每个进程提出新的资源申请前,释放它所占有的资源。这样,一个进程在需要资源S时,须先把它先前占有的资源R释放掉,然后才能提出对S的申请,即使它可能很快又要用到资源R。

破坏“不可抢占”条件:

破坏“不可抢占”条件就是允许对资源实行抢夺。
方法一:如果占有某些资源的一个进程进行进一步资源请求被拒绝,则该进程必须释放它最初占有的资源,如果有必要,可再次请求这些资源和另外的资源。
方法二:如果一个进程请求当前被另一个进程占有的一个资源,则操作系统可以抢占另一个进程,要求它释放资源。只有在任意两个进程的优先级都不相同的条件下,方法二才能预防死锁。

破坏“循环等待”条件:

破坏“循环等待”条件的一种方法,是将系统中的所有资源统一编号,进程可在任何时刻提出资源申请,但所有申请必须按照资源的编号顺序(升序)提出。这样做就能保证系统不出现死锁。

避免死锁

理解了死锁的原因,尤其是产生死锁的四个必要条件,就可以最大可能地避免、预防和解除死锁。所以,在系统设计、进程调度等方面注意如何让这四个必要条件不成立,如何确定资源的合理分配算法,避免进程永久占据系统资源。此外,也要防止进程在处于等待状态的情况下占用资源。因此,对资源的分配要给予合理的规划。

预防死锁和避免死锁的区别:
预防死锁是设法至少破坏产生死锁的四个必要条件之一,严格的防止死锁的出现,而避免死锁则不那么严格的限制产生死锁的必要条件的存在,因为即使死锁的必要条件存在,也不一定发生死锁。避免死锁是在系统运行过程中注意避免死锁的最终发生。

常用避免死锁的方法

有序资源分配法

这种算法资源按某种规则系统中的所有资源统一编号(例如打印机为1、磁带机为2、磁盘为3、等等),申请时必须以上升的次序。系统要求申请进程:
1、对它所必须使用的而且属于同一类的所有资源,必须一次申请完;
2、在申请不同类资源时,必须按各类设备的编号依次申请。例如:进程PA,使用资源的顺序是R1,R2; 进程PB,使用资源的顺序是R2,R1;若采用动态分配有可能形成环路条件,造成死锁。
采用有序资源分配法:R1的编号为1,R2的编号为2;
PA:申请次序应是:R1,R2
PB:申请次序应是:R1,R2
这样就破坏了环路条件,避免了死锁的发生。

银行家算法

常用避免死锁的技术

加锁顺序(线程按照一定的顺序加锁)加锁时限(线程尝试获取锁的时候加上一定的时限,超过时限则放弃对该锁的请求,并释放自己占有的锁)死锁检测解除死锁

一旦检测出死锁,就应立即釆取相应的措施,以解除死锁。
死锁解除的主要方法有:
1) 资源剥夺法。挂起某些死锁进程,并抢占它的资源,将这些资源分配给其他的死锁进程。但应防止被挂起的进程长时间得不到资源,而处于资源匮乏的状态。
2) 撤销进程法。强制撤销部分、甚至全部死锁进程并剥夺这些进程的资源。撤销的原则可以按进程优先级和撤销进程代价的高低进行。
3) 进程回退法。让一(多)个进程回退到足以回避死锁的地步,进程回退时自愿释放资源而不是被剥夺。要求系统保持进程的历史信息,设置还原点。

文章参考:https://blog.csdn.net/wljliujuan/article/details/79614019

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。