银行家算法(Banker’s Algorithm)是一个避免死锁(Deadlock)的著名算法,是由艾兹格·迪杰斯特拉在1965年为T.H.E系统设计的一种避免死锁产生的算法。它以银行借贷系统的分配策略为基础,判断并保证系统的安全运行。
在银行中,客户申请贷款的数量是有限的,每个客户在第一次申请贷款时要声明完成该项目所需的最大资金量,在满足所有贷款要求时,客户应及时归还。银行家在客户申请的贷款数量不超过自己拥有的最大值时,都应尽量满足客户的需要。在这样的描述中,银行家就好比操作系统,资金就是资源,客户就相当于要申请资源的进程。 银行家算法是一种最有代表性的避免死锁的算法。在避免死锁方法中允许进程动态地申请资源,但系统在进行资源分配之前,应先计算此次分配资源的安全性,若分配不会导致系统进入不安全状态,则分配,否则等待。
安全状态:如果存在一个由系统中所有进程构成的安全序列P1,…,Pn,则系统处于安全状态。安全状态一定是没有死锁发生。安全序列:是指一个进程序列{P1,…,Pn}是安全的,即对于每一个进程Pi(1≤i≤n),它以后尚需要的资源量不超过系统当前剩余资源量与所有进程Pj (j < i )当前占有资源量之和。比如:有进程{p1, p2, p3, p4},当前占有的资源量为{w1, w2, w3, w4},对应还需要的资源量{n1, n2, n3, n4},系统还剩资源 {v}。若{v>=n1; v+w1>=n2; v+w1+w2>=n3; v+w1+w2+w3>=n4},则{p1, p2, p3, p4}就是一个安全序列,因为v大于n1,进程p1可以执行;进程p1归还资源后,v+w1>=n2,进程p2也可以执行,以此类推,那么所有的进程都可以执行完。
不安全状态:不存在一个安全序列。不安全状态不一定导致死锁。如果系统中有4中类型的资源(A,B,C,D)和5个进程(P1,P2,P3,P4,P5),4种资源的数量分别为(3,12,14,14). 若现在某时刻系统状态如下: 现在判断是否存在一种安全序列,使得每个进程都能先后成功执行完毕。 通过计算可得:此时系统资源还剩余(1,6,2,2).(剩余 = 总资源 - 已分配资源之和) (下次可利用资源 = 该进程已分配资源 + 当前可利用资源) 若当前可利用资源 >= 进程还需要资源量,则进程可以执行,为安全状态;反之不安全 通过上述表格可以看出,可以找到一个安全序列使程序执行完毕(注:安全队列不唯一,只要能找到一个就算是安全队列)