当前位置: > 财经>正文

面试官:死锁是什么?它是怎么产生的?如何避免? 外汇储备是怎么形成的原因有哪些方面的问题

2023-07-21 10:54:16 互联网 未知 财经

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

一、死锁是什么?

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

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

二、死锁产生的四大条件

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

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

只有一副钥匙

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

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

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

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

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

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

三、如何避免死锁?

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

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

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

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

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

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

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

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

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

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

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

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

版权声明: 本站仅提供信息存储空间服务,旨在传递更多信息,不拥有所有权,不承担相关法律责任,不代表本网赞同其观点和对其真实性负责。如因作品内容、版权和其它问题需要同本网联系的,请发送邮件至 举报,一经查实,本站将立刻删除。