【总结贴】死锁

 

死锁在多线程环境下应当全力避免发生,交通信号等造成死锁是一个非常形象的例子,下面是关于死锁的一些总结经验。

 

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

    1、互斥:某种资源一次只允许一个进程访问,即该资源一旦分配给某个进程,其他进程就不能再访问,直到该进程访问结束。

    2、占有且等待:一个进程本身占有资源(一种或多种),同时还有资源未得到满足,正在等待其他进程释放该资源。

    3、不可抢占:别人已经占有了某项资源,你不能因为自己也需要该资源,就去把别人的资源抢过来。

    4、循环等待:存在一个进程链,使得每个进程都占有下一个进程所需的至少一种资源。

    当以上四个条件均满足,必然会造成死锁。

 

 

 

避免死锁的方法

 

1、死锁预防 ----- 确保系统永远不会进入死锁状态

 

     产生死锁需要四个条件,那么,只要这四个条件中至少有一个条件得不到满足,就不可能发生死锁了。

     由于互斥条件是非共享资源所必须的,不仅不能改变,还应加以保证,所以,主要是破坏产生死锁的其他三个条件。

 

a、破坏“占有且等待”条件

     方法1:所有的进程在开始运行之前,必须一次性地申请其在整个运行过程中所需要的全部资源。

     方法2:该方法是对第一种方法的改进,允许进程只获得运行初期需要的资源,便开始运行,在运行过程中逐步释放掉分配到的已经使用完毕的资源,然后再去请求新的资源。

 

b、破坏“不可抢占”条件

      当一个已经持有了一些资源的进程在提出新的资源请求没有得到满足时,它必须释放已经保持的所有资源,待以后需要使用的时候再重新申请。

 

c、破坏“循环等待”条件

     可以通过定义资源类型的线性顺序来预防,可将每个资源编号,当一个进程占有编号为i的资源时,那么它下一次申请资源只能申请编号大于i的资源。如图所示:

 

 

2、避免死锁 ----- 在使用前进行判断,只允许不会产生死锁的进程申请资源

 

两种避免办法:

    1、如果一个进程的请求会导致死锁,则不启动该进程

    2、如果一个进程的增加资源请求会导致死锁 ,则拒绝该申请。

避免死锁的具体实现通常利用银行家算法

 

银行家算法的相关数据结构

    可利用资源向量Available:

    最大需求矩阵Max:

    分配矩阵Allocation:

    需求矩阵Need:

 

 

3、死锁检测与解除 ----- 在检测到运行系统进入死锁,进行恢复。

 

    死锁检测

 

    死锁的解除

如果利用死锁检测算法检测出系统已经出现了死锁 ,那么,此时就需要对系统采取相应的措施。常用的解除死锁的方法:

 

1、抢占资源:从一个或多个进程中抢占足够数量的资源分配给死锁进程,以解除死锁状态。

2、终止(或撤销)进程:终止或撤销系统中的一个或多个死锁进程,直至打破死锁状态。

    a、终止所有的死锁进程。这种方式简单粗暴,但是代价很大,很有可能会导致一些已经运行了很久的进程前功尽弃。

    b、逐个终止进程,直至死锁状态解除。该方法的代价也很大,因为每终止一个进程就需要使用死锁检测来检测系统当前是否处于死锁状态。另外,每次终止进程的时候终止哪个进程呢?每次都应该采用最优策略来选择一个“代价最小”的进程来解除死锁状态。一般根据如下几个方面来决定终止哪个进程:

    进程的优先级

    进程已运行时间以及运行完成还需要的时间

    进程已占用系统资源

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值