1. 程式人生 > >【作業系統】銀行家演算法實現(C語言)

【作業系統】銀行家演算法實現(C語言)

# 【作業系統】銀行家演算法實現(C語言) ##### 注意:本人編碼水平很菜。算是自己的一個總結。可能會有我還沒有發現的bug。如果有人發現後可以指出,不勝感激。 ## 1.銀行家演算法: > 我們可以把作業系統看作是銀行家,作業系統管理的資源相當於銀行家管理的資金,程序向作業系統請求分配資源相當於使用者向銀行家貸款。 > 為保證資金的安全,銀行家規定: (1) 當一個顧客對資金的最大需求量不超過銀行家現有的資金時就可接納該顧客; (2) > 顧客可以分期貸款,但貸款的總數不能超過最大需求量; (3) > 當銀行家現有的資金不能滿足顧客尚需的貸款數額時,對顧客的貸款可推遲支付,但總能使顧客在有限的時間裡得到貸款; (4) > 當顧客得到所需的全部資金後,一定能在有限的時間裡歸還所有的資金. > 作業系統按照銀行家制定的規則為程序分配資源,當程序首次申請資源時,要測試該程序對資源的最大需求量,如果系統現存的資源可以滿足它的最大需求量則按當前的申請量分配資源,否則就推遲分配。當程序在執行中繼續申請資源時,先測試該程序本次申請的資源數是否超過了該資源所剩餘的總量。若超過則拒絕分配資源,若能滿足則按當前的申請量分配資源,否則也要推遲分配。 ---------引用自百度百科 ## 2.簡單來說:系統中的資源是有限的。不足以一下子把所有程序所需的資源都分配。 ## 我們需要做的就是在有限的資源下,是否有一個分配順序,可以使得全部程序都可以獲得資源並執行,如果可以則返回一個安全佇列,如果不可以,則說明有風險,系統可能會陷入死鎖。 ## 3.資料結構 > 1)可利用資源向量Available > 是個含有m個元素的陣列,其中的每一個元素代表一類可利用的資源數目。如果Available[j]=K,則表示系統中現有Rj類資源K個。 > 2)最大需求矩陣Max > 這是一個n×m的矩陣,它定義了系統中n個程序中的每一個程序對m類資源的最大需求。如果Max[i,j]=K,則表示程序i需要Rj類資源的最大數目為K。 > 3)分配矩陣Allocation > 這也是一個n×m的矩陣,它定義了系統中每一類資源當前已分配給每一程序的資源數。如果Allocation[i,j]=K,則表示程序i當前已分得Rj類資源的 > 數目為K。 4)需求矩陣Need。 > 這也是一個n×m的矩陣,用以表示每一個程序尚需的各類資源數。如果Need[i,j]=K,則表示程序i還需要Rj類資源K個,方能完成其任務。 ## 4.舉個例子: 系統總資源是(9,3,6) | | max | Allocation | need | Available | finished | | ---- | ------------ | -------------- | -------------- | ----------------- | -------- | | | R1 R2 R3 | R1 R2 R3 | R1 R2 R3 | R1 R2 R3 | | | p1 | 3 , 2 , 2 | 1 ,0 ,0 | 2 , 2 , 2 | 6,1,4 (9,3,6) | True | | p2 | 6 ,1 ,3 | 5 ,1 ,2 | 1 , 0 ,1 | 0,1,0 (6,2,3) | True | | p3 | 3 ,1 ,4 | 2 , 1 , 1 | 1 ,0 , 3 | 5,2,0 (8,3,4) | Ture | | p4 | 4 ,2 , 2 | 0 ,0, 2 | 4 ,2 ,0 | 4,1,4 (8,3,6) | True | 分配給p2(1,0,1) 目前系統可用資源 1,1,1 1.此時p2仍然需要1,0,1 ,可以滿足p2所需資源 。p2完成後釋放資源 此時系統資源總數為(6,2,3) 2.分配給p3,系統資源剩(5,2,0)。p3完成後釋放資源, 此時的資源總數為(8,3,4) 3.分配給p4,系統資源剩(4,1,4)。P4完成後釋放資源,此時系統資源總數為(8,3,6) 4.分配給p1,系統資源(6,1,4),p1完成後釋放資源,此時系統資源總數為(9,3,6) 全部程序執行完畢。 安全序列為:p2---->p3--->p4---->p1 執行截圖 :![以下程式碼執行截圖](https://img-blog.csdnimg.cn/20201128200538574.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNDE5MzY1,size_16,color_FFFFFF,t_70) ## 5.程式碼段 ```c