处理机调度与死锁(三)——死锁

死锁

一、资源问题

1.可重用性资源和消耗性资源

(1)可重用性资源:可供用户重复使用多次的资源
性质:
每一个可重用资源中的单元只能分配给一个进程使用,不允许多个进程共享
进程在使用可重用性资源时,需按照这样的顺序:请求->使用->释放
系统中的每一类可重用资源中的单元数目是相对固定的,进程在运行期间即不能创建也不能删除它。
(2)可消耗性资源:在进程运行期间,由进程动态的消耗和创建
性质:
每一类可消耗资源的单元数目在进程运行期间是不断被变化的;
进程在运行过程中,可以不断地创造可消耗性资源的单元,将它们放入该类资源的缓冲区中,以增加该资源类的单元数目;
进程在运行过程中,可以请求若干个可消耗性资源单元,用于进程自己的消耗,不再将它们返回给该资源类中。

2.可抢占资源和不可抢占资源

(1)可抢占资源
可把系统中的资源分成两类,一类是可抢占资源,指某进程在获得这类资源后,该资源可以被其他进程或系统抢占。
CPU和主存均属于可抢占性资源。对于这类资源是不会引起死锁的。
(2)不可抢占资源
另一类是不可抢占资源,一旦系统把某资源分配给该进后,就不能将它强行收回,只能在进程用完后自行释放。
磁带机、打印机也都属于不可抢占性资源。

二、计算机系统中的死锁

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

例如,系统中有两个进程P1,P2,它们都准备写两个文件F1,F2,这两者都属于可重用而不可抢占性资源。代码:

P1P2
Open(f1, w);Open(f2, w);
Open(f2, w);Open(f1, w);

当P1在打开F1的同时,P2去打开F2,每个进程都占有一个打开的文件,此时就会出现问题。因为当P1试图去打开F2,P2试图去打开F1时,这两个进程都会因文件已被打开而阻塞,谁也无法运行。
在这里插入图片描述

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

在这里插入图片描述
m1,m2,m3是可消耗资源。
如果三个进程间的消息通信,则按下述顺序进行:
P1:… send(p2, m1);receive(p3,m3);…
P2:… send(p3, m2);receive(p1,m1);…
P3:… send(p1, m3);receive(p2,m2);…
三个进程都可以先将消息发送给下一个进程,相应地它们也都能够接收到从上一个进程发来的消息,因此三个进程可以顺利地运行下去,而不会发生死锁。
但若改成三个进程都先执行receive操作,后执行send操作,则这三个进程就会永远阻塞在它们的receive操作上,等待一条永远不会发出的消息,于是发生了死锁。

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

在这里插入图片描述
若按①②③所示顺序推进,则两个进程可顺利完成。
按④所示的顺序推进,则会进入不安全区D内,发生进程死锁。

三、死锁的定义、必要条件和处理方法

1.死锁的定义

因为竞争系统资源,或是进程之间通信不当,通信的顺序不当,或者是相应原因造成的进程之间的永久阻塞现象,称为死锁。
大多情况下是多个进程,但也存在特例:单进程死锁

2.死锁产生的条件

(1)互斥。
(2)请求和保持。进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源已被其他进程占有,此时请求进程被阻塞,但对自己已获得的资源保持不放。
(3)不可抢占。进程已获得的资源在未使用完之前不能被抢占。
(4)循环等待。发生死锁时,必然存在一个进程——资源循环链。如进程{P0,P1,P2,…,Pn}中P0在等待P1占用的资源,P1在等待P2占用的资源,…,Pn在等待被P0占用的资源。
互斥、请求和保持、不可抢占是死锁产生的必要条件而不是充分条件。
进程——资源循环链是前三个条件产生的必然结果。出现环路就一定有死锁。

3.处理死锁的方法

(1)预防死锁。
(2)避免死锁。
(3)检测死锁。
(4)解除死锁。

四、预防死锁

1.间接方法:(禁止前3个条件之一的发生)
(1)互斥:是某些系统资源固有的属性,不能禁止
(2)禁止“保持并等待”条件:要求进程一性地申请其所需的全部资源。若系统中没有足够的资源可分配给它,则进程阻塞
(3)禁止“不剥夺”条件:①若一个进程用了某些系统资源,又申请新的资源,则不能立即分配给它。必须让它首先释放出已占用资源,然后再重新申请;②若一个进程申请的资源被另一个进程占有,OS可以剥夺低优先权进程的资源分配给高优先权的进程(要求此类可剥夺资源的状易于保存和恢复,否则不能剥夺)
2.直接方法:禁止条件4(环路等待)的发生
禁止“环路等待”条件:可以将系统的所有资源按类型不同进行线性排队,并赋予不同的序号。进程对某类资源的申请只能按照序号递增的方式进行。

显然,这些方法是低效的,它们将影响进程执行的速度,甚至阻碍资源的正常分配。

五、避免死锁

1.系统安全状态

指系统能按某种顺序如<P1,P2,…,Pn>(称<P1,P2,…,Pn>为安全序列),来为每个进程分配其所需资源,直至最大需求,使每个进程都可顺序完成,则称系统处于安全状态。若系统不存在这样一个安全序列,则称系统处于不安全状态。

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

为实现银行家算法,每一个新进程在进入系统时,它必须申明在运行过程中,可能需种资源类型的最大单元数目,其数目不应超过系统所拥有的资源总量。当进程请求源时,系统必须首先确定是否有足够的资源分配给该进程。若有,再进一步计算在将些资源分配给进程后,是否会使系统处于不安全状态。如果不会,才将资源分配给它,否则让进程等待。
(1)银行家算法中的数据结构

可利用资源向量Available每一个元素代表一类可利用的资源数目
最大需求矩阵Max定义了系统中n个进程中的每一个进程对m类资源的最大需求
分配矩阵Allocation每一类资源当前分配给每一进程的资源数
需求矩阵Need每一个进程尚需的各类资源数

(2)银行家算法之例

假定系统中有五个进程{P0,P1,P2,P3,P4,P5}和三类资源{A, B, C},各类资源的数量分别为10,5,7,在T0时刻的资源分配情况如下所示:
在这里插入图片描述a. T0时刻的安全性:利用安全性算法对T0时刻的资源分配情况进行分析,可知在T0时刻存在着安全序列{P1,P3,P4,P0,P2},故系统是安全的。
在这里插入图片描述
b. P1请求资源:P1发出请求向量Request1(1,0, 2),系统按银行家算法进行检查:
Request1(1, 0, 2) <= Need1(1, 2, 2);
Request1(1, 0, 2) <= Available1(3, 2, 2);
系统先假定为P1分配资源:
在这里插入图片描述
故可以将P1申请的资源分配给它。
c. P4请求资源:P3发出请求向量Request4(3,3, 0),系统按银行家算法进行检查:
Request4(3, 3, 0) <= Need4(4, 3, 1);
Request4(3, 3, 0) > Available(2, 3, 0);
故让P4等待。

六、死锁的检测与解除

若系统为进程分配资源时不采取任何措施,则应该是提供死锁检测和解除的手段。

1.死锁的检测

(1)资源分配图
在这里插入图片描述
由一组结点N和一组边E所组成的一个对偶G=(N,E)
用圆圈代表一个进程,用方框代表一类资源。由于一种类型的资源可能有多个,用框中的一个点代表一类资源中的一个资源。
进程到资源的有向边叫请求边,表示该进程申请一个单位的该类资源;从资源到进程的边叫分配边,表示该类资源已经有一个资源被分配给了该进程。
(2)死锁定理
通过将资源分配图简化的方法来检测系统处于S状态时是否为死锁状态。简化方法如下:
a. 在资源分配图中,找出一个既不阻塞又非独立的进程 Pi 。(即找出一条有向边与它相连,且该有向边对应资源的申请数量小于等于系统中已有空闲资源数量)。消去它所有的请求边和分配边,使之成为孤立的结点。 ( 图 b
b. 进程 P1 释放资源后,可使P2获得资源而继续运行,直至P2完成,释放出它所占的全部资源。(图 c ) 根据 a 中的方法进行一系列简化后,若能消去图中所有的边,则称该图是可完全简化的。
S为死锁的条件是:当且仅当 S 状态的资源分配图是不可完全简化的。该条件为死锁定理。
在这里插入图片描述

2.死锁的解除

死锁解除的常用方法有:
(1)抢占资源。从一个或多个进程中抢占足够数量的资源,分配给死锁进程,以解除死锁状态。
(2)终止(或撤销)进程。终止(或撤销)系统中的一个或多个死锁进程,直至打破循环环路,使系统从死锁状态中解脱出来。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值