银行家算法(Banker's Algorithm)是一个避免死锁(Deadlock)的著名算法,是由艾兹格·迪杰斯特拉在1965年为T.H.E系统设计的一种避免死锁产生的算法。它以银行借贷系统的分配策略为基础,判断并保证系统的安全运行。
银行家算法:数据结构:
n=线程数量,m=资源类型数量
Max(总需求量):n x m矩阵
Available(剩余资源量):长度为m的向量
Allocation(已分配资源量):n x m矩阵
Need(未来所需资源量):n x m矩阵
1.Work和Finish分别是长度为m和n的向量初始化
Work = Available
Finish[i] = false (对于线程的初始化)
2.如何寻找可执行的线程T
(a)Finish[i]=false (表明当前进程未完成)
(b)Need[i]<Work (表明当前进程可满足)
如果没有找到满足条件的线程Ti,证明系统是不安全的,转4。如果找到,则转3
3.Work=Work+Allocation[i]
Finish[i]=true (此时该进程被满足,转2,继续寻找下一个进程直到所有进程都为true为止)
4.如果所有系统Ti满足Finish[i] ==ture,则系统处于安全状态,否则就处于不安全状态
银行家算法:
初始化: Request[i] 线程Ti的资源请求向量
Request[j] 线程Ti的资源请求Rj的实例
循环:
1.如果Request[i]<=Need[i],则转到步骤2,否则拒绝资源的申请,因为其线程已经超过其最大需求
2.如果Request[i]<=Available,则转到步骤3,否则线程Ti必须等待,因为资源无法满足需求
3.通过安全状态判断来确定是否分配资源给线程Ti,生成一个需要判断状态是否安全的资源分配环境
此时:
Available = Available - Request
Allocation[i]=Allocation[i]+Request
Need[i]=Need[i]-Request
调用安全状态判断:
如果返回结果是安全,则将资源分配给线程Ti ,否则系统会拒绝Ti的资源请求
例题1:
假定系统有R1,R2,R3这3类资源:
R1 | R2 | R3 |
9 | 3 | 6 |
最大需求矩阵A:
A | R1 | R2 | R3 |
T1 | 3 | 2 | 2 |
T2 | 6 | 1 | 3 |
T3 | 3 | 1 | 4 |
T4 | 4 | 2 | 2 |
已分配资源矩阵B:
B | R1 | R2 | R3 |
T1 | 1 | 0 | 0 |
T2 | 6 | 1 | 2 |
T3 | 2 | 1 | 1 |
T4 | 0 | 0 | 2 |
当前资源需要矩阵C = A - B:
C | R1 | R2 | R3 |
T1 | 2 | 2 | 2 |
T2 | 0 | 0 | 1 |
T3 | 1 | 0 | 3 |
T4 | 4 | 2 | 0 |
当前剩余资源向量V=R-A:
R1 | R2 | R3 |
0 | 1 | 1 |
判断当前剩余资源量能否满足某个进程的需求量,通过对比我们可知,初始阶段只有线程T2可以满足,此时系统分配给T2所需要的资源,利用完之后并把T2的原有资源收回
此时系统可用资源为:
R1 | R2 | R3 |
6 | 2 | 3 |
当前资源需要矩阵C :
C | R1 | R2 | R3 |
T1 | 2 | 2 | 2 |
T2 | 0 | 0 | 0 |
T3 | 1 | 0 | 3 |
T4 | 4 | 2 | 0 |
此时剩余资源可以满足任意的剩下三个线程,例如,我们先满足进程T1
此时系统可用资源为:
R1 | R2 | R3 |
7 | 2 | 3 |
当前资源需要矩阵C :
C | R1 | R2 | R3 |
T1 | 0 |