与死锁的有关知识简述

我们先来举例认识一下死锁:

例如,系统中只有一台扫描仪R1和一台刻录机R2。有两个进程P1P2,他们都准备将扫描的文件刻录到CD光盘上,进程P1先请求扫描仪R1并获得成功,进程P2先请求刻录机也获得成功。后来P1又请求CD刻录机,因它已被分配给了P2而阻塞。P2又请求扫描仪,也因被分配给了P1而阻塞。

此时两个进程都被阻塞,双方都希望对方能释放出自己所需要的资源,但它们都因不能获得自己所需要的资源去继续运行,从而无法释放自己占有的资源,并且一直处于这样的僵持状态而形成死锁。

 

一、资源问题

了解死锁之前我们应先了解一下资源的各种不同类型。

1、可重用性资源

顾名思义,是一种可供用户重复使用多次的资源,有如下性质:

1)每一个可重用资源中的单元只能分配给一个进程使用,不允许多个进程共享。

2)进程在使用时,须按照顺序:

请求资源,如果失败,进程将会被阻塞或循环等待。

使用资源;

释放资源。

(3)系统中每一类可重用性资源中的单元数目是相对固定的,进程在运行期间既不能创建也不能删除它。

2、可消耗资源

又称为临时性资源,是在进程运行期间,由进程动态的创建和消耗的,具有如下性质:

(1)每一类可消耗性资源的单元数目在进程运行期间是可以不断变化的,甚至有时可能为0

(2)进程在运行过程中,可以不断的创造可消耗性资源的单元,将它们放入该资源类的缓冲区中,增加该资源类的单元数目。

(3)进程在运行过程中,可以请求若干个可消耗性资源单元,用于自己的消耗,不再将它们返回给该资源类中。

3、可抢占性资源

指某进程在获得这类资源后,该资源可以再被其他进程或系统抢占。

对于这类资源是不会引起死锁的。

4、不可抢占性资源

即一旦系统把某资源分配给该进程后,就不能将它强行收回,只能在进程用完后自行释放。

 

二、死锁的起因

死锁的起因,通常是源于多个进程对资源的争夺,不仅对不可抢占资源进行抢夺时会引起死锁,而且对可消耗资源进行争夺时,也会引起死锁。

1、竞争不可抢占性资源引起死锁

通常系统中所拥有的不可抢占性资源其数量不足以满足多个进程运行的需要,使得进程在运行过程中,会因争夺资源而陷于僵局。

2、竞争可消耗性资源引起死锁

若在进程通信时,进程先执行读数据的操作,就会在等待一条没发出的消息,就可能产生死锁。

3、进程推进顺序不当引起死锁

进程在运行过程中,对资源进行申请和释放的顺序是否合法,也是在系统中是否会产生死锁的一个重要因素。

三、死锁的概念

1、定义

如果一组进程中的每一个进程都在等待仅由该组进程中的其他进程才能引发的事件,那么该进程是死锁的。

2、产生死锁的必要条件

(1)互斥条件:进程对所分配资源进行排它性使用。
2)请求和保持条件:进程已经保持了一个资源,但又提出了新的资源请求,而该资源已经被其他进程占有,此时请求进程被阻塞。
3)不可抢占条件:进程已获得的资源在未使用完之前不能被抢占,只能在进程使用完时自己释放。 
4)循环等待条件:在发生死锁时,必然存在资源的循环链,即进程集合依次循环等待。

四、处理死锁的方法

1、预防死锁

预防死锁的方法,即是通过设置某些限制条件,去破坏产生死锁的四个必要条件中的一个或者几个,以此预防死锁

主要有以下几种方法:

 

1)破坏请求和保持条件

破坏该条件,有一个条件:当一个进程在请求资源时,不能持有不可抢占资源

该保证可通过以下两个协议实现


第一种协议:

该协议规定,所有进程在开始运行之前,必须一次性的申请其在整个运行过程中所需的全部资源,从而破坏上面讲过的“请求”条件。

若有一种资源不能满足进程的要求,那么其他资源也不会分配给该进程,该进程就会等待,破坏了“保持”条件。

该协议的优点是简单、易行且安全,缺点是资源被严重浪费,恶化了资源的利用率,使进程会经常发生饥饿现象。
第二种协议:

允许一个进程只获得初期运行所需要的资源后,便开始运行。进程运行过程中再逐步释放已分配给自己的、且已用毕的全部资源,然后再请求新的所需资源。

 

2)破坏不可抢占条件

该协议中规定,当一个已经保持了某些不可抢占资源的进程,提出了新的资源请求而不能得到满足时,必须释放已经保持的所有资源,待以后需要时再重新申请,从而破坏了“不可抢占”条件。

该方法实现复杂,延长了进程的周转时间,而且也增加了系统开销,降低了系统的吞吐量。

 

3破坏循环等待条件

对系统所有资源类型进行线性排序,并赋予不同的序号并规定每个进程必须按序列号递增的顺序请求资源。

存在问题:各类资源所规定的序号必须相对稳定;作业使用各资源单位顺序可能会和系统规定的不同,造成资源的浪费;限制用户简单、自主的编程。

 

2、避免死锁

除了事先采取某种限制措施,破坏产生死锁的条件,我们也可以,在资源分配过程中,防止系统进入不安全状态,以避免生死锁。

1)系统安全状态

所谓安全状态是指系统能按照某种进程推进顺序为每个进程分配其所需资源,直至满足每个进程对资源的最大需求,使每个进程都可顺利的完成。
需要注意的是:并非所有的不安全状态都必然会转为死锁状态,但系统进入不安全状态后就有可能进入死锁状态。

 

(2)利用银行家算法避免死锁

最有代表性的避免死锁的算法是Dijkstra的银行家算法。

为了实现银行家算法,每一个新进程在进入系统时,必须申明在运行过程中,可能需要每种资源类型的最大单元数目。其数目不应超过系统所拥有的资源总量。若有,保证分配后,不会使系统处于不安全状态,否则,让进程等待。

 

银行家算法的数据结构:

在系统中必须设置这样四个数据结构,分别用来描述系统中可利用资源、所有进程对资源的最大请求、系统中的资源分配,以及所有进程还需要多少资源的情况。
 
1、可利用资源向量Available
2、最大需求矩阵Max
3、分配矩阵Allocation
4、需求矩阵Need


上述三个矩阵间存在下述关系:Need[i,j]=Max[i,j]-Allocation[i,j]


银行家算法:
1.如果Request<=Need,则转向2;否则,出错

2.如果Request<=Available,则转向3,否则等待

3.系统试探把资源分配给进程Pi,并修改数据结构中的值:

Available[j]=Available[j]-Requesti[j];

Allocation[i,j]=Allocation[i,j]+Requesti[j];

Need[i.j]=Need[i,j]-Requesti[j];

4.系统执行安全性算法,检查是否会使系统处于不安全状态


安全性算法:
1. 设置两个向量
 工作向量:Work=Available(表示系统可提供给进程继续运行所需要的各类资源数目)
 Finish:表示系统是否有足够资源分配给进程(True:;False:没有).初始化为False


2. Finish[i]=False&&Need[i,j]<=Work[j]则执行3;否则执行4(i为资源类别)
3. 进程P获得第i类资源,则顺利执行直至完成,并释放资源: Work[j]=Work[j]+Allocation[i,j]; Finish[i]=true;2步。
4. 若所有进程的Finish[i]=true,则表示系统安全;否则,不安全

 

3、死锁的检测

1)允许死锁的发生,但是操作系统会不断监视系统的进展情况,判断死锁是否真的发生
2)一旦死锁真的发生则采取专门的措施,解除死锁并以最小的代价恢复操作系统的运行
死锁检测的时机:
1)当进程由于资源请求不满足而等待时检测死锁——系统开销太大
2)定时检测
3)系统资源利用率下降时检测死锁

 

4、死锁的解除

当检测到系统发生死锁时,就采取相应的措施,将进程从死锁状态中解脱出来。
常用的死锁解除方法是:
1)抢占资源

从一个或多个进程中抢占足够数量的资源,分配给死锁进程,以解除死锁状态。

2)终止或撤销进程

终止或撤销系统中的一个或多个进程,直至打破循环环路,使系统从死锁状态中解脱出来。 终止进程的两个方法:

   终止所有死锁进程:

   即是终止所有的死锁进程,死锁就自然解除了;

   缺点是有些进程可能已经运行了很长时间,以后还会从头再来。

 

       逐个终止进程:

   按照某种顺序,逐个终止进程,直至有足够的资源,以打破循环等待,把系统从死锁状态解脱出来为止。

   缺点是:每终止一个进程,都要检测是否已解除死锁;且要根据各种选择策略来衡量终止哪个进程代价最小。

 

猜你喜欢

转载自blog.csdn.net/baidu_37964071/article/details/80033995
今日推荐