持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第15天,点击查看活动详情
此时,如果银行家借款给了c,那么c还是不能满足预计需要的500万元,银行家手里只剩余0万元,但是c可能还需要100万元,才能完成。此时的状态如下:
| 姓名 | 拥有的钱/万元 | 需要借的钱/万元 | 还需要的钱/万元 | 银行家剩余的钱/万元 |
|---|---|---|---|---|
| a | 200 | 400 | 200 | 0 |
| b | 100 | 400 | 300 | |
| c | 700 | 800 | 100 |
此时,银行家手里只剩下0元了,不能够满足a、b、c需要的钱,因为此时a需要200万元,b需要300万元,c需要100万元,这是一个不安全的分配顺序,即c、a、b称为非安全序列。
这个算法利用打破资源依赖的条件来避免死锁情况发生,即在分配资源时通过安全校验,看看剩下的资源能不能满足其中某个任务的需求,如果不能满足,就称找不到一个安全序列,简单而言,就是看看有没有一个序列能够保证先分配给谁,谁完成了再分配给谁,保证一定能够分配完成即可。但是这个算法在实际上根本不能用,因为无法知道一个任务到底需要多少资源,另外每次分配都判定会极大降低系统性能,所以更倾向于出现死锁后解锁,而不是预判死锁。
使用多线程就是为了高效,但却产生了一个银行家算法,在每次分配前进行检测,使得性能极度下降,因此,正常情况下根本不用使用这个算法,既不会采用避免死锁策略,更不会使用预防死锁策略,为了保证高效,必须允许出现死锁,通过提供检测机制,最后消除死锁。