`
uule
  • 浏览: 6305624 次
  • 性别: Icon_minigender_1
  • 来自: 一片神奇的土地
社区版块
存档分类
最新评论

如何避免死锁

 
阅读更多

一句话一张图说明银行家算法

 

问题:

死锁产生的条件, 以及如何避免死锁,银行家算法,产生死锁后如何解决

 

产生死锁的四个必要条件(互请不循):

(1) 互斥条件:一个资源每次只能被一个进程使用。

(2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。

(3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺

(4) 循环等待条件:若干进程之间形成一种头尾相接的【循环等待资源】关系。

 

避免死锁:

(1).按同一顺序访问对象。(注:避免出现循环)

(2).避免事务中的用户交互。(注:减少持有资源的时间,较少锁竞争)

(3).保持事务简短并处于一个批处理中。(注:同(2),减少持有资源的时间)

(4).使用较低的隔离级别。(注:使用较低的隔离级别(例如已提交读)比使用较高的隔离级别(例如可序列化)持有共享锁的时间更短,减少锁竞争)

(5).使用基于行版本控制的隔离级别:

 

银行家算法

银行家算法是一个避免死锁的著名算法,它是以银行借贷系统的分配策略为基础,判断并保证系统的安全运行。

 

一句话:

当一个进程申请使用资源的时候,银行家算法通过【先 试探 分配给该进程资源】,然后【通过安全性算法判断分配后的系统是否处于安全状态】,若不安全则试探分配作废,让该进程继续等待。

 

当一进程提出资源申请时,银行家算法执行下列步骤以决定是否向其分配资源:

1)检查该进程所需要的资源是否已超过它所宣布的最大值。

2)检查系统当前是否有足够资源满足该进程的请求。

3)系统试探着将资源分配给该进程,得到一个新状态。

4)执行安全性算法,若该新状态是安全的,则分配完成;若新状态是不安全的,则恢复原状态,阻塞该进程。

 

假设资源P1申请资源,银行家算法先试探的分配给它(当然先要看看当前资源池中的资源数量够不够),若申请的资源数量小于等于Available,然后接着判断分配给P1后剩余的资源,能不能使进程队列的某个进程执行完毕】,【若没有进程可执行完毕,则系统处于不安全状态】(即此时没有一个进程能够完成并释放资源,随时间推移,系统终将处于死锁状态)。

 

若有进程可执行完毕,则假设回收已分配给它的资源(剩余资源数量增加),把这个进程标记为可完成,并继续判断队列中的其它进程,若所有进程都可执行完毕,则系统处于安全状态,并根据可完成进程的分配顺序生成安全序列(如{P0,P3,P2,P1}表示将申请后的剩余资源Work先分配给P0–>回收(Work+已分配给P0的A0=Work)–>分配给P3–>回收(Work+A3=Work)–>分配给P2–>······满足所有进程)。

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics