死锁

前言

操作系统的基本特征是并发和共享,系统允许多个进程并发执行,并且共享系统资源,为了最大限度的利用系统资源,操作系统应采用动态分配的策略,然而采用这种策略时,如果分配不当,可能会出现进程之间互相等待资源又都不能向前推进的情况,即造成进程相互死等的局面。
事实上,不同进程对资源的申请可能按照某种先后次序得到部分满足,这就可能造成其中的两个或几个进程彼此间封锁的情况,即每个进程“抓住”一些为其他进程锁等待的资源不放,其结果谁也得不到他所申请的全部资源,这些进程都无法继续运行。

一、死锁的概念

死锁:两个或者多个并发进程在执行过程中,如果每个进程持有某种资源而又等待别的进程释放它或者他们现在保持的资源,在未改变这种状态之前都不能向前推进,称这一组进程产生了死锁。
在这里插入图片描述
死锁分为同类资源死锁和不同类资源死锁,

  • 同类资源:同一组进程竞争同一类资源,若资源分配不当,就可能出现互相死等的局面;
  • 不同类资源:某系统拥有非同类资源RI,R2各一台,并为进程P1,P2所共享,在某一时刻,进程P1,P2分别占用了R1,R2,在下一时刻,P1在占用R1的状态下需要占用R2,P2在占用R2的状态下需要占用R1,此时,系统初夏了僵持的局面,也就是我们所说的死锁现象。
    死锁指的是两个或者多个进程无限期的被阻塞、相互等待的一种状态,发生死锁时,涉及的这一组进程,每个进程都占用了一定的资源但又不能向前推进。在这种情况下,计算机虽然处于开机状态,但这一组进程却未做任何有益的工作。

二、产生死锁的原因和必要条件

1.产生死锁的原因

我们都知道并发进程共享系统资源,在竞争资源时可能会产生死锁的后果,产生死锁的根本原因是系统能够提供的资源个数比要求该资源的进程数要少,当系统中两个或多个进程因申请资源得不到满足而等待时,如果每个进程都没有能力进一步执行,系统就会发生死锁。
有必要说明的是:资源竞争现象并不等于死锁,资源竞争现象是具有活力的,必需的,虽然它存在着发生死锁的危险性,在并发过程中,存在着一种合理的联合推荐路线,这种推荐路线可使每个进程都运行完毕。

2.产生死锁的必要条件

1.互斥条件:涉及的资源是非共享的,即一次只有一个进程使用,如果有另一个进程申请该资源,那么申请进程必须等待,直到该资源被释放;
2.不剥夺条件(非抢占):进程所获得的资源在未使用完毕之前,不能被其他进程强行夺走,即只能由获得该资源的进程自己来释放:
3.占有并等待(部分分配):进程每次申请它所需要的一部分资源,在等待一新资源的同时,进程继续占用已分配到的资源;
4.环路等待(循环等待):存在一种进程的循环链,链中的每一个进程已获得的资源同时被链中下一个进程所请求。
当以上四个条件均满足,必然会造成死锁,发生死锁的进程无法进行下去,他们所持有的资源也无法释放,这样会导致CPU的吞吐量下降,所以死锁情况会浪费系统资源和影响计算机的使用性能。
所以说,只需要破坏以上三个条件中的任何一个条件就不会发生死锁了。

三.解决死锁问题的策略

上述条件(1)是难以否定的,因为某些资源,是由其性质决定为非共享的,但是,采用虚拟设备技术能排除非共享设备死锁的可能性。

- 破坏“占有且等待”条件:
方法1:所有的进程在开始运行之前,必须一次性的申请其在整个运行过程中所需要的全部资源。这种方法简单容易实施且安全,但是因为某项资源无法满足,进程无法启动,而其他已经满足了的资源也不会得到利用,严重降低了资源的利用率,造成了资源浪费,使得进程经常发生饥饿现象,
方法2:该方法是对第一种方法的改进,允许进程只获得运行初期需要的资源,便开始运行,在运行过程中逐步释放掉分配大盘的已经使用完毕的资源,然后再去申请新的资源,这样的话,资源利用率会得到有效提高,也会减少进程的饥饿问题;
- 破坏“不可抢占”条件:
当一个已经持有了一些资源的进程在题出新的资源请求没有得到满足时,它必须释放已经白醋的所有资源,待以后需要使用的时候再重新申请,这就意味着进程已经占有的资源会被短暂的释放或者说是抢占了,这种方法实现起来比较麻烦,且代价比较大,释放已经保持的资源很有可能会导致进程之前的工作失效等反复的申请和释放资源会导致进程的执行被无限的推迟,这不仅会延长进程的周转周期,还会影响系统的吞吐量;
- 破坏“循环等待”条件:
可以通过定义资源类型的线性顺序来预防,可将每个资源编号,当一个进程占有编号为i的资源时,那么他的下一次申请资源只能申请编号大于i的资源。

四.死锁的预防和避免

1.死锁的预防

静态预防:预先分配所有共享的资源,每个用户向系统提交任务时,需一次说明它所需要的资源,在批处理系统中,作业调度程序只能在满足改作业所需的全部资源的前提下才能将它投入运行,当资源一旦分配给改作业后,在其整个运行期间这些资源为它独占,
缺点:

  1. 一个用户在作业运行之前可能提不出他的作业将要使用的全部设备;
  2. 用户作业必须等待,直到所有资源满足时才能投入运行,实际上某些资源可能要到运行后期才会用到;
  3. 一个作业运行期间对某些设备的使用时间很少,甚至不会用到。

2.死锁的避免

采用动态分配资源的方法可以提高资源利用率,但是,为了避免可能产生的死锁,在进行资源分配时,应采用某种算法来预测是否有可能发生死锁,若存在可能性,就拒绝企图获得资源的请求。
预防死锁和避免死锁的不同在于前者所采用的分配策略本身就否定了必要条件之一,这压根就保证了死锁不可能发生;而后者在动态分配资源的策略下采用某种算法来预防了可能发生的死锁,从而拒绝可能引起死锁的某个资源请求。
利用有效资源分配法可以破坏环路等待,系统要求每个进程:

  • 对它所必须使用的而且属于某一类的所有资源必须一次申请完;
  • 在申请不同类的资源时,必须按个欸的编号依次申请。
    恭请指正
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mierya0707

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值