原有的銀行家算法的說明不太清楚,根據自己的理解進行修訂:
銀行家算法可歸納如下:(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,若是,則系統處於安全狀態,否則,系統處於不安全狀態。