死锁及其必要条件

1.简介

在计算机系统中会出现很多一次只能由一个进程使用的资源,比如打印机,磁带机等,在多道程序设计中,若干进程要共享这类的资源,而且一个进程所需要的不止一个,这样,就会出现若干个进程竞争优先有限资源,由于推进顺序不当,就会曹成无限期的循环等待的局面,这种状态就是死锁。

2.什么是死锁?

所谓死锁,是指多个进程在运行过程中因竞争资源而需要循环等待对方释放资源的一种僵局。互相等待对方释放资源,结果都没有释放资源,导致了无限期的等待,如果没有外力作用,这些进程都无法推进。产生死锁的根本原因就是资源有限且操作不当。

有以下两种产生原因:

  • 系统提供的资源不足,不能满足并发进程对资源的需求。比如,消息是一种临界资源,某一时刻,进程A等待进程B发来消息,进程B等待进程C发来消息,进程C等待进程A发来消息,消息未到,A,B,C三个进程都无法推进,造成通信上的死锁。
  • 进程的推进顺序不当。比如,线程A获得了锁1,线程B获得了所2,这时,线程A调用lock试图获得锁2,则必须挂起等待线程B释放锁2,线程B也调用了lock试图获得锁1,则必须挂起等待线程A释放锁1,于是线程A和线程B都在等待对方释放锁,结果两个线程都处于挂起等待,造成了死锁。

3.产生死锁的必要条件

如果在计算机系统中同时具备下面四个必要条件时,就会发生死锁。换句话说,只要下面四个条件有一个不具备,系统就不会出现死锁。

(1)互斥条件:
在一段时间内,某资源只能被一个线程所占用,若此时其他线程申请则必须等待,直至当前线程用完释放;(互斥锁)

(2)请求和保持条件:
线程已经拥有一个资源,此时它又申请新的资源,若新资源被其他线程占用,当前线程则会阻塞等待,它在等待新资源之时,仍继续占用已占有的资源;

(3)不可抢占条件:
线程在已获得的资源未使用之前不能被抢占,只能自己使用完后自己释放;

(4)循环等待条件:
存在一个进程等待序列{P1,P2,P3,....,Pn},其中P1等待P2所占有的资源,P2等待P3所占有的资源,......,Pn等待P1所占有的资源,形成一个进程循环等待环。

4.处理死锁的方法

(1)预防死锁:

  死锁的预防是保证系统不进入死锁状态的一种策略。它的基本思想是打破产生死锁的四个必要条件中的一个或几个,从而使系      统不会进入死锁状态。

  可以破坏请求和保持条件,破坏不可抢占条件,破坏循环等待条件,但不破坏互斥条件,互斥条件一般是由资源本身的属性决     定的,比如,打印机。

(2)避免死锁:

  在济源动态分配的过程中,用某种方法防止系统进入不安全状态,从而避免死锁的发生。

(3)检测死锁:

  线程发生死锁,此时通过检测机构及时检测死锁发生,采取适当措施,将其从死锁中解脱出来。

(4)解除死锁:

  检测到死锁,将进程从死锁状态中解脱出来,常用方法为撤消一些进程,回收它们资源,将它们分配给处于已阻塞状态线程,使其能继续运行,从而解除死锁;重启系统,开销很大,意味着在这之前所有的进程已经完成的计算工作都将付之东流,包括参与死锁的那些进程,以及未参与死锁的进程;还有进程回退策略,即让参与死锁的进程回退到没有发生死锁前某一点处,并由此点处继续执行,以求再次执行时不再发生死锁(这是一种很理想的方法,操作开销大)。

5.银行家算法---避免死锁

背景简介:

 一个银行家如何将一定数目的资金安全地借给若干个客户,使这些客户既能借到钱完成要干的事,同时银行家又能收回全部资金而不至于破产,这就是银行家问题。这个问题同操作系统中资源分配问题十分相似:银行家就像一个操作系统,客户就像运行的进程,银行家的资金就是系统的资源。

银行家算法:

每一个线程进入系统时,它必须声明在运行过程中,所需的每种资源类型最大数目,其数目不应超过系统所拥有每种资源总量,当线程请求一组资源系统必须确定有足够资源分配给该进程,若有在进一步计算这些资源分配给进程后,是否会使系统处于不安全状态。若能在分配资源时找到一个安全序列,则将资源分配给它,否则等待。产生死锁后,系统一定处于不安全的状态。

举例:

假定系统中有五个线程{P0,P1,P2,P3,P4}和三类资源{A,B,C},各类资源数量分别为10,5,7,  在T0时刻分配资源情况如图:

Max:表示线程对每类资源的最大需求量;

Allocation:表示系统给线程已分配每类资源的数目;

Need:表示线程还需各类资源数目;

Available:表示系统当前剩下的资源。

从T0开始找出一个安全序列:

(1)首先系统剩下资源{3,3,2},查表可满足5个进程Need的进程有:P1(1,2,2)、P3(0,1,1),先给P1分配;

(2)P1分配以后执行完释放其所占资源后系统此时剩下资源有:P1{3,2,2}+Available{2,1,0}={5,3,2};

(3)根据系统剩下资源查表可满足剩下4个进程Need的进程有P3{0,1,1}、P4{4,3,1},再给P3分配;

(4)P3分配以后执行完释放其所占资源后系统此时剩下资源有:P3{2,2,2}+Available{5,2,1}={7,4,3};

(5)根据系统剩下资源查表可满足剩下3个进程Need的进程有P0{7,4,3}、P2{6,0,0}、P4{4,3,1},再给P4分配;

(6)P4分配以后执行完释放其所占资源后系统此时剩下资源有:P4{4,3,3}+Available{3,1,2}={7,4,5};

(7)根据系统剩下资源查表可满足剩下2个进程Need的进程有P0{7,4,3}、P2{6,0,0},再给P2分配;

(8)P2分配以后执行完释放其所占资源后系统此时剩下资源有:P2{9,0,2}+Available{1,4,5}={10,4,7};

(9)根据系统剩下资源查表可满足剩下1个进程Need的进程有P0{7,4,3},最后给P0分配;

(10)P0分配以后执行完释放其所占资源后系统此时剩下资源有:P0{7,5,3}+Available{3,0,4}={10,5,7};

(11)所有进程按此序列 {P1,P3,P4,P2,P0} 可安全执行完毕,最后系统资源全部释放。(由以上也可知安全序列不唯一,但只要找出一个安全序列,说明此系统是安全的(找到安全序列可按此序列真正执行进程推进顺序,若没找到,则恢复初始状态,其并没有真正给进程分配资源,只是提前避免))

小结:银行家算法是从当前的状态开始,找到一个剩余资源数满足该线程需要的资源数,当该线程完成所有的工作后,会释放自己的资源,再次找到一个剩余资源数满足该线程需要的资源数,.......,直到该序列的所有线程都工作完,释放掉资源。这时,找到的这样一个序列就是一个安全序列,使用这个序列的顺序进行申请和释放资源,不会产生死锁,从而避免了死锁。银行家算法允许死锁的必要条件中的请求和保持,不可抢占,互斥条件,与预防死锁的条件相比,限制条件少了,资源利用率提高了。

银行家算法的缺点:

  1. 这个算法要求线程数保持固定不变,这在多道程序系统中是难以做到的

  2. 这个算法保证所有线程在有限的时间内得到满足,但实际线程要求快速响应  

  3. 由于要寻找一个安全序列,实际上增加了系统的开销。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值