操作系统面试:死锁与银⾏家算法

什么是死锁

所谓死锁,是指多个进程循环等待它方占有的资源而无限期的僵持下去的局面。很显然,如果没有外力的作用,那么死锁涉及到的各个进程都将永远处于封锁状态。当两个或者两个以上的进程同时对多个互斥资源提出使用要求时,很有可能导致死锁。

必要条件

(1)互斥条件。即某个资源在一段时间内只能由一个进程占有,不能同时被两个或者两个以上的进程占有。这种独占资源比如打印机等,必须在占有该资源的进程主动释放它之后,其他进程才能占有该资源。这是由资源本身的属性所决定的。如独⽊桥就是⼀种独占资源,两⽅的⼈不能同时过桥。

(2)不可抢占条件。进程所获得的资源为未使用完毕之前,资源申请者不能强行的从资源占有者手中夺取资源,而只能由该资源的占有者进程自行释放。如过独⽊桥的⼈不能强迫对⽅后退,也不能⾮法地将对⽅推下桥,必须是桥上的⼈⾃⼰过桥后空出桥⾯(即主动释放占有资源),对⽅的⼈才能过桥。

(3)占有而且申请条件。进程至少已经占有了一个资源,但是又申请新的资源;由于该资源已被另外进程占有,此时该进程阻塞;但是,它在等待新资源之时,仍继续占⽤已占有的资源。还以过独⽊桥为例,甲⼄两⼈在桥上相遇。甲⾛过⼀段桥⾯(即占有了⼀些资源),还需要⾛其余的桥⾯(申请新的资源),但那部分桥⾯被⼄占有(⼄⾛过⼀段桥⾯)。甲过不去,前进不能,⼜不后退;⼄也处于同样的状况。

(4)循环等待条件。存在⼀个进程等待序列{P1,P2,…,Pn},其中P1等待P2所占有的某⼀资源,P2等待P3所占有的某⼀源,…,⽽Pn等待P1所占有的的某⼀资源,形成⼀个进程循环等待环。就像前⾯的过独⽊桥问题,甲等待⼄占有的桥⾯,⽽⼄⼜等待甲占有的桥⾯,从⽽彼此循环等待。

怎么解决

死锁的预防是保证系统不进⼊死锁状态的⼀种策略。它的基本思想是要求进程申请资源时遵循某种协议,从⽽打破产⽣死锁的四个必要条件中的⼀个或⼏个,保证系统不会进⼊死锁状态。

  • 打破互斥条件: 即允许进程同时访问某些资源。但是,有的资源是不允许被同时访问的,像打印机等等,这是由资源本身的属性所决定的。所以,这种办法并⽆实⽤价值。
  • 打破不可抢占条件:即允许进程强⾏从占有者那⾥夺取某些资源。就是说,当⼀个进程已占有了某些资源,它⼜申请新的资源,但不能⽴即被满⾜时,它必须释放所占有的全部资源,以后再᯿新申请。它所释放的资源可以分配给其它进程。这就相当于该进程占有的资源被隐蔽地强占了。这种预防死锁的⽅法实现起来困难,会降低系统性能。
  • 打破占有且申请条件:可以实行资源预先分配策略。即进程在运行前一次性的向系统申请它所需要的全部资源。如果某个进程所需的全部资源得不到满足,则不分配任何资源,此进程暂不运行。只有当系统能够满足当前进程的全部资源需求时,才一次性的将所申请的资源全部分配给该进程。由于运行的进程已经占有了它所需的全部资源,所以不会发生占有资源又申请资源的现象,因此不会发生死锁
  • 打破循环等待条件:实行资源有序分配策略。采用这种策略,即把资源事先分类编号,按号分配,使进程在申请,占用资源时不会形成环路。所有进程对资源的请求必须严格按照资源序号递增的顺序提出。进程占用了小号资源,才能申请打好资源,就不会产生环路,从而预防了死锁

死锁避免:银⾏家算法

鸵⻦算法

  • 假设的前提是,这样的问题出现的概率很低。比如,在操作系统中,为应对死锁问题,可以采用这样的一种方法。当系统发生死锁时不会对用户造成多大影响,或者系统很少发生死锁的场合采用运行死锁发生的鸵⻦算法,这样一来可能开销比不允许发生死锁以及检测和解除死锁的⼩。如果[死锁]很⻓时间才发⽣⼀次,⽽系统每周都会因硬件故障、[编译器]错误或操作系统错误⽽崩溃⼀次,那么⼤多数⼯程师不会以性能损失或者易⽤性损失的代价来设计较为复杂的死锁解决策略,来消除死锁。

  • 鸵⻦策略的实质:出现死锁的概率很⼩,并且出现之后处理死锁会花费很⼤的代价,还不如不做处理,OS中这种置之不理的策略称之为鸵⻦策略(也叫鸵⻦算法)。

银行家算法

在避免[死锁]的方法中,所施加的限制条件比较弱,有可能获得令人满意的系统性能。在该方法中把系统的状态分为安全状态和不安全状态,只要能使系统始终处于安全状态,就可以避免发生【死锁】

银⾏家算法的基本思想是:分配资源之前,判断系统是否是安全的,如果是,才分配。它是最具有代表性的避免[死锁]的算法。

设进程cusneed提出请求REQUEST [i],则银⾏家算法按如下规则进⾏判断。

  • (1)如果REQUEST [cusneed] [i]<= NEED[cusneed][i],则转(2);否则,出错。
  • (2)如果REQUEST [cusneed] [i]<= AVAILABLE[i],则转(3);否则,等待。
  • (3)系统试探分配资源,修改相关数据:
AVAILABLE[i]-=REQUEST[cusneed][i];
ALLOCATION[cusneed][i]+=REQUEST[cusneed][i];
NEED[cusneed][i]-=REQUEST[cusneed][i];
  • (4)系统执⾏安全性检查,如安全,则分配成⽴;否则试探险性分配作废,系统恢复原状,进程等待。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值