銀行家演算法的模擬實現
一、設計目的 1、瞭解多道程式系統中,多個程序併發執行的資源分配。 2、掌握死鎖的產生的原因、產生死鎖的必要條件和處理死鎖的基本方法。 3、掌握預防死鎖的方法,系統安全狀態的基本概念。 4、掌握銀行家演算法,瞭解資源在程序併發執行中的資源分配策略。 5、理解死鎖避免在當前計算機系統不常使用的原因。 二、設計任務 ①在Window98/2000 系統的TC2.0環境下執行程式; ②通過最有代表性的避免死鎖的演算法(Dijkstra)的銀行家演算法程式實現來理解程序併發中的資源分配,死鎖避免在死鎖解決中的可行性; ③ 設計程式在自動、手動方式下執行,理解銀行家演算法的實質。 | ||||||||||||||||||||||||||||||||
三、設計內容與步驟 A、銀行家演算法設計的知識準備。 1 2、關於死鎖的一些結論: Ø參與死鎖的程序最少是兩個 Ø(兩個以上程序才會出現死鎖) Ø參與死鎖的程序至少有兩個已經佔有資源 Ø參與死鎖的所有程序都在等待資源 Ø參與死鎖的程序是當前系統中所有程序的子集 注:如果死鎖發生,會浪費大量系統資源,甚至導致系統崩潰。 3、資源分類。 永久性資源: 可以被多個程序多次使用(可再用資源) l可搶佔資源 l不可搶佔資源 臨時性資源:只可使用一次的資源;如訊號量,中斷訊號,同步訊號等(可消耗性資源) “申請--分配--使用--釋放”模式 4、產生死鎖的四個必要條件:互斥使用(資源獨佔)、不可強佔(不可剝奪)、請求和保持(部分分配,佔有申請)、迴圈等待。 1) 互斥使用(資源獨佔) 一個資源每次只能給一個程序使用 2) 不可強佔(不可剝奪) 資源申請者不能強行的從資源佔有者手中奪取資源,資源只能由佔有者自願釋放 3) 請求和保持(部分分配,佔有申請) 一個程序在申請新的資源的同時保持對原有資源的佔有(只有這樣才是動態申請,動態分配) 4) 迴圈等待 存在一個程序等待佇列 {P1 , P2 , … , Pn}, 其中P1等待P2佔有的資源,P2等待P3佔有的資源,…,Pn等待P1佔有的資源,形成一個程序等待環路 5、死鎖的解決方案 5.1 產生死鎖的例子 申請不同型別資源產生死鎖 P1: … 申請印表機 申請掃描器 使用 釋放印表機 釋放掃描器 … P2: … 申請掃描器 申請印表機 使用 釋放印表機 釋放掃描器 … 申請同類資源產生死鎖(如記憶體) 設有資源R,R有m個分配單位,由n個程序P1,P2,…,Pn(n > m)共享。假設每個程序對R的申請和釋放符合下列原則: * 一次只能申請一個單位 * 滿足總申請後才能使用 * 使用完後一次性釋放 m=2,n=3 資源分配不當導致死鎖產生 5.2死鎖預防: 定義:在系統設計時確定資源分配演算法,保證不發生死鎖。具體的做法是破壞產生死鎖的四個必要條件之一 ①破壞“不可剝奪”條件 在允許程序動態申請資源前提下規定,一個程序在申請新的資源不能立即得到滿足而變為等待狀態之前,必須釋放已佔有的全部資源,若需要再重新申請 ②破壞“請求和保持”條件 要求每個程序在執行前必須一次性申請它所要求的所有資源,且僅當該程序所要資源均可滿足時才給予一次性分配 ③破壞“迴圈等待”條件 採用資源有序分配法: 把系統中所有資源編號,程序在申請資源時必須嚴格按資源編號的遞增次序進行,否則作業系統不予分配 6.安全狀態與不安全狀態 安全狀態: 如果存在一個由系統中所有程序構成的安全序列P1,…Pn,則系統處於安全狀態。一個程序序列{P1,…,Pn}是安全的,如果對於每一個程序Pi(1≤i≤n),它以後尚需要的資源量不超過系統當前剩餘資源量與所有程序Pj (j < i )當前佔有資源量之和,系統處於安全狀態 (安全狀態一定是沒有死鎖發生的) 不安全狀態:不存在一個安全序列,不安全狀態一定導致死鎖。 B、銀行家演算法 一、銀行家演算法中的資料結構 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個,方能完成其任務。 上述三個矩陣間存在下述關係: Need[i,j]=Max[i,j]-Allocation[i,j] 二、銀行家演算法 設Requesti是程序Pi的請求向量。如果Requesti[j]=k,表示程序只需要k個Rj型別的資源。當Pi發出資源請求後,系統按下述步驟進行檢查: (1)如果 Requesti[j]<=Need[i,j],則轉向步驟2;否則,認為出錯,因為它所需要的資源數已超過它所宣佈的最大值。 (2)如果Requesti[j]<=Available[j] ,則轉向步驟3;否則,表示系統中尚無足夠的資源,Pi必須等待。 (3)系統試探把要求的資源分配給程序Pi,並修改下面資料結構中的數值: Available[j]:=Available[j]-Requesti[j]; Allocation[i,j]:=Allocation[i,j]+Requesti[j]; Need[i,j]:=Need[i,j]-Requesti[j]; (4)系統執行安全性演算法,檢查此次資源分配後,系統是否處於安全狀態。若安全,才正式將資源分配給程序Pi,以完成本次分配;否則,將試探分配作廢,恢復原來的資源分配狀態,讓程序Pi等待。 三、安全性演算法 系統所執行的安全性演算法可描述如下: (1)設定兩個向量 ①、工作向量Work。它表示系統可提供給程序繼續執行所需要的各類資源數目,它含有m個元素,執行安全演算法開始時,Work = Available。 ②、Finish。它表示系統是否有足夠的資源分配給程序,使之執行完成,開始時先做Finish[i]:=false ;當有足夠資源分配給程序時,令 Finish[i]:=true。 (2)從程序集合中找到一個能滿足下述條件的程序: ①、Finish[i]=false; ②、Need[i,j]<=Work[j];如找到,執行步驟(3);否則,執行步驟(4)。 (3)當程序Pi獲得資源後,可順利執行,直至完成,並釋放出分配給它的資源,故應執行: Work[j]:=Work[i]+Allocation[i,j]; Finish[i]:=true; goto step 2; (4)如果所有程序的Finish[i]:=true,則表示系統處於安全狀態;否則,系統處於不安全狀態。 四、銀行家演算法之例 假定系統中有五個程序:{P0,P1,P2,P3,P4}和三種類型的資源{A,B,C},每一種資源的數量分別為10、5、7,在T0時刻的資源分配情況如圖1所示。
|