死锁产生的原因和处理死锁的方法(全网最详细!!!!)

一、.死锁

1.产生死锁的原因

1.1 竞争资源

通常系统中拥有的不可剥夺资源,其数量不足以满足多个进程运行的需要,使得进程在 运行过程中,会因争夺资源而陷入僵局,如磁带机、打印机等。只有对不可剥夺资源的竞争 才可能产生死锁,对可剥夺资源的竞争是不会引起死锁的。

系统中的资源分为两类:

  • 可剥夺性资源
    资源分配给进程后可以被高优先级的进程剥夺。如CPU,主存等
  • 不可剥夺资源
    分配给进程后只能在进程用完后才释放的资源。如磁带机、打印机等

1.2 进程推进顺序非法

进程在运行过程中,请求和释放资源的顺序不当,也同样会导致死锁。例如,并发进程 P1、P2分别保持了资源R1、R2,而进程P1申请资源R2,进程P2申请资源R1时,两者都 会因为所需资源被占用而阻塞。

1.3 信号量使用不当也会造成死锁

进程间彼此相互等待对方发来的消息,结果也会使得这 些进程间无法继续向前推进。例如,进程A等待进程B发的消息,进程B又在等待进程A 发的消息,可以看出进程A和B不是因为竞争同一资源,而是在等待对方的资源导致死锁。

2.死锁产生的必要条件

  • 互斥条件:进程要求对所分配的资源(如打印机)进行排他性控制,即在一段时间内某 资源仅为一个进程所占有。此时若有其他进程请求该资源,则请求进程只能等待。
  • 请求和保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源 已被其他进程占有,此时请求进程被阻塞,但对自己已获得的资源保持不放。
  • 不可剥夺条件:进程所获得的资源在未使用完毕之前,不能被其他进程强行夺走,即只能 由获得该资源的进程自己来释放(只能是主动释放)。
  • 循环等待:存在一种进程资源的循环等待链,链中每一个进程已获得的资源同时被 链中下一个进程所请求。即存在一个处于等待状态的进程集合{Pl, P2, …, pn},其中Pi等 待的资源被P(i+1)占有(i=0, 1, …, n-1),Pn等待的资源被P0占有,如图所示
    在这里插入图片描述

3.处理死锁的方法

3.1 预防死锁

因为互斥条件是必须的,不仅不能改变,还应该加以保证。因此只能破坏后三个条件。

3.1.1 破环请求和保持条件
  • 破环“请求条件”
    每个进程执行之前,必须一次性地申请其在整个运行期间所需的全部资源,全部申请到了才能运行。这样它在整个运行过程中便不会再提出资源请求,从而破坏了“请求”条件。

缺点
① 资源利用率很低:有些资源可能在最后才会用到,它却一直占用了那么久
② 进程可能出现饥饿现象:可能由于个别资源别其他进程占用而导致某进程迟迟不能开始

  • 破坏“保持”条件
    每个进程提出申请资源前必须释放已占有的一切资源
3.1.2 破环非抢占条件
  • 走不通就放弃自己的已有资源造福别人
    进程 Pi 申请 Rj 类资源时,检查 Rj 中有无可用资源:有则分配给 Pi ;否则将 Pi 占有的资源全部释放而进入等待状态(Pi等待其原占有的所有资源和申请的资源)
  • 走不通先去抢别人的(前提是别人也走不通),抢不到就放弃自己的
    当进程 Pi 申请 Rj 类型的资源时检查 Rj 中有无可用资源:有则分配给 Pi ;否则检查已获得 Rj 类资源的进程 Pk ,若 Pk 处于等待资源状态,则抢占 Pk 的 Rj 类资源并分配给 Pi,若 Pk 不处于等待资源状态,则置 Pi 于等待资源状态(此时Pi原已占有的资源可能被抢占)

这两种方法的缺点:
① 有的资源是不可抢占资源,比如打印机,被抢占后可能导致前一阶段的工作失效
② 延长了周转时间,降低了系统吞吐量,增加了系统开销:因为某些进程的执行可能会被无限推迟

3.1.3 破环循环等待条件(有序资源使用法)

给系统中的所有资源类型进行排序编号

  • 每个进程只能按照递增顺序申请资源,即进程申请了序号为8的资源后,下次申请只能申请9或以上的资源
  • 如果进程需要同一资源类型的多个实例(也就是序号相同的资源),则必须对它们一起进行申请
  • 如果进程后面又想申请序号低的资源(比如5),那就必须把现在拥有的序号为5及其以上的资源全部释放

为什么这种规则可以破环循环等待条件?
核心: 每个进程只能按递增顺序申请资源
因此每个时刻总有一个进程占据了较高序号的资源,那么它后面继续申请的资源一定是空闲的,这就保证了进程是可以一直向前推进的,

优点:与前两种策略相比,其资源利用率和系统吞吐量都有明显的改善

缺点:① 序号必须相对稳定,这就限制了新设备的增加
② 如果作业使用各类资源的顺序与系统规定的递增顺序不符合的话,就会造成资源的浪费
③ 按规定次序申请资源的方法会限制用户简单、自主地编程

3.2 避免死锁

安全状态和不安全状态:
系统处于安全状态时,就可避免死锁;处于不安全状态时,可能发生死锁。

所谓安全状态,是指系统此时能找到一个进程的序列<P1,P2,P3…Pn>,只要按照此顺序为其分配资源,就能使每个进程都能顺利完成。如果存在一个安全序列,那么系统则处于安全状态,否则就处于不安全状态。

在避免死锁方法中,允许进程动态地申请资源,但是系统在分配资源之前,会先计算此次资源分配的安全性,安全的话才分配,不安全的话便令进程等待。

计算资源分配安全性的两种方法
1.资源分配图算法
在每个资源类型只包含一个实例时可以使用。
成环是不安全的,不成环是安全的
2.银行家算法

3.3 死锁的检测和解除

3.3.1 死锁的检测

资源分配算法
类似银行家算法

3.3.2 死锁的检测

1.终止进程的方法
(1) 终止所有死锁进程
是最简单的方法,终止所有死锁进程后,死锁自然就解除了。
缺点: 代价可能会很大:有些快要结束的进程一旦被终止,可谓是“功亏一篑”。
(2) 逐个终止进程,直至死锁解除
比上面的方法更温和一些,按照某种约定好的顺序,一个一个地终止进程,当有足够的资源时,就打破了循环等待,死锁解除。
选择被终止的进程的策略:为死锁解除所付出的“代价最小”,怎么才算是代价最小呢?下面是一些应该考虑的因素:
① 进程的优先级大小
② 进程已经执行了多少时间?以后还需要多少时间才能完成?
③ 进程已经使用了多少资源?以后还需要多少资源?
缺点: 付出的代价也可能会很大,因为每终止一个进程,都要用死锁检测算法确定系统死锁是否已经被解除。

2.资源抢占的方法
(1)事先规定好进程被抢占的顺序以使代价最小。(要让各进程有限的被选为“牺牲品”,否则某些经常被强占的进程会发生“饥饿”现象。)
(2)发生死锁时,选择一个“牺牲品”,抢占它的资源给其它进程;
(3)然后将这个“牺牲品”进程回滚到过去的某个安全状态。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值