死锁
死锁:指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。
类似于马路上多条道路堵死,若没有交警协助或者凭空消失车辆,将无法在行驶

产生的原因:
-
竞争不可抢占性资源
p1已经打开F1,想去打开F2,p2已经打开F2,想去打开F1,但是F1和F2都是不可抢占的,这是发生死锁。 -
竞争可消耗资源引起死锁
进程间通信,如果顺序不当,会产生死锁,比如p1发消息m1给p2,p1接收p3的消息m3,p2接收p1的m1,发m2给p3,p3,以此类推,如果进程之间是先发信息的那么可以完成通信,但是如果是先接收信息就会产生死锁。 -
进程推进顺序不当
进程在运行过程中,请求和释放资源的顺序不当,也同样会导致产生进程死锁。
产生死锁的必要条件
产生死锁必须同时具备以下四个必要条件,如果一条不成立,那么死锁就不会发生
- 互斥条件:资源是独占的且排他使用,进程互斥使用资源,即任意时刻一个资源只能给一个进程使用,其他进程若申请一个资源,而该资源被另一进程占有时,则申请者等待直到资源被进程用完释放。
- 请求和保持条件:进程已经占有了至少一个资源,但又提出了新的资源请求,而该被请求的资源已被其他进程占有,此时请求进程被阻塞,同时期他对自己已占有的资源保持不放
- 不可抢夺条件:进程所获得的资源在未使用完毕之前,不能被其他进程强行剥夺,而只能由获得该资源的进程资源释放。
- 循环等待条件:在发生死锁时,必然存在一个“进程-资源”循环链,即进程等待队列{P1,P2,…,Pn},其中P1等待P2占有的资源,P2等待P3占有的资源…Pn等待P1占有的资源,环链路中每一个进程所占有的资源同时被另一个申请,也就是前一个进程占有后一个进程所申请的资源。
死锁的处理
处理死锁一般有三种主要策略
- 采用某个个协议来与发放或避免死锁,确保系统永远不会进入死锁状态
- 允许系统进入死锁状态,但会检测到他然后恢复
- 完全忽略这个问题,并假设系统永远不会出现死锁
策略实现的方法:
- 预防死锁:最简单直接,就是通过破坏死锁四个必要条件之一,来防止死锁产生;
- 避免死锁:在资源的动态分配过程中,用某种方法防止系统进入不安全状态,从而避免发生死锁;
- 检测死锁:允许进程在运行过程中发生死锁,但是可以通过检测机构及时检测出死锁,然后通过合适的措施,把进程从死锁过程中解脱出来;
- 解除死锁:当检测系统中已经发生死锁时,就采用相应措施,将进程从死锁状态中解脱出来。通常采用的措施是撤销一些进程,回收他们的资源,将回收的资源分配给已处于阻塞状态的进程,是这些进程能够进行运行
死锁的预防
-
破坏“请求和保持”条件
让进程不要那么贪心,自己已经有了资源就不要去竞争那些不可抢占的资源。- 一种方法是:让进程在申请资源时,一次性申请所有需要用到的资源,不要一次一次来申请,当申请的资源有一些没空,那就让线程等待。
- 不过这个方法比较浪费资源,进程可能经常处于饥饿状态。
- 并且严重的降低了资源的利用率
- 另一种方法是,要求进程在申请资源前,要释放自己拥有的资源。
- 一种方法是:让进程在申请资源时,一次性申请所有需要用到的资源,不要一次一次来申请,当申请的资源有一些没空,那就让线程等待。
-
破坏“不可抢占”条件
允许进程进行抢占- 如果去抢资源,被拒绝,就释放自己的资源。
- 操作系统允许抢,只要你优先级大,可以抢到。
-
破坏“循环等待”条件
将系统中的所有资源统一编号,进程可在任何时刻提出资源申请,但所有申请必须按照资源的编号顺序(升序)提出- 缺点:
- 为系统中各类资源规定的序号必须相对稳定,限制了新类型设备的增加
- 景观在为资源的类型分配序号时已经考虑到大多数作业在实际使用这些资源时的顺序,但也经常会发生作业使用各类资源的顺序与系统规定的顺序不同,造成对资源的浪费
- 为了方便用户,系统对用户在编程时所施加的限制条件应尽量少,然而这种按规定次序申请资源的方法必然会限制用户进行简单、自主的编程
- 缺点:
死锁的检测
死锁定理
可以通过将资源分配图简化的方法来检测系统所处的某状态(命名为S状态)是否为死锁状态。简化方法如下:

-
在资源分配图中,找出既不阻塞又不是孤点的进程P1(即找出一条有向边与它相连,且该有向边对应资源的申请数量小于等于系统中已有空闲资源数量。若所有的连接该进程的边均满足上述条件,则这个进程能继续运行直至完成,然后释放它所占有的所有资源)。消去它所有的请求边和分配边,使之成为孤立的结点。在图中(a)中,P1是满足这一条件的进程结点,将P1的所有边消去,便得到图中(b)所示的情况。
-
进程P1所释放的资源后,便可使得P获得资源而继续运行,直至P2完成后释放它所占有的全部资源,形成图中©
-
进行一系列简化后,若能消去图中所有的边,则称该图是可完全简化的,如图中©所示。
因此S为死锁的充分必要条件是:当且仅当S状态的资源分配图是不可完全简化的,该条件为死锁定理。
死锁的解除
终止死锁进程的方法
- 抢占资源:从一个或多个进程中抢占足够数量的资源分配给死锁进程,以解除死锁状态。
- 终止(或撤销)进程:终止或撤销系统中的一个或多个死锁进程,直至打破死锁状态。
- 终止所有的死锁进程:这种方式简单粗暴,但是代价很大,很有可能会导致一些已经运行了很久的进程功亏一篑。
- 逐个终止进程:直至死锁状态解除。该方法的代价也很大,因为每终止一个进程就需要使用死锁检测来检测系统当前是否处于死锁状态。另外,每次终止进程的时候终止那个进程呢?每次都应该采用最优策略来选择一个“代价最小”的进程来解除死锁状态。
- 一般根据如下几个方面来决定终止哪个进程:
- 进程的优先级
- 进程已运行时间以及运行完成还需要的时间
- 进程已占用系统资源以及进程运行完成还需要的资源
- 终止进程数目
- 进程的性质是交互式还是批处理式
- 一般根据如下几个方面来决定终止哪个进程:
本文详细探讨了操作系统中的死锁问题,包括死锁的定义、产生条件及四种必要条件,以及如何通过预防、检测和解除死锁的策略来避免系统陷入死锁状态。介绍了破坏死锁条件的方法,如一次性申请所有资源、允许抢占和规定资源申请顺序,以及死锁定理和解除死锁的策略,如终止或抢占资源。
1547

被折叠的 条评论
为什么被折叠?



