文章转载链接:http://www.51testing.com/html/15/n-4481115.html
1.什么是死锁?
当多个进程在运行过程中因为争夺资源而造成的一种僵局,当进程处于这种僵持状态的时候,若无外力作用,它们将永远无法向前推进.这种状态就称为死锁。
2.产生死锁的必要条件
产生死锁总共有4个必要条件:
·资源互斥:当一个资源被一个进程使用时候,其他继承不能使用该资源
·资源不可剥夺:进程已持有的资源在使用完之前是不可被剥夺的,只能在使用完后由自己释放
·请求和保持:当进程在请求其他资源的时候,对自己已持有的资源保持不放
·循环等待:即存在一个等待队列:例如:A占有B的资源,B占有C的资源,C占有A的资源,这样就形成了一个等待环路
当以上4个条件同时成立的时候,就会产生死锁。
3.预防死锁的方法
资源一次性分配(破坏请求条件):一次性分配所有的资源,这样就不会再有请求了。
(破坏保持条件):一个进程只要有一个资源得不到分配,就也不给这个进程分配其他资源。
可剥夺资源(破坏不可剥夺性):一个进程即使获得了部分资源,但是如果得不到其他资源,就需要释放掉已有的资源。
资源有序分配(破坏循环等待):系统为每类资源分配一个编号,每一个进程按照编号以递增的顺序请求资源,释放则相反。
4.避免死锁的方法
预防死锁的四种方法,都会严重的影响系统性能.因此可以尽可能去避免死锁的产生。
在避免死锁的策略中,允许进程动态地申请资源.所以,系统在进行资源分配的时候,会预先计算资源分配的安全性,如果此次资源分配不会导致系统进入不安全的状态,就将资源分配给进程,否则,进程等待。
避免死锁的方法中最经典和最重要的就是:银行家算法。
原理:
将操作系统视为一个银行家,将操作系统所管理的资源视为银行家的资金,进程申请资源就视为用户向银行家贷款。
当一个顾客对资金的最大需求量不超过银行家现有的资金时,就可以接纳该顾客。
顾客可以分期贷款,但是贷款的总额不可以超过最大需求量。
当银行家现有资金不能满足用户尚需的贷款金额时,可以推迟支付贷款,但是使顾客在有限的时间内拿到贷款。
当顾客得到所有所需资金后,一定可以在有限时间内归还所有的资金。
5.解除死锁的方法
剥夺资源:从其他进程剥夺足够数量的资源给死锁,用以解除死锁状态。
撤销进程:撤销系统中一个或者多个死锁进程。