計算機作業系統課程設計
課程設計題目 共享資源分配與銀行家演算法
一、課程設計目的和意義
此次課程設計的主要內容是模擬實現資源分配。同時要求編寫和除錯一個系統動態分配資源的簡單模擬程式,觀察死鎖產生的條件,並使用適當的演算法,有效的防止和避免死鎖的發生。
具體用銀行家演算法實現資源分配。要求如下:
(1) 設計一個3個併發程序共享3類不同資源的系統,程序可動態地申請資源和釋放資源,系統按各程序的申請動態地分配資源。
(2) 設計用銀行家演算法和隨機分配演算法,實現資源分配的兩個資源分配程式,應具有顯示或列印各程序依次要求申請的資源數以及依次分配資源的情況。
(3) 確定一組各程序依次申請資源數的序列,在相同的情況下分別執行上述兩種資源分配程式,觀察執行結果。
銀行家演算法是避免死鎖的一種重要方法,本實驗要求用高階語言編寫和除錯一個簡單的銀行家演算法程式。加深瞭解有關資源申請、避免死鎖等概念,並體會和了解死鎖和避免死鎖的具體實施方法。死鎖的產生,必須同時滿足四個條件,即一個資源每次只能由一個程序佔用:第二個為等待條件,即一個程序請求資源不能滿足時,它必須等待,但它仍繼續保持已得到的所有其他資源:第四個為迴圈等待條件,系統中存在若干個迴圈等待的程序,即其中每一個程序分別等待它前一個程序所持有的資源。防止死鎖的機構只能確保上述四個條件之一不出現,則系統就不會發生死鎖。通過這個演算法可用解決生活中的實際問題,如銀行貸款等.
通過對這個演算法的設計,讓學生能夠對書本知識有更深的理解,在操作和其它方面有更高的提升.
二、方案設計及開發過程
隨機分配演算法:當程序申請資源時,如果系統中現存資源數能滿足程序的當前資源申請量,就把資源能會產生死鎖。隨機分配演算法很容易進入死鎖.
銀行家分配演算法,顧名思義是來源於銀行的借貸業務,一定數量的本金要應多個客戶的借貸週轉,為了防止銀行加資金無法週轉而倒閉,對每一筆貸款,必須考察其是否能限期歸還。在作業系統中研究資源分配策略時也有類似問題,系統中有限的資源要供多個程序使用,必須保證得到的資源的程序能在有限的時間內歸還資源,以供其他程序使用資源。如果資源分配不得到就會發生程序迴圈等待資源,個程序都無法繼續執行下去的死鎖現象。
把個程序需要和已佔有資源的情況記錄在程序控制中,假定程序控制塊PCB其中“狀態”有就緒態、等待態和完成態。當程序在處於等待態時,表示系統不能滿足該程序當前的資源申請。“資源需求總量”表示程序在整個執行過程中總共要申請的資源量。顯然,,每個程序的資源需求總量不能超過系統擁有的資源總數, 銀行演算法進行資源分配可以避免死鎖.
2.演算法描述
隨機分配演算法:
設程序I提出請求Request[N],則銀行家演算法按如下規則進行判斷
(1) 如果Request[N]<=AVAILABLE,則轉(2);否則,出錯。
(2) 系統分配資源,修改相關資料:
AVAILABLE=AVAILABLE-REQUEST
ALLOCATION=ALLOCATION+REQUEST
NEED=NEED-REQUES
(3) 系統執行安全性檢查
銀行家演算法:
設程序I提出請求Request[N],則銀行家演算法按如下規則進行判斷。
(1)如果Request[N]<=NEED[I,N],則轉(2);否則,出錯。
(2)如果Request[N]<=AVAILABLE,則轉(3);否則,出錯。
(3)系統試探分配資源,修改相關資料:
AVAILABLE=AVAILABLE-REQUEST
ALLOCATION=ALLOCATION+REQUEST
NEED=NEED-REQUEST
(4)系統執行安全性檢查,如安全,則分配成立;否則試探險性分配作廢,系統恢復原狀,程序等待。
3.安全性檢查
(1)設定兩個工作向量WORK=AVAILABLE;FINISH[M]=FALSE
(2)從程序集合中找到一個滿足下述條件的程序,
FINISH[i]=FALSE
NEED<=WORK
如找到,執行(3);否則,執行(4)
(3)設程序獲得資源,可順利執行,直至完成,從而釋放資源。
WORK=WORK+ALLOCATION
FINISH=TRUE
GO TO 2
(4)如所有的程序Finish[M]=true,則表示安全;否則系統不安全。
3.資料結構
假設有M個程序N類資源,則有如下資料結構:
#define W 10
#define R 20
int M ; //總程序數
int N ; //資源種類
int ALL_RESOURCE[W]; //各種資源的數目總和
int MAX[W][R]; //M個程序對N類資源最大資源需求量
int AVAILABLE[R]; //系統可用資源數
int ALLOCATION[W][R]; //M個程序已經得到N類資源的資源量
int NEED[W][R]; //M個程序還需要N類資源的資源量
int Request[R]; //請求資源個數
4.主要函式說明
void showdata(); //主要用來輸出資源分配情況
void changdata(int); //主要用來輸出資源分配後後的情況
void rstordata(int); //用來恢復資源分配情況,如:銀行家演算法時,由於分配不安全
則要恢復資源分配情況
int chkerr(int); //銀行家分配演算法的安全檢查
int chkerr2(int) ; //隨機分配演算法安全檢查
void bank() ; //銀行家演算法
void randomallocation(); //隨機分配演算法