银行家算法是比较具有代表性的避免死锁的算法,那么现在就来理一下思路吧~
首先会规定几个变量:①进程个数,②资源个数,③每个资源的总大小,④目前每个进程的分配情况,⑤目前每个进程还需要的资源数,⑥当前可用的资源数。
下面先来给一个例子:
进程数为5,进程名字分别为p0,p1,p2,p3,p4,
资源数为3,每个资源的名称以及总大小分别为:A 10
B 5
C 7,
每个进程当前分配情况为:0 1 0
2 0 0
3 0 2
2 1 1
0 0 2
,每个进程还需要的资源数为:7 4 3
1 2 2
6 0 0
0 1 1
4 3 1,
当前可用的资源数为3 3 2
(上面图片可能看的更加形象一些)
那么解题步骤如下:
①按照序号从小到大比较,从p0开始,如果某进程的Need(A,B,C)<=Available(A,B,C),那就把当前拥有的资源数分配给该进程,显然,第一次我们先把资源数分配给p1,次数Available(A,B,C)-Need(A,B,C)=(2,1,0),当p1进程运行完成之后,Available(A,B,C)=(2,1,0)+Max(3,2,2)=Available(5,3,2)
这里的Max(A,B,C)表示的是该进程的总资源数
②再将Available(5,3,2)从p0开始寻找符合条件的进程,p1已经完成了应当去除,那么之后找到的是p3,再重复①中的步骤,如此往复,直到所有进程运行完毕,所以安全顺序应当为:p1->p3->p0->p2->p4
当然还会有出现不安全的情况:
上面表格中的内容,根据之前步骤的描述,Available(2,1,0)不能满足任何一个进程所需要的资源数,进入不安全状态,此时恢复旧数据结构,p0进行等待。
下面附上找到的一篇大佬的博客,里面有java的实现代码,也有概念解释,希望大家都可以学会:https://www.cnblogs.com/128-cdy/p/12188340.html