【并发编程】-- 避免死锁(2)

75 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第15天,点击查看活动详情

接着上一篇文章 【并发编程】-- 避免死锁

此时,如果银行家借款给了c,那么c还是不能满足预计需要的500万元,银行家手里只剩余0万元,但是c可能还需要100万元,才能完成。此时的状态如下:

姓名拥有的钱/万元需要借的钱/万元还需要的钱/万元银行家剩余的钱/万元
a2004002000
b100400300
c700800100

此时,银行家手里只剩下0元了,不能够满足a、b、c需要的钱,因为此时a需要200万元,b需要300万元,c需要100万元,这是一个不安全的分配顺序,即c、a、b称为非安全序列。

​ 这个算法利用打破资源依赖的条件来避免死锁情况发生,即在分配资源时通过安全校验,看看剩下的资源能不能满足其中某个任务的需求,如果不能满足,就称找不到一个安全序列,简单而言,就是看看有没有一个序列能够保证先分配给谁,谁完成了再分配给谁,保证一定能够分配完成即可。但是这个算法在实际上根本不能用,因为无法知道一个任务到底需要多少资源,另外每次分配都判定会极大降低系统性能,所以更倾向于出现死锁后解锁,而不是预判死锁。

​ 使用多线程就是为了高效,但却产生了一个银行家算法,在每次分配前进行检测,使得性能极度下降,因此,正常情况下根本不用使用这个算法,既不会采用避免死锁策略,更不会使用预防死锁策略,为了保证高效,必须允许出现死锁,通过提供检测机制,最后消除死锁。