原有的银行家算法的说明不太清楚,根据自己的理解进行修订:
银行家算法可归纳如下:(1)当一个用户对资金的最大需求量不超过银行家全部资金(可用+已借贷)时,就可以接纳该用户,但需要根据当前需求量继续判断是否可立即接纳,还是推迟接纳。
(2)用户可以分期贷款,但贷款总数不能超过最大需求量。
(3)当银行家现有的资金不能满足用户当下申请的资金(满足条件2)时,推迟支付,但应总能使用户在有限的时间内得到贷款。
(4)当银行家现有的资金能满足用户当下申请的资金时,但不满足该用户的全部剩余需求时,需要判断银行家是否能够找到一个支付序列,保障所有用户最终在有限时间内得到贷款。
(5)当银行家现有的资金能满足用户当下申请的资金,且能满足该用户全部剩余需求时,需要判断银行家是否能够找到一个支付序列,保障所有用户最终在有限时间内得到贷款(这一点需要继续研究需要执行安全检查的必要性,找到一个反例)。
(6)当用户得到所需的全部资金后,一定能在有限的时间内归还所有的资金。
算法设计:
操作系统:银行家
进程:用户
操作系统管理的资源:资金
进程请求资源:用户向银行借贷资金
数据结构:
可用资源向量 Avaliable[];
最大需求矩阵:Max[][];
已分配资源矩阵:Allocation[][];
剩余资源需求矩阵:Need[][];
当前请求向量: Request[];
算法描述:
当进程Pi发出资源请求后,系统按照如下步骤进行检查:
(1)若Request[i]<need[i][],则执行步骤(2),否则系统告知申请资源数已超过进程要求的最大值报错;
(2)若Request[i]<Avaliable[],则执行步骤(3),否则系统会因为尚无足够可用的资源满足Pi的申请而使进程Pi等待;
(3)系统试探把资源分配给进程Pi,并修改相关数据结构数据:
Avaliable[]=Avaliable[]-Request[];
Allocation[i][]=Allocation[i][]+Request[i];
Need[i][]=Need[i][]-Request[i];
(4) 系统执行安全算法,检查此次资源分配后,系统是否处于安全状态。若是,则系统才真正将资源分配给Pi,否则系统将试探分配作废,恢复原来的资源分配状态,让Pi等待。
安全算法:
work:可用资源向量:
finish:状态向量:
(1) work[]=Avaliable[];
finish[]={false,false,...,false};
(2)找到一满足下列条件的进程,finish[i]=false & need[i]<=work[];,若能够找到,跳转到步骤(3),找不到符合条件的进程,跳转到步骤(4);
(3) work[]=work[]+allocation[i][]; finish[i]= true;跳转到步骤(2)
(4) 判断是否所有的finish[i]=true,若是,则系统处于安全状态,否则,系统处于不安全状态。