面试官:死锁是什么?它是怎么产生的?如何避免?

一、死锁是什么?

死锁就是有两个或者多个进程由于竞争资源而造成阻塞的现象,如果无外力作用,这种局面就会一直持续下去。

案例:两个人共享红蓝钥匙,都要执行获取钥匙,打开两扇门,最后归还钥匙的操作。如下图这样就会导致死锁:
在这里插入图片描述

二、死锁产生的四大条件

死锁产生必须满足四个必要条件:

1、互斥条件:指在一段时间内某资源只能由一个进程占用。

只有一副钥匙

2、请求和保持条件:指进程已经保持至少一个资源,但又提出了新的资源请求,且对自己已获得的其它资源保持不放。

拿着红钥匙的人在没有归还红钥匙的情况下,又索要蓝钥匙

3、不剥夺条件:指进程已获得的资源,在未使用完之前,不能被剥夺,只能在使用完时由自己释放。

只要人不主动归还钥匙,就可以一直占着钥匙

4、环路等待条件:指在发生死锁时,必然存在一个进程——资源的环形链。即进程集合{P0,P1,P2,···,Pn}中的P0正在等待一个P1占用的资源;P1正在等待P2占用的资源,……,Pn正在等待已被P0占用的资源。

拿着红钥匙的人在等待蓝钥匙,而拿着蓝钥匙的人又在等待红钥匙

三、如何避免死锁?

要避免死锁只要破坏以上四个条件中的任意一个即可。

我们来看看常见的避免死锁的方法。

—方法一 . 破坏互斥条件—

只有一副钥匙,这是形成死锁的最关键的原因。显然,如果我们能在两个线程跑之前,能给每个线程单独拷贝一份钥匙的副本,就能有效的避免死锁了。
在这里插入图片描述

当然,这种方法试用范围并不广。因为有时如果系统拷贝那副钥匙的成本极高,而线程又很多的话,这种方法就不适用了。

—方法二.破坏请求和保持条件—

任何一个线程“贪心”,都可能会导致死锁。大致就是说有了一把钥匙还没还就要另一把。这里我们可以通过规定在任何情况下,一个线程获取一把钥匙之后,必须归还了钥匙之后才能请求另一把钥匙,就可以有效解决这个问题。
在这里插入图片描述

—方法三.破坏不剥夺条件—

除非线程自己还钥匙,否则线程会一直占有钥匙,是形成不可剥夺条件的原因。这里,我们可以通过设置一个”最长占用时间“的阈值来解决这个问题——如果过了10分钟仍然没有进入下一个步骤,则归还已有的钥匙。这样的话,两个线程都能取到所需的钥匙继续下去了。
在这里插入图片描述

—方法四. 破坏环路等待条件—

会出现死锁的两两组合,一定都是一个线程先取了红钥匙而另一个线程先取了蓝钥匙,从而导致了可能形成了“环路等待”。所以我们可以强制规定任何线程取钥匙的顺序只能是 “先取蓝钥匙再取红钥匙”的话,就能避免死锁了。(六组解也就只剩下前三组解是有效的了)
在这里插入图片描述

参考原文:https://zhuanlan.zhihu.com/p/26945588

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

启四

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

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

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

打赏作者

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

抵扣说明:

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

余额充值