版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
1、<p> 操作系統(tǒng)課程設計報告 </p><p><b> 1、概述</b></p><p><b> 一、設計目的</b></p><p> 1.對死鎖避免中的銀行家算法作進一步理解。</p><p> 2.加深理解死鎖的概念。 </p><p>
2、3.加深理解安全序列和安全狀態(tài)的概念。</p><p> 4.通過編寫和調(diào)試一個系統(tǒng)動態(tài)分配資源的簡單模擬程序,觀察死鎖產(chǎn)生的條件,并采用適當?shù)乃惴?,有效地防止和避免死鎖地發(fā)生。</p><p> 二、開發(fā)環(huán)境 操作系統(tǒng) Windows xp</p><p> 編譯環(huán)境 VC++6.0</p><p&g
3、t; 生成文件 銀行家算法.cpp</p><p><b> 2、需求分析</b></p><p><b> 一、死鎖概念:</b></p><p> 是指兩個或兩個以上的進程在執(zhí)行過程中,因爭奪資源而造成的一種互相等待的現(xiàn)象,若無外力作用,它們都將無法推進下去.此時稱系統(tǒng)處于死鎖狀態(tài)或系統(tǒng)產(chǎn)生了死
4、鎖,這些永遠在互相等待的進程稱為死鎖進程. 由于資源占用是互斥的,當某個進程提出申請資源后,使得有關進程在無外力協(xié)助下,永遠分配不到必需的資源而無法繼續(xù)運行,這就產(chǎn)生了死鎖。</p><p> 二、關于死鎖的一些結(jié)論:</p><p> 1.參與死鎖的進程最少是兩個(兩個以上進程才會出現(xiàn)死鎖) </p><p> 2.參與死鎖的進程至少有兩個已經(jīng)占有資源
5、</p><p> 3.參與死鎖的所有進程都在等待資源 </p><p> 4.參與死鎖的進程是當前系統(tǒng)中所有進程的子集 </p><p> 如果死鎖發(fā)生,會浪費大量系統(tǒng)資源,甚至導致系統(tǒng)崩潰。 </p><p><b> 資源分類:</b></p><p><b> 永久性資
6、源: </b></p><p> 可以被多個進程多次使用(可再用資源) </p><p> 1) 可搶占資源 </p><p> 2) 不可搶占資源 </p><p><b> 臨時性資源:</b></p><p> 只
7、可使用一次的資源;如信號量,中斷信號,同步信號等(可消耗性資源) </p><p> “申請--分配--使用--釋放”模式 </p><p> 產(chǎn)生死鎖的四個必要條件:</p><p> 1、互斥使用(資源獨占) </p><p> 一個資源每次只能給一個進程使用 </p><p> 2、不可強占(不可剝奪)
8、 </p><p> 資源申請者不能強行的從資源占有者手中奪取資源,資源只能由占有者自愿釋放 </p><p> 3、請求和保持(部分分配,占有申請) </p><p> 一個進程在申請新的資源的同時保持對原有資源的占有(只有這樣才是動態(tài)申請,動態(tài)分配) </p><p><b> 4、循環(huán)等待 </b><
9、/p><p> 存在一個進程等待隊列 {P1 , P2 , … , Pn}, 其中P1等待P2占有的資源,P2等待P3占有的資源,…,Pn等待P1占有的資源,形成一個進程等待環(huán)路 。</p><p><b> 死鎖的解決方案</b></p><p> 5.1產(chǎn)生死鎖的例子 </p><p> 申請不同類型
10、資源產(chǎn)生死鎖 </p><p><b> P1: </b></p><p><b> … </b></p><p><b> 申請打印機 </b></p><p><b> 申請掃描儀 </b></p><p><b&
11、gt; 使用 </b></p><p><b> 釋放打印機 </b></p><p><b> 釋放掃描儀 </b></p><p><b> … </b></p><p><b> P2: </b></p><
12、p><b> … </b></p><p><b> 申請掃描儀 </b></p><p><b> 申請打印機 </b></p><p><b> 使用 </b></p><p><b> 釋放打印機 </b><
13、;/p><p><b> 釋放掃描儀 </b></p><p><b> … </b></p><p> 申請同類資源產(chǎn)生死鎖(如內(nèi)存) </p><p> 設有資源R,R有m個分配單位,由n個進程P1,P2,…,Pn(n > m)共享。假設每個進程對R的申請和釋放符合下列原則: <
14、/p><p> * 一次只能申請一個單位 </p><p> * 滿足總申請后才能使用 </p><p> * 使用完后一次性釋放 </p><p><b> m=2,n=3 </b></p><p> 資源分配不當導致死鎖產(chǎn)生</p><p><b>
15、5.2死鎖預防:</b></p><p><b> 摒棄“請求和保持”</b></p><p><b> 摒棄“不剝奪”條件</b></p><p><b> 摒棄“環(huán)路等待”</b></p><p> 5.3安全狀態(tài)與不安全狀態(tài) :</p>
16、<p> 安全狀態(tài) :如果操作系統(tǒng)能保證所有的進程在 有限的時間 內(nèi)得到需要的 全部資源 ,則稱系統(tǒng)處于“安全狀態(tài)”。</p><p><b> 3、數(shù)據(jù)結(jié)構(gòu)設計</b></p><p> 一、可利用資源向量矩陣AVAILABLE。這是一個含有M個元素的數(shù)組,其中的每一個元素代表一類可利用的資源數(shù)目,其初始值是系統(tǒng)中所配置的該類全部可用資源的數(shù)目,其數(shù)
17、值隨該類資源的分配和回收而動態(tài)地改變。如果AVAILABLE [j]= K,則表示系統(tǒng)中現(xiàn)有R類資源K個</p><p> 二、最大需求矩陣MAX。這是一個N*M的矩陣,用以表示每一個進程對M類資源的最大需求。如果MAX [i,j]=K,則表示進程I需要R類資源的數(shù)目為K。</p><p> 三、分配矩陣ALLOCATION。這也是一個N*M的矩陣,它定義了系統(tǒng)中每一類資源當前已分配給
18、每一進程的資源數(shù)。如果ALLOCATION [i,j]=K,則表示進程i當前已分得R類資源的數(shù)目為K。</p><p> 四、需求矩陣NEED。這也是一個n*m的矩陣,用以表示每一個進程尚需的各類資源數(shù)。如果NEED [i,j]=K,則表示進程i還需要R類資源K個,才能完成其任務。 上述矩陣存在下述關系:</p><p> NEED [i,j]= MAX[i,j]﹣ AL
19、LOCATION[i,j] 4、算法的實現(xiàn)</p><p><b> 初始化</b></p><p> 由用戶輸入數(shù)據(jù),分別對可利用資源向量矩陣AVAILABLE、最大需求矩陣MAX、分配矩陣ALLOCATION、需求矩陣NEED賦值。</p><p><b> 銀行家算法</b></p>
20、<p> 在避免死鎖的方法中,所施加的限制條件較弱,有可能獲得令人滿意的系統(tǒng)性能。在該方法中把系統(tǒng)的狀態(tài)分為安全狀態(tài)和不安全狀態(tài),只要能使系統(tǒng)始終都處于安全狀態(tài),便可以避免發(fā)生死鎖。</p><p> 銀行家算法的基本思想是分配資源之前,判斷系統(tǒng)是否是安全的;若是,才分配。它是最具有代表性的避免死鎖的算法。</p><p> 設進程cusneed提出請求REQUEST
21、[i],則銀行家算法按如下規(guī)則進行判斷。</p><p> (1)如果REQUEST [cusneed] [i]<= NEED[cusneed][i],則轉(zhuǎn)(2);否則,出錯。</p><p> (2)如果REQUEST [cusneed] [i]<= AVAILABLE[cusneed][i],則轉(zhuǎn)(3);否則,出錯。</p><p> (3)系
22、統(tǒng)試探分配資源,修改相關數(shù)據(jù):</p><p> AVAILABLE[i]-=REQUEST[cusneed][i];</p><p> ALLOCATION[cusneed][i]+=REQUEST[cusneed][i];</p><p> NEED[cusneed][i]-=REQUEST[cusneed][i];</p><p>
23、; (4)系統(tǒng)執(zhí)行安全性檢查,如安全,則分配成立;否則試探險性分配作廢,系統(tǒng)恢復原狀,進程等待。</p><p><b> 三、安全性檢查算法</b></p><p> (1)設置兩個工作向量Work=AVAILABLE;FINISH</p><p> (2)從進程集合中找到一個滿足下述條件的進程,</p><p&g
24、t; FINISH==false;</p><p> NEED<=Work;</p><p> 如找到,執(zhí)行(3);否則,執(zhí)行(4)</p><p> (3)設進程獲得資源,可順利執(zhí)行,直至完成,從而釋放資源。</p><p> Work+=ALLOCATION;</p><p> Finish=tr
25、ue;</p><p><b> GOTO 2</b></p><p> (4)如所有的進程Finish= true,則表示安全;否則系統(tǒng)不安全。</p><p><b> 四、各算法流程圖 </b></p><p><b> 初始化算法流程圖:</b></p&g
26、t;<p><b> 銀行家算法流程圖:</b></p><p><b> 源程序清單</b></p><p> #include "iostream.h"</p><p> int main(int argc, char* argv[])</p><p>
27、<b> {</b></p><p> int I,J,i,i1,j,n,sign;</p><p> int avail[10],max[10][10],alloc[10][10],need[10][10],requ[10][10],work[10],finish[10];</p><p> cout<<"請輸入
28、進程數(shù)和資源數(shù),以空格分開:";</p><p> cin>>I>>J;</p><p> for(i=0;i<I;i++)</p><p><b> {</b></p><p> for(j=0;j<J;j++)</p><p><b&
29、gt; {</b></p><p> cout<<"請輸入進程"<<i<<"對資源"<<j<<"的最大需求量:";</p><p> cin>>max[i][j]; /*初始化max*/</p><p><
30、b> }</b></p><p><b> }</b></p><p> for(i=0;i<I;i++)</p><p><b> {</b></p><p> for(j=0;j<J;j++)</p><p><b>
31、{</b></p><p> cout<<"請輸入進程"<<i<<"已分配到資源"<<j<<"的數(shù)量:";</p><p> cin>>alloc[i][j]; /*初始化alloc*/</p><p><b&g
32、t; }</b></p><p><b> }</b></p><p> for(i=0;i<I;i++)</p><p><b> {</b></p><p> for(j=0;j<J;j++)</p><p><b> {&l
33、t;/b></p><p> cout<<"請輸入進程"<<i<<"還需要資源"<<j<<"的數(shù)量:";</p><p> cin>>need[i][j]; /*初始化need*/</p><p><b> }
34、</b></p><p><b> }</b></p><p> for(j=0;j<J;j++)</p><p><b> {</b></p><p> cout<<"資源"<<j<<"可利用數(shù)量:&quo
35、t;;</p><p> cin>>avail[j]; /*初始化avail*/</p><p><b> }</b></p><p> /*************用安全性算法判斷系統(tǒng)初始化后的當前狀態(tài)是否安全 START ************/</p><p> for(j=0;j&
36、lt;J;j++)</p><p><b> {</b></p><p> work[j]=avail[j];</p><p><b> }</b></p><p> for(i=0;i<I;i++)</p><p><b> {</b>
37、</p><p> finish[i]=0; /*設置兩個工作向量*/</p><p><b> }</b></p><p> A1:for(i=0;i<I;i++)</p><p><b> {</b></p><p> sign=1;
38、 /*sign==1表示need<=work*/</p><p> for(j=0;j<J;j++)</p><p><b> {</b></p><p> if(need[i][j]>work[j])</p><p><b> {</b></p&g
39、t;<p><b> sign=0;</b></p><p> } </p><p><b> }</b></p><p> if(finish[i]==0&&sign==1)</p><p><b>
40、{</b></p><p> for(j=0;j<J;j++)</p><p><b> {</b></p><p> work[j]=work[j]+alloc[i][j];</p><p><b> }</b></p><p> finish[
41、i]=1; /*設置finish向量*/ </p><p> cout<<"P"<<i<<endl; /*輸出安全序列*/</p><p><b> goto A1;</b></p><p><b> }</b></p&
42、gt;<p><b> }</b></p><p> sign=1; /*判斷系統(tǒng)狀態(tài)是否安全*/</p><p> for(i=0;i<I;i++) </p><p><b> {</b></p><p> if(finish[i]==0)</p&g
43、t;<p> sign=0; </p><p><b> }</b></p><p> if(sign==0)</p><p><b> {</b></p><p> cout<<"當前系統(tǒng)處于不安全狀態(tài)."<<en
44、dl; </p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> cout<<"當前系統(tǒng)處于安全狀態(tài),可以接受資源請求."<<endl;
45、 </p><p><b> }</b></p><p> /*************用安全性算法判斷系統(tǒng)初始化后的當前狀態(tài)是否安全 END ************/</p><p> /***********************設置請求向量 START ***********************/</p&g
46、t;<p> S:cout<<"請輸入請求資源的進程的進程號:";</p><p> cin>>i; i1=i;</p><p> for(j=0;j<J;j++)</p><p><b> {</b></p><p> cout<&l
47、t;"請輸入進程"<<i<<"請求的資源"<<j<<"的數(shù)量:";</p><p> cin>>requ[i][j];/*進程請求資源*/</p><p><b> }</b></p><p> for(j=0;j&
48、lt;J;j++)</p><p><b> {</b></p><p> if(requ[i][j]>need[i][j])</p><p><b> {</b></p><p> cout<<"錯誤!請求數(shù)超過需要數(shù)!"<<endl;&l
49、t;/p><p><b> goto S;</b></p><p><b> }</b></p><p><b> }</b></p><p> for(j=0;j<J;j++)</p><p><b> {</b>&l
50、t;/p><p> if(requ[i][j]>avail[j])</p><p><b> {</b></p><p> cout<<"可利用資源不足,無法分配。"<<endl;</p><p><b> goto S;</b></p&g
51、t;<p><b> }</b></p><p><b> }</b></p><p> /***********************設置請求向量 END ***********************/</p><p> for(j=0;j<J;j++)</p><p&
52、gt;<b> {</b></p><p> avail[j]=avail[j]-requ[i][j]; /*系統(tǒng)嘗試分配資源*/</p><p> alloc[i][j]=alloc[i][j]+requ[i][j];</p><p> need[i][j]=need[i][j]-requ[i][j];</
53、p><p><b> }</b></p><p> /*************************安全性算法START****************************/</p><p> for(j=0;j<J;j++)</p><p><b> {</b></p>
54、;<p> work[j]=avail[j];</p><p><b> }</b></p><p> for(i=0;i<I;i++)</p><p><b> {</b></p><p> finish[i]=0; /*設置兩個工作向量*/</
55、p><p><b> }</b></p><p> A2:for(i=0;i<I;i++)</p><p><b> {</b></p><p> sign=1; /*sign==1表示need<=work*/</p><p> fo
56、r(j=0;j<J;j++)</p><p><b> {</b></p><p> if(need[i][j]>work[j])</p><p><b> {</b></p><p><b> sign=0;</b></p><p>
57、; } </p><p><b> }</b></p><p> if(finish[i]==0&&sign==1)</p><p><b> {</b></p><p> for(j=0;j<J;j++)</p&g
58、t;<p><b> {</b></p><p> work[j]=work[j]+alloc[i][j];</p><p><b> }</b></p><p> finish[i]=1; /*設置finish向量*/ </p><p> co
59、ut<<"P"<<i<<endl; /*輸出安全序列*/</p><p><b> goto A2;</b></p><p><b> }</b></p><p><b> }</b></p><p><
60、b> sign=1;</b></p><p> for(i=0;i<I;i++)</p><p><b> {</b></p><p> if(finish[i]==0)</p><p> sign=0; /*判斷系統(tǒng)狀態(tài)是否安全*/</p><p&
61、gt;<b> }</b></p><p> if(sign==0)</p><p><b> {</b></p><p> cout<<"不安全,系統(tǒng)已收回嘗試分配的資源!"<<endl; /*若不安全,不予分配,并將數(shù)據(jù)修改回原來的值*/</p>
62、<p> for(j=0;j<J;j++) </p><p><b> {</b></p><p> avail[j]=avail[j]+requ[i1][j];</p><p> alloc[i1][j]=alloc[i1][j]-requ[i1][j];</p><p&g
63、t; need[i1][j]=need[i1][j]+requ[i1][j];</p><p><b> }</b></p><p><b> goto S;</b></p><p><b> }</b></p><p><b> else</b>
64、;</p><p><b> {</b></p><p> cout<<"安全,可以分配."<<endl; /*若安全,則可以分配*/</p><p><b> goto S;</b></p><p><b> }</b
65、></p><p> /*************************安全性算法END****************************/</p><p><b> return 0;</b></p><p><b> }</b></p><p><b> 5、結(jié)束
66、語 </b></p><p> 心得與體會:銀行家算法是避免死鎖的一種重要方法,通過編寫一個簡單的銀行家算法程序,加深了解有關資源申請、避免死鎖等概念,并體會和了解死鎖和避免死鎖的具體實施方法。銀行家算法是為了使系統(tǒng)保持安全狀態(tài)。我們可以把操作系統(tǒng)看作是銀行家,操作系統(tǒng)管理的資源相當于銀行家管理的資金,進程向操作系統(tǒng)請求分配資源相當于用戶向銀行家貸款。操作系統(tǒng)按照銀行家制定的規(guī)則為進程分配資源,當進
67、程首次申請資源時,要測試該進程對資源的最大需求量,如果系統(tǒng)現(xiàn)存的資源可以滿足它的最大需求量則按當前的申請量分配資源,否則就推遲分配。當進程在執(zhí)行中繼續(xù)申請資源時,先測試該進程已占用的資源數(shù)與本次申請的資源數(shù)之和是否超過了該進程對資源的最大需求量。若超過則拒絕分配資源,若沒有超過則再測試系統(tǒng)現(xiàn)存的資源能否滿足該進程尚需的最大資源量,若能滿足則按當前的申請量分配資源,否則也要推遲分配。 </p><p> 死鎖的產(chǎn)
68、生,必須同時滿足四個條件,即一個資源每次只能由一個進程占有;第二個為等待條件,即一個進程請求資源不能滿足時,它必須等待,單它仍繼續(xù)寶石已得到的所有其他資源;第三個為非剝奪條件,即在出現(xiàn)死鎖的系統(tǒng)中一定有不可剝奪使用的資源;第四個為循環(huán)等待條件,系統(tǒng)中存在若干個循環(huán)等待的進程,即其中每一個進程分別等待它前一個進程所持有的資源。防止死鎖的機構(gòu)只能確保上述四個條件之一不出現(xiàn),則系統(tǒng)就不會發(fā)生死鎖。通過這個算法可以用來解決生活中的實際問題,如銀
69、行貸款等。</p><p> 銀行家算法能保證系統(tǒng)時時刻刻都處于安全狀態(tài),但它要不斷檢測每個進程對各類資源的占用和申請情況,需花費較多的時間。</p><p> 經(jīng)過這次設計,讓我基明白了銀行家算法的基本原理,加深了對課堂上知識的理解,也懂得了如何讓銀行家算法實現(xiàn)。</p><p><b> 實例:</b></p><
70、p> ?。?)下列狀態(tài)是否安全?(三個進程共享12個同類資源)</p><p> 進程 已分配資源數(shù)
71、; 最大需求數(shù)</p><p> 1
72、0; 1 &
73、#160; 4
74、0; (狀態(tài)a)</p><p> 2
75、60; 4
76、 4</p><p> 3
77、60; 5
78、 8</p><p> 1
79、60; 1
80、
81、0; 4 (狀態(tài)b)</p><p> 2
82、160; 4
83、; 6</p><p> 3
84、160; 6
85、;
86、60;8</p><p> 狀態(tài)a安全,序列為:2-->1--> 3</p><p> 狀態(tài)b不安全,只剩1個可用資源,收不回已分配資源。</p><p> ?。?)考慮下列系統(tǒng)狀態(tài)</p><p> 分配矩陣
87、0; 最大需求矩陣
88、160; 可用資源矩陣</p><p> 0 0 1 2
89、160; 0 0 1 2&
90、#160; 1 5
91、60; 2 0</p><p> 1 0 0 0
92、160; 1 7 5 0</p><p> 1 3 5 4
93、; 2 3 5 6</p><p> 0 6
94、0;3 2 0
95、;6 5 2</p><p> 0 0 1 4
96、60; 0 6 5 6</p><p> 問系統(tǒng)是否安全?若安全就給出所有的安全序列。若進程2請求(0420),可否立即分配?</p><p> 答:安全。安全序列為:1-->3-->2--&
97、gt;5-->4。</p><p> 若進程2請求(0420),可立即分配。分配后可用資源為1 1 0 0,回收1進程資源,</p><p> 可用資源數(shù)為:1 1 1 2,然后執(zhí)行3-->2-->5-->4序列。</p><p><b> 6、參考文獻</b></p><p> 1、湯子
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 操作系統(tǒng)課程設計-- 操作系統(tǒng)
- 操作系統(tǒng)課程設計
- 操作系統(tǒng)課程設計
- 操作系統(tǒng)課程設計
- 操作系統(tǒng)課程設計
- 操作系統(tǒng)課程設計
- 操作系統(tǒng)課程設計
- 內(nèi)存管理(操作系統(tǒng))操作系統(tǒng)課程設計
- 操作系統(tǒng)課程設計題目
- 操作系統(tǒng)課程設計報告
- 操作系統(tǒng)課程設計論文
- 操作系統(tǒng)課程設計 (4)
- 操作系統(tǒng)課程設計1
- 課程設計報告--操作系統(tǒng)
- linux操作系統(tǒng)課程設計
- 操作系統(tǒng)課程設計報告
- 操作系統(tǒng)原理課程設計
- 操作系統(tǒng)課程設計--模擬操作系統(tǒng)的實現(xiàn)
- 操作系統(tǒng)課程設計報告
- 操作系統(tǒng)課程設計1
評論
0/150
提交評論