操作系统学习记录之九:死锁的产生及解决死锁的方法

死锁的产生:

允许多个进程并发执行共享系统资源时,系统必须提供同步机制和进程通信机制,然而,对这种机制使用不当的话,可能会出现进程永远被阻塞的现象;
例如,两个进程分别等待对方占有的一个资源,于是两者都不能执行而处于永远等待,这种现象称为“死锁”
 

死锁的定义:

一组进程处于死锁状态是指:每一个进程都在等待被另一个进程所占有的、不能抢占的资源
例如,
存在n个进程P1, P2, …, Pn;
进程Pi因为申请不到资源Ri而处于等待状态;
而Ri又被Pi+1占有, Rn被P1占有;
显然,这n个进程的等待状态永远不能结束,这n个进程就处于死锁状态;
 

死锁产生的例子:

 

 

 

解决死锁问题的三个方法:

死锁防止;

死锁避免;

死锁检测和恢复;

死锁产生的四个必要条件:

互斥条件: 进程应互斥使用资源,任一时刻一个资源仅为一个进程独占;
占有和等待条件:一个进程请求资源得不到满足而等待时,不释放已占有的资源;
不剥夺条件:任一进程不能从另一进程那里抢夺资源;
循环等待条件:存在一个循环等待链,每一个进程分别等待它前一个进程所持有的资源;
 

死锁的防止:

破坏四个必要条件之一,死锁就可防止;

破坏第一个条件,把独占型资源改造成共享性资源,使资源可同时访问而不是互斥使用。这是一个简单的办法,但对许多资源往往是不能做到的;
采用剥夺式调度方法可以破坏第三个条件,但剥夺式调度方法目前只适用于对主存资源和处理器资源的分配,而不适用于所有资源;


静态分配(预分配):

所谓静态分配是指一个进程必须在执行前就申请它所要的全部资源,并且直到它所要的资源都得到满足之后才开始执行;
所有并发执行的进程要求的资源总和不超过系统拥有的资源数;
采用静态分配后,进程在执行中不再申请资源,因而不会出现占有了某些资源再等待另一些资源的情况,即破坏了第二个条件;
 

层次分配:

这种分配策略将阻止第四个条件的出现
在层次分配策略下,资源被分成多个层次;
一个进程得到某一层的一个资源后,它只能再申请在较高层的资源;
当一个进程要释放某层的一个资源时,必须先释放所占用的较高层的资源;
当一个进程获得了某一层的一个资源后,它想再申请该层中的另一个资源,那么,必须先释放该层中的已占资源;
 

死锁的避免

当不能防止死锁的产生时,如果能掌握并发进程中与每个进程有关的资源申请情况,仍然可以避免死锁的发生;
只需在为申请者分配资源前先测试系统状态,若把资源分配给申请者会产生死锁的话,则拒绝分配,否则接收申请,为它分配资源;
(银行家算法)

 

死锁的检测

解决死锁问题的另一条途径是死锁检测方法;
这种方法对资源的分配不加限制,但系统定时运行一个“死锁检测”程序,判断系统内是否已出现死锁,若检测到死锁则设法加以解除;
检测的一种方法:可设置两张表格来记录进程使用资源的情况;
等待资源表记录每个被阻塞进程等待的资源;
占用资源表记录每个进程占有的资源;
进程申请资源时,先查该资源是否为其它进程所占用;若资源空闲,则把该资源分配给申请者且登入占用资源表;否则,则登入进程等待资源表;
死锁检测程序定时检测这两张表, 若有进程Pi等待资源rk,且rk被进程Pj占用,则说Pi和Pj具有“等待占用关系”,记为W(Pi, Pj)
死锁检测程序反复检测这两张表,可以列出所有的“等待占用关系”;
如果出现W(Pi, Pj), W(Pj, Pk), ……, W(Pm,Pn), W(Pn, Pi)时,显然,系统中存在一组循环等待资源的进程: Pi, Pj, Pk, ……, Pm, Pn,也就是说出现了死锁;
把两张表格中记录的进程使用和等待资源的情况用一个矩阵A来表示:

 死锁检测程序可用Warshall的传递闭包算法检测是否有死锁发生,即对矩阵A构造传递闭包A*[bij];

 A*[bij]中的每个bij是对A[bij]执行如下算法:
for k:=1 to n do
for i:=1 to n do
for j:=1 to do
bij:= bij V (bik^ bkj)

死锁检测后的解决办法:

可以采用重新启动进程执行的办法,恢复工作应包含重启动一个或全部进程,以及从哪一点开始重启动;
全部卷入死锁从头开始启动,但这样的代价是相当大的;
在进程执行过程中定时设置校验点,从校验点开始重执行
中止一个卷入死锁的进程,以后重执行;
 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值