死锁的探究和解决

死锁:两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。

死锁的原因:1)系统资源有限;2)进程推进顺序不当。

死锁的四个必要条件:

1)互斥:存在部分资源只能同时让一个进程使用;

2)占有且等待:有进程占有了所需的部分资源,且有部分所需的资源被其他进程所占有,需要等待这些资源被释放后才能继续执行;

3)不可剥夺:所以进程在主动释放所占有的资源前,所占有的资源不会被其他进程强行剥夺;

4)循环等待:存在多个进程以等待另一个进程释放资源为边组成一个环状结构。

必要性证明:假设有一个死锁,然后分别去掉某个条件都会发现死锁不成立了,具体证明过程这里省略。

非充分性证明:

死锁的四个必要条件为什么不是充分条件呢?我们可以通过下面的资源分配图来进行理解。

我们可以看到这个资源分配图同时满足了死锁的四个必要条件,然而图中的几个进程并没有形成死锁,改图中的几个进程以以下的过程完成了解锁工作:

1、当进程3完成后释放资源1;

2、进程1拿到所需的资源1;

3、进程1完成后释放资源1和资源2;

4、进程2获取到所需的资源2;

5、进程2完成并释放只有的资源。

故而满足死锁四大必要条件的一组进程并不一定会形成死锁。

死锁的解决:

死锁的预防--破坏死锁的必要条件,避免死锁的查询

上文讲述了死锁的四个必要条件, 而总结出这些条件其目的就是让我们能够更好的避免死锁,只要我们破坏这4个必要条件中的一个就能确保死锁不会出现。由于互斥条件是非共享资源自带的属性是不能修改的,所以这里主要通过破坏其他三个必要条件来对死锁进行预防。

1、破坏占有且等待条件:

方法1:所有的进程在开始运行之前,必须一次性地申请其在整个运行过程中所需要的全部资源。
         优点:简单易实施且安全。
         缺点:因为某项资源不满足,进程无法启动,而其他已经满足了的资源也不会得到利用,严重降低了资源的利用率,造成资源浪费。而当一个进程所需的资源比较多,难以同时满足就会发生饥饿现象。
 方法2:本方法是在方法1上改进而来,允许进程在运行过程中动态获取资源,同时要保证进程在获取资源的时候之前所占有的资源已经释放,这就相当于将一个进程所需的较大量的资源划分成多个不互相干扰的组分别进行获取,从而很大程度上避免了方法1中所说的当一个进程所需的资源较多是容易出现饥饿现象的问题,同时很好的提高了资源的利用率。

2、破坏不可剥夺条件:

当一个进程因为不能获得所需要的全部资源时而进入等待状态时,其占有的资源将被隐式的释放重新加入到系统的资源列表中成为可以被获取的资源,而该进程在获取到所有资源时需要回收被隐式释放的资源,如果回收成功(被释放的资源依然存在于系统的资源列表中)则可以开始执行,否则再一次进入等待状态。
      该种方法实现起来比较复杂,且代价也比较大。释放已经占有的资源很有可能会导致进程之前的工作失效,反复的申请和释放资源会导致进程的执行被无限的推迟,这不仅会延长进程的周转周期,还会影响系统的吞吐量。

3、破坏循环等待条件:

通常采用有序资源分配法来破坏循环等待条件。该方法主要通过将系统中的资源进行同一编号(一般稀缺的资源编号较大,从而避免很多进程停留在初始获取资源的阶段的情况),之后要求所有进程请求资源时都必须按从小到大的编号顺序来请求资源,每次请求的资源编号必须必所有已占有的所有资源的编号大。有序资源分配法对进程请求资源做了以下限制:1)对同一进程所必须使用的而且属于同一类的所有资源,必须一次申请完;2)在申请不同类资源时,必须按各类设备的编号依次申请。

死锁的避免--通过算法判断,只允许不会产生死锁的进程申请资源

死锁避免的一个典型算法为银行家算法。银行家算法是在已知总的资源量和每个请求资源的进程所需的总资源量的情况下结合当前各进程已经占有的资源和预期会释放的资源来判断在当前状态下分配给某个进程所请求的资源后是否能够在限定时间内满足所有进程对资源的请求的一种算法,同时系统将能够满足的情况称为安全状态,不能满足的状态称为非安全状态。如果系统处于安全状态则将资源分配给请求资源的进程,否则不分配。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值