操作系統實驗二:銀行家算法


實驗  銀行家算法

一、實驗目的

1、了解什么是操作系統安全狀態和不安全狀態

2、了解如何避免系統死鎖;

3、理解銀行家算法是一種最有代表性的避免死鎖的算法,掌握其實現原理及實現過程。

二、實驗內容

根據銀行家算法的基本思想,編寫和調試一個實現動態資源分配的模擬程序,並能夠有效避免死鎖的發生。

三、實驗原理

進程申請資源時,系統通過一定的算法判斷本次申請是否不可能產生死鎖(處於安全狀態)。若可能產生死鎖(處於不安全狀態),則暫不進行本次資源分配,以避免死鎖。算法有著名的銀行家算法。

1、什么是系統的安全狀態和不安全狀態?

所謂安全狀態,是指如果系統中存在某種進程序列<P1,P2,…,Pn>,系統按該序列為每個進程分配其所需要的資源,直至最大需求,則最終能使每個進程都可順利完成,稱該進程序列<P1,P2,…,Pn,>為安全序列。

如果不存在這樣的安全序列,則稱系統處於不安全狀態。

2、銀行家算法

   把操作系統看作是銀行家,操作系統管理的資源相當於銀行家管理的資金,進程向操作系統請求分配資源相當於用戶向銀行家貸款。

為保證資金的安全,銀行家規定:  

(1) 當一個顧客對資金的最大需求量不超過銀行家現有的資金時就可接納該顧客;  

(2) 顧客可以分期貸款,但貸款的總數不能超過最大需求量;  

(3) 當銀行家現有的資金不能滿足顧客尚需的貸款數額時,對顧客的貸款可推遲支付,但總能使顧客在有限的時間里得到貸款;  

(4) 當顧客得到所需的全部資金后,一定能在有限的時間里歸還所有的資金。

 

操作系統按照銀行家制定的規則設計的銀行家算法為:

1)進程首次申請資源的分配:如果系統現存資源可以滿足該進程的最大需求量,則按當前的申請量分配資源,否則推遲分配。

2)進程在執行中繼續申請資源的分配:若該進程已占用的資源與本次申請的資源之和不超過對資源的最大需求量,且現存資源能滿足該進程尚需的最大資源量,則按當前申請量分配資源,否則推遲分配。

3)至少一個進程能完成:在任何時刻保證至少有一個進程能得到所需的全部資源而執行到結束。

銀行家算法通過動態地檢測系統中資源分配情況和進程對資源的需求情況來決定如何分配資源,並能在確保系統處於安全狀態時才把資源分配給申請者,從而避免系統發生死鎖。

 

四、實驗中用到的系統調用函數(包括實驗原理中介紹的和自己采用的),自己采用的系統調用函數要按照指導書中的格式說明進行介紹。

  模擬程序沒有用到系統調用函數

五、實驗步驟

   要求寫出實驗過程和思路。 

流程圖:

 

銀行家算法數據結構:

1、系統可利用資源向量Available[m]

這是一個含有m個元素的數組,其中每一個元素代表一類系統可利用資源數目,其初始值隨機生成,其數值隨該類資源的分配和回收而動態的改變。Available[i]=N表示系統中現有第i類資源N個。

2、最大需求矩陣Max

這是一個含有n*m大小的矩陣,其定義了每個進程對系統某類資源的最大需求量。Max[i][j]=N表示進程i對第j類資源的需求為N個。

3、進程已擁有資源矩陣Allocation

這是一個含有n*m大小的矩陣,其定義了每個進程對系統某類資源的已擁有個數。Allocation[i][j]=N表示進程i對第j類資源的已擁有數為N

4、進程需求矩陣Need

這是一個含有n*m大小的矩陣,其定義了每個進程對系統某類資源的需求數量,Need[i][j]=N表示進程i對第j類資源的需求為N

其中,NeedAllocationMax矩陣的關系為:Need[i][j]=Max[i][j]-Allcation[i][j]

以上數組全部由C++對內存空間申請動態數組實現。

5、進程請求向量request

這是一個含有m個元素的數組,其中每一個元素代表此時某進程對每一類系統可利用資源的申請數量,數值大小不超過系統可利用的資源數。request[i]=N表示某進程對第i類資源的申請數為N

6、Temp

這是一個含有m個元素的數組,其初始值為Available,將對Available的操作代替在Temp上進行。

7、進程滿足需求的標志數組Finish

在安全性檢測中對每個進程進行檢測分配時,可滿足的進程即標志位置1

Finish[i]=1表示此次嘗試分配資源后系統可利用資源能滿足第i個進程的需求。

 

銀行家算法思路:

申請資源RequestRes()

1、產生申請向量

2、與系統可利用資源對比(request[i]<=Available[i])判斷能否滿足,能則轉步驟3,否則直接返回。

3、足夠資源分配,嘗試分配資源

4、執行安全性檢測算法
5、如安全性檢測不通過,回收分配出去的資源

 

安全性檢測算法思路:

1、初始化TempFinish,使Temp[i]=Available[i]Finish[i]=0

2、Finish[i]=0&&Need<=Temp時轉步驟3,否則轉步驟4

3、進程獲得所需資源,視為執行完畢,釋放所有資源,使Temp=Temp+Available

Finish[i]=1

4、計數Finish數組是否全為1,是則系統安全,可以分配,否則不安全。

 

六、實驗結果分析(截屏的實驗結果,與實驗結果對應的實驗分析)

在程序設計方面,我已經事先對初始化的數據進行安全性檢驗,確保初始化的數據不會產生死鎖,是能夠通過安全性檢驗的具有安全序列的數據。

 

將系統此時可利用資源分配給P1,滿足全部需求,默認執行完畢回收P1的資源。此時系統可利用資源為6 4 13 14 6 8 2。滿足P0全部需求。故安全性檢測通過。可以分配資源。本次隨機產生的系統擁有資源較多,但第二類資源從P1中收回后為4個剛好滿足P0總需求,要是少一個則會發生死鎖。

將此時系統可利用資源分配給P0,滿足其全部需求后回收P0擁有的資源,此時系統可利用資源為9 5 12 10 9 8 7 9 12。滿足P1的全部需求,將所需資源全分配給P1后回收P1的資源,此時系統可利用資源為10 6 14 12 10 11 8 12 16滿足P2全部需求,故安全性檢測通過,可以分配。

檢測系統可利用資源不足以分配申請資源,直接返回。

初始時系統剩余可利用資源為2 6 3 4 7,滿足安全性,安全序列為1230(不唯一),當嘗試分配后剩余1 5 1 2 6,無法滿足任一進程需求,安全性檢測不通過。如分配則造成系統死鎖,故分配失敗。

系統嘗試分配后剩余可利用資源8 0 2 1 8 0 4 2

此時執行安全檢測,對於進程0,滿足需求,全部分配后收回資源。

此時系統可利用資源為9 1 3 3 13 1 8 6

按順序到進程1,對比Need,發現第三類資源不足,跳過

按順序到進程2,對比Need,發現第二類資源不足,跳過

按順序到進程3,對比Need,滿足需求,全部分配后收回資源。

此時系統可利用資源為11 2 4 7 14 3 9 9

按順序到進程4,對比Need,發現第二類資源不足,跳過

按順序到進程5,對比Need,發現第二類資源不足,跳過

再次循環,對進程1,對比Need,發現第六類資源不足,跳過

循環完畢,發現滿足進程不足全部,撤銷分配的資源,返回不安全。

初始系統可利用資源的產生為[1,9]之間,最大需求資源的產生范圍為[0.9],已分配資源產生范圍為[0,5],申請資源產生范圍為[0,還需求數]。通過研究發現,改變系統可利用資源的產生范圍為[1,5]之間,實驗結果有80%為系統無足夠資源分配,直接結束程序。這是因為要能分配必須保證系統每一類可利用資源都滿足申請資源數,但系統可利用資源較少,隨機產生的申請資源數較高,且一旦系統資源種類有很多時要保證每一類都滿足是比較困難的。可以通過調高系統可利用資源的產生范圍或者調低隨機產生的系統資源種類數來提高申請通過率。

關於算法效率方面,在安全性檢測中用到了嵌套三層for循環來對每個進程進行嘗試分配檢測,時間復雜度為O(n3),由於銀行家算法的原理,每次嘗試分配資源之后必須對當前所有進程進行安全性檢測,找到一個安全序列之后才能成功分配,所以對每個進程的檢測是必不可少的,目前還沒有想到比較明顯的能夠實現該目的且效率較高的算法。

 

七、思考題

1、 如何設計程序的輸入模塊才能滿足實驗要求,請舉例說明; 

  由實驗要求可知,測試數據全部不可手工輸入。現在設定所有數據全部隨機生成。初始數據中,在[1,10]隨機生成資源類數和進程數,對Available數組、Max數組隨機生成數據並賦值,對Allocation數組的數據隨機生成中,要求生成的數據不可大於Max數組中對應數據,大於則重新生成。Need數組中數據要求為Max數組的值-已分配Allocation數組中對應的值。嵌套循環里進行相減賦值即可。設計申請資源向量request時,隨機產生的需求數一定要小於或等於需求數,在這里我寫的產生范圍為[0,還需求數]

2、 銀行家算法在實現過程中必須注意哪些資源分配細節才能避免死鎖?

(1)對比請求資源向量和系統當前可利用資源向量,如果某一類資源不滿足請求則直接返回分配資源失敗。

(2)系統可利用資源滿足需求時,試探性分配更新數據中,應使系統可利用資源Available=Available-request,已擁有資源Allocation=Allocation+request,需求向量Need=Need-request 

(3)初始化系統資源時應進行安全性檢測,如果初始化時產生的數據都無法使進程擁有安全序列,后面的銀行家算法執行將沒有任何意義。

、實驗數據及源代碼(學生必須提交自己設計的程序源代碼,並有注釋,源代碼電子版也一並提交),包括思考題的程序。

 程序完整代碼請轉至個人GitHub倉庫(如果喜歡,麻煩點個star✨謝謝~)

結語:隨筆僅供參考,千萬不要照抄哦~我相信你可以的~!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM