死锁预防与解决

                                    死锁预防与解决

*预防
银行家算法:
银行家算法是最著名的死锁避免算法。它提出的思想是:把操作系统看做是银行家,操作系统管理的资源相当于银行
家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。操作系统按照银行家制定的规则为进程分配
资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则
按当前的申请量分配资源,否则就推迟分配。当进程在执行中继续申请资源时,先测试该进程已占用的资源数与本次
申请的资源数之和是否超过了该进程对资源的最大需求量。若超过则拒绝分配资源,若没有超过则再测试系统现存的
资源能否满足该进程尚需的最大资源量,若能满足则按当前的申请量分配资源,否则也要推迟分配。


死锁避免的基本思想是:
系统对进程发出每一个系统能够满足的资源申请进行动态检查,并根据检查结果决定是否
分配资源,如果分配后系统可能发生死锁,则不予分配,否则予以分配.这是一种保证系统不进入死锁状态的动态策略
(其实就是一定要每次上锁前检查上锁后是否有发生死锁的可能性)。


安全检查:
进程 最大需求 已分配 可用
P1 10 5 3
P2 4 2  
P3 9 2  
则在T0时刻是安全的,因为存在一个安全序列P2、Pl、P3,即只要系统按此进程序列分配资源,则每个进程都能顺利
完成。若在T0时刻后,系统分配1台磁带机给P3,则此时系统便进入不安全状态,因为此时已无法再找到一个安全序列。
并非所有的不安全状态都是死锁状态,但当系统进入不安全状态后,便可能进入死锁状态;反之,只要系统处于安全
状态,系统便可以避免进入死锁状态。


小结:
银行家算法
1.系统p1是要超过满足自己需求的量(最大需求-系统已经分配),比如11,这时候系统就不给,否则走2
2.系统看p1满足最大需求还需要的量超过系统资源,不给分。满足走3
3.将储存这些数据的表尝试性改变,并进行如上安全检查,如果有分,找不到安全序列,就还原这些表。


*解决:
(1)检测:
做两张表一张资源分配表,一张资源等待表
资源分配(r是资源p是进程)
r1 p2
r2 p5
r3 p4
r4 p1
资源等待
p1 r1
p2 r3
p4 r4
判断:p1-r1-p2-r3-p4-r4-p1 出现环路引起死锁
(2)解决:
撤销死锁链上所有进程
进程回退到申请资源前
按优先级进程可以抢占资源
按某些原则一个个撤销死锁进程

猜你喜欢

转载自blog.csdn.net/qq_41784469/article/details/80916782