银行家算法是Dijkstra为银行系统设计的,以确保银行在发放现金贷款时,不会发生不能满足所有客户需要的情况,后来被用于操作系统中,用于避免死锁。
核心思想:在进程提出资源申请时,先预判此次分配是否会导致系统进入不安全状态,如果会进入不安全状态,就暂时不答应这次请求,让该进程先阻塞等待。
例:
进程 最大需求 已分配 最多还需要 P0 (7,5,3) (0,1,0) (7,4,3) P1 (3,2,2) (2,0,0) (1,2,2) P2 (9,0,2) (3,0,2) (6,0,0) P3 (2,2,2) (2,1,1) (0,1,1) P4 (4,3,3) (0,0,2) (4,3,1) 资源总数为(10,5,7),剩余可用资源(3,3,2)。
答:
先用剩余可用资源与最多还需要资源数一 一比较,将剩余可用资源分配给可以完成的进程。
与P0比较,(7,4,3)>(3,3,2)
与P1比较,(1,2,2)<(3,3,2),P1进程可以完成,P1结束归还资源,剩余可用资源增加到(5,3,2)。
与P2比较,(6,0,0)>(5,3,2)
与P3比较,(0,1,1)<(5,3,2),剩余可用资源增加到(7,4,3)。
再与P0比较,(7,4,3) = (7,4,3),剩余可用资源增加到(7,5,3)。
再与P2比较,(6,0,0)< (7,5,3),剩余可用资源增加到(10,5,5)。
与P4比较,(4,3,1)<(10,5,5),剩余可用资源增加到(10,5,7)。
最后可找出一个安全序列:{P1,P3,P0,P2,P4}。
注意:每一轮检查都是从编号较小的进程开始检查。
上一例题用更快方法找到一个安全序列:
剩余可用资源(3,3,2)可满足P1、P3,说明,无论如何,这两个进程的资源需求一定可以依次被满足,因此P1、P3一定可以执行完,并归还资源。
此时剩余可用资源(7,4,3)剩下的P0、P2、P4都可被满足。
说明此时系统处于安全状态,暂不可能发生死锁。
银行家算法数据结构:
1、长度为m的一维数组Available表示还有多少可用资源。
2、n*m矩阵Max表示各进程对资源的最大需求数。
3、n*m矩阵Allocation表示已经给各进程分配了多少资源。
4、Max-Allocation = Need矩阵表示各进程最多还需要多少资源。
5、用长度为m的一维数组Request表示进程此次申请的各种资源数。
银行家算法步骤:
1、检查此次申请是否超过了之前声明的最大需求数。
2、检查此时系统剩余的可用资源是否还能满足这次请求。
3、试探分配,更改各数据结构。
4、用安全性算法检查此次分配是否会导致系统进入不安全状态。
安全性算法步骤:
1、检查当前的剩余可用资源是否能满足某个进程的最大需求,如果可以,就把该进程加入安全序列,并把该进程持有的资源全部回收。
2、不断重复上述过程,看最终是否能让所有进程都加入安全序列。
注意:系统处于不安全状态未必死锁,但死锁时一定处于不安全状态,系统处于安全状态一定不会死锁。