前言
死锁问题是面试官最喜欢的问题,我在之前的一篇文章里写了死锁的产生条件,这里我写一个死锁的预防算法。
银行家算法
为什么叫银行家算法呢?其实就是类比银行给客户放贷这件事情。银行家手里的资金是有限的,他决定是否给某个顾客放贷,得看一看自己手上的剩余资源,和顾客的贷款额度。
大概说一下算法流程
首先呢,银行家算法会创建一些资源列表,包括初始化时最大资源数量列表,目前剩余的资源数量列表。
那么进程呢,也有自己的一套资源列表,分别是当前线程能请求的最大资源数量列表、目前已经请求到的资源数量列表、目前还想请求的资源数量列表。
OK一共系统+进程的资源列表就这五个。
现在咱们开始模拟银行家算法。
1.进程提出request资源请求,里面其实就是个自愿请求列表。然后银行家算法会比较request请求和五大列表之“用户还想请求的资源列表”。啥意思呢?这个用户进程明明需要的只是need列表,但是它居然请求了request列表且request>need!那对不起,出错!如果没出错的话,就下一步!
2.继续做检测,这次进程与系统的检测。一句话,你总不能请求的资源数量比当前剩余的资源数量还要多吧?不过也没关系,多的话就把你这个进程先阻塞起来。然后咱等着,一直等到你这个进程被唤醒了,且资源数够分配了,就尝试给你分配一下。
3.先虚假的给进程分配它想要的request(为什么说是虚假的呢,后面慢慢看),然后转手就去做安全检查。啥意思呢?就是说,