版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p> 設(shè)計(jì)題目: 銀行家算法 </p><p><b> 一、設(shè)計(jì)目的</b></p><p> 本課程設(shè)計(jì)是學(xué)習(xí)完“操作系統(tǒng)原理”課程后進(jìn)行的一次全面的綜合訓(xùn)練,通過(guò)課程設(shè)計(jì),更好地掌握操作系統(tǒng)的原理及實(shí)現(xiàn)方法,加深對(duì)操作系統(tǒng)基礎(chǔ)理論和重要算法的理解,加強(qiáng)學(xué)生的動(dòng)手能力。</p><p><
2、;b> 二、設(shè)計(jì)內(nèi)容</b></p><p><b> 1)概述</b></p><p> 用C或C++語(yǔ)言編制銀行家算法通用程序,并檢測(cè)所給狀態(tài)的系統(tǒng)安全性。</p><p> 算法介紹:數(shù)據(jù)結(jié)構(gòu):</p><p> 可利用資源向量 Available;</p><p&g
3、t; 最大需求矩陣Max;</p><p> 分配矩陣Allocation;</p><p><b> 需求矩陣Need</b></p><p><b> 功能介紹</b></p><p> 模擬實(shí)現(xiàn)Dijkstra的銀行家算法以避免死鎖的出現(xiàn),分兩部分組成:</p><
4、;p> 第一部分:銀行家算法(掃描);</p><p> 第二部分:安全性算法。</p><p><b> 2)設(shè)計(jì)原理</b></p><p> 一.銀行家算法的基本概念</p><p><b> 1、死鎖概念。</b></p><p> 在多道程序系統(tǒng)中
5、,雖可借助于多個(gè)進(jìn)程的并發(fā)執(zhí)行,來(lái)改善系統(tǒng)的資源利用率,提高系統(tǒng)的吞吐量,但可能發(fā)生一種危險(xiǎn)━━死鎖。所謂死鎖(Deadlock),是指多個(gè)進(jìn)程在運(yùn)行中因爭(zhēng)奪資源而造成的一種僵局(Deadly_Embrace),當(dāng)進(jìn)程處于這種僵持狀態(tài)時(shí),若無(wú)外力作用,它們都將無(wú)法再向前推進(jìn)。一組進(jìn)程中,每個(gè)進(jìn)程都無(wú)限等待被該組進(jìn)程中另一進(jìn)程所占有的資源,因而永遠(yuǎn)無(wú)法得到的資源,這種現(xiàn)象稱(chēng)為進(jìn)程死鎖,這一組進(jìn)程就稱(chēng)為死鎖進(jìn)程。</p>&l
6、t;p> 2、關(guān)于死鎖的一些結(jié)論: </p><p> ? 參與死鎖的進(jìn)程最少是兩個(gè) </p><p> ? (兩個(gè)以上進(jìn)程才會(huì)出現(xiàn)死鎖) </p><p> ? 參與死鎖的進(jìn)程至少有兩個(gè)已經(jīng)占有資源 </p><p> ? 參與死鎖的所有進(jìn)程都在等待資源 </p><p> ? 參與死鎖的進(jìn)
7、程是當(dāng)前系統(tǒng)中所有進(jìn)程的子集 </p><p> 注:如果死鎖發(fā)生,會(huì)浪費(fèi)大量系統(tǒng)資源,甚至導(dǎo)致系統(tǒng)崩潰。 </p><p><b> 3、資源分類(lèi)。 </b></p><p><b> 永久性資源: </b></p><p> 可以被多個(gè)進(jìn)程多次使用(可再用資源) </p>
8、<p> ? 可搶占資源 </p><p> ? 不可搶占資源 </p><p> 臨時(shí)性資源:只可使用一次的資源;如信號(hào)量,中斷信號(hào),同步信號(hào)等(可消耗性資源) </p><p> “申請(qǐng)--分配--使用--釋放”模式 </p><p> 4、產(chǎn)生死鎖的四個(gè)必要條件:互斥使用(資源獨(dú)占)、
9、不可強(qiáng)占(不可剝奪)、請(qǐng)求和保持(部分分配,占有申請(qǐng))、循環(huán)等待。 </p><p> 1) 互斥使用(資源獨(dú)占) </p><p> 一個(gè)資源每次只能給一個(gè)進(jìn)程使用。</p><p> 2) 不可強(qiáng)占(不可剝奪) </p><p> 資源申請(qǐng)者不能強(qiáng)行的從資源占有者手中奪取資源,資源只能由占有者自愿釋放。</p>&l
10、t;p> 3) 請(qǐng)求和保持(部分分配,占有申請(qǐng)) </p><p> 一個(gè)進(jìn)程在申請(qǐng)新的資源的同時(shí)保持對(duì)原有資源的占有(只有這樣才是動(dòng)態(tài)申請(qǐng),動(dòng)態(tài)分配)。</p><p><b> 4) 循環(huán)等待 </b></p><p> 存在一個(gè)進(jìn)程等待隊(duì)列 </p><p> {P1 , P2 , … , Pn},
11、 </p><p> 其中P1等待P2占有的資源,P2等待P3占有的資源,…,Pn等待P1占有的資源,形成一個(gè)進(jìn)程等待環(huán)路。</p><p><b> 5、死鎖預(yù)防: </b></p><p> 定義:在系統(tǒng)設(shè)計(jì)時(shí)確定資源分配算法,保證不發(fā)生死鎖。具體的做法是破壞產(chǎn)生死鎖的四個(gè)必要條件之一。</p><p> ?、?/p>
12、破壞“不可剝奪”條件 </p><p> 在允許進(jìn)程動(dòng)態(tài)申請(qǐng)資源前提下規(guī)定,一個(gè)進(jìn)程在申請(qǐng)新的資源不能立即得到滿(mǎn)足而變?yōu)榈却隣顟B(tài)之前,必須釋放已占有的全部資源,若需要再重新申請(qǐng) </p><p> ?、谄茐摹罢?qǐng)求和保持”條件。 </p><p> 要求每個(gè)進(jìn)程在運(yùn)行前必須一次性申請(qǐng)它所要求的所有資源,且僅當(dāng)該進(jìn)程所要資源均可滿(mǎn)足時(shí)才給予一次性分配。 </p
13、><p> ③破壞“循環(huán)等待”條件 </p><p> 采用資源有序分配法: </p><p> 把系統(tǒng)中所有資源編號(hào),進(jìn)程在申請(qǐng)資源時(shí)必須嚴(yán)格按資源編號(hào)的遞增次序進(jìn)行,否則操作系統(tǒng)不予分配。 </p><p> 6.安全狀態(tài)與不安全狀態(tài) </p><p><b> 安全狀態(tài): </b>&l
14、t;/p><p> 如果存在一個(gè)由系統(tǒng)中所有進(jìn)程構(gòu)成的安全序列P1,…Pn,則系統(tǒng)處于安全狀態(tài)。一個(gè)進(jìn)程序列{P1,…,Pn}是安全的,如果對(duì)于每一個(gè)進(jìn)程Pi(1≤i≤n),它以后尚需要的資源量不超過(guò)系統(tǒng)當(dāng)前剩余資源量與所有進(jìn)程Pj (j < i )當(dāng)前占有資源量之和,系統(tǒng)處于安全狀態(tài) (安全狀態(tài)一定是沒(méi)有死鎖發(fā)生的) </p><p> 不安全狀態(tài):不存在一個(gè)安全序列,不安全狀態(tài)一
15、定導(dǎo)致死鎖。</p><p><b> 二.銀行家算法</b></p><p> 1、銀行家算法中的數(shù)據(jù)結(jié)構(gòu) </p><p> 1)可利用資源向量Available </p><p> 它是一個(gè)含有m個(gè)元素的數(shù)組,其中的每一個(gè)元素代表一類(lèi)可利用的資源數(shù)目,其初始值是系統(tǒng)中所配置的該類(lèi)全部可用資源數(shù)目。其數(shù)值隨該
16、類(lèi)資源的分配和回收而動(dòng)態(tài)地改變。如果Available[j]=K,則表示系統(tǒng)中現(xiàn)有Rj類(lèi)資源K個(gè)。 </p><p> 2)最大需求短陣Max </p><p> 這是—個(gè)n×m的矩陣,它定義了系統(tǒng)中n個(gè)進(jìn)程中的每一個(gè)進(jìn)程對(duì)m類(lèi)資源的最大需求。如果Max(i,j)=K,表示進(jìn)程i需要Rj類(lèi)資源的最大數(shù)目為K。 </p><p> 3)分配短陣Allo
17、cation </p><p> 這是一個(gè)n×m的矩陣,它定義了系統(tǒng)中每一類(lèi)資源當(dāng)前已分配給每個(gè)進(jìn)程的資源數(shù)。如果Allocation(i,j)=K,表示進(jìn)程i當(dāng)前已分得Rj類(lèi)資源的數(shù)目為K。 </p><p> 4)需求矩陣Need </p><p> 它是一個(gè)n×m的矩陣,用以表示每一個(gè)進(jìn)程尚需的各類(lèi)資源數(shù),如果Need[i,j]=K,
18、則表示進(jìn)程i還需要Rj類(lèi)資源k個(gè),方能完成其任務(wù)。 </p><p> 上述三個(gè)矩陣間存在下述關(guān)系: </p><p> Need[i,j]=Max[i,j]-Allocation[i,j] </p><p><b> 2、銀行家算法 </b></p><p> 設(shè)Requesti是進(jìn)程Pi的請(qǐng)求向量。如果Req
19、uesti[j]=k,表示進(jìn)程只需要k個(gè)Rj類(lèi)型的資源。當(dāng)Pi發(fā)出資源請(qǐng)求后,系統(tǒng)按下述步驟進(jìn)行檢查: </p><p> 1)如果 Requesti[j]<=Need[i,j],則轉(zhuǎn)向步驟2;否則,認(rèn)為出錯(cuò),因?yàn)樗枰馁Y源數(shù)已超過(guò)它所宣布的最大值。 </p><p> 2)如果Requesti[j]<=Available[j] ,則轉(zhuǎn)向步驟3;否則,表示系統(tǒng)中尚無(wú)足夠
20、的資源,Pi必須等待。 </p><p> 3)系統(tǒng)試探把要求的資源分配給進(jìn)程Pi,并修改下面數(shù)據(jù)結(jié)構(gòu)中的數(shù)值: </p><p> Available[j]:=Available[j]-Requesti[j]; </p><p> Allocation[i,j]:=Allocation[i,j]+Requesti[j]; </p><p&
21、gt; Need[i,j]:=Need[i,j]-Requesti[j]; </p><p> 4)系統(tǒng)執(zhí)行安全性算法,檢查此次資源分配后,系統(tǒng)是否處于安全狀態(tài)。若安全,才正式將資源分配給進(jìn)程Pi,以完成本次分配;否則,將試探分配作廢,恢復(fù)原來(lái)的資源分配狀態(tài),讓進(jìn)程Pi等待。 </p><p><b> 3、安全性算法 </b></p><p
22、> 系統(tǒng)所執(zhí)行的安全性算法可描述如下: </p><p><b> 1)設(shè)置兩個(gè)向量 </b></p><p> ①、工作向量Work。它表示系統(tǒng)可提供給進(jìn)程繼續(xù)運(yùn)行所需要的各類(lèi)資源數(shù)目,它含有m個(gè)元素,執(zhí)行安全算法開(kāi)始時(shí),Work = Available。 </p><p> ?、凇inish。它表示系統(tǒng)是否有足夠的資源分配給進(jìn)
23、程,使之運(yùn)行完成,開(kāi)始時(shí)先做Finish[i]:=false ;當(dāng)有足夠資源分配給進(jìn)程時(shí),令 Finish[i]:=true。 </p><p> 2)從進(jìn)程集合中找到一個(gè)能滿(mǎn)足下述條件的進(jìn)程: </p><p> ?、?、Finish[i]=false; ②、Need[i,j]<=Work[j];如找到,執(zhí)行步驟(3);否則,執(zhí)行步驟(4)。 </p><p&g
24、t; 3)當(dāng)進(jìn)程Pi獲得資源后,可順利執(zhí)行,直至完成,并釋放出分配給它的資源,故應(yīng)執(zhí)行: </p><p> Work[j]:=Work[i]+Allocation[i,j]; </p><p> Finish[i]:=true; </p><p> goto step 2; </p><p> 4)如果所有進(jìn)程的Finish[i]
25、:=true,則表示系統(tǒng)處于安全狀態(tài);否則,系統(tǒng)處于不安全狀態(tài)。</p><p><b> 3)詳細(xì)設(shè)計(jì)及編碼</b></p><p> 1)銀行家算法流程圖</p><p><b> 2)程序源代碼</b></p><p> #include <iostream.h></
26、p><p> #include <stdio.h></p><p> #include <stdlib.h></p><p> #include <string.h></p><p><b> //定義全局變量</b></p><p> const int
27、 x=20,y=20; //常量,便于修改</p><p> int Available[x]; //各資源可利用的數(shù)量</p><p> int Allocation[y][y]; //各進(jìn)程當(dāng)前已分配的資源數(shù)量</p><p> int Max[y][y]; //各進(jìn)程對(duì)各類(lèi)資源的最大需求數(shù)</p><p> i
28、nt Need[y][y]; //尚需多少資源</p><p> int Request[x]; //申請(qǐng)多少資源</p><p> int Work[x]; //工作向量,表示系統(tǒng)可提供給進(jìn)程繼續(xù)運(yùn)行所需的各類(lèi)資源數(shù)量</p><p> int Finish[y]; //表示系統(tǒng)是否有足夠的資源分配給進(jìn)程,1為是</p><p>
29、int p[y]; //存儲(chǔ)安全序列</p><p> int i,j; //i表示進(jìn)程,j表示資源</p><p> int n,m; //n為進(jìn)程i的數(shù)量,m為資源j種類(lèi)數(shù)</p><p> int l=0; //l用來(lái)記錄有幾個(gè)進(jìn)程是Finish[i]=1的,當(dāng)l=n是說(shuō)明系統(tǒng)狀態(tài)是安全的</p><p> int
30、counter=0;</p><p><b> //函數(shù)聲明</b></p><p> void chushihua(); //初始化函數(shù)</p><p> void safe(); //安全性算法</p><p> void show(); //函數(shù)show,輸出當(dāng)前狀態(tài)</p>
31、<p> void bank(); //銀行家算法</p><p> //void jieshu(); //結(jié)束函數(shù)</p><p> void chushihua()</p><p><b> {</b></p><p> cout<<"輸入進(jìn)程的數(shù)量:
32、";//從此開(kāi)始輸入有關(guān)數(shù)據(jù)</p><p><b> cin>>n;</b></p><p> cout<<"輸入資源種類(lèi)數(shù): ";</p><p><b> cin>>m;</b></p><p> cout<<
33、;endl<<"輸入各種資源當(dāng)前可用的數(shù)量( "<<m<<" 種): "<<endl;</p><p> for (j=0; j<m; j++)</p><p><b> {</b></p><p> cout<<"輸入資源
34、 "<<j<<" 可利用的數(shù)量Available["<<j<<"]: ";</p><p> cin>>Available[j]; //輸入數(shù)字的過(guò)程...</p><p> Work[j]=Available[j]; //初始化Work[j],它的初始值就是當(dāng)前可用
35、的資源數(shù)</p><p><b> }</b></p><p> cout<<endl<<"輸入各進(jìn)程當(dāng)前已分配的資源數(shù)量Allocation["<<n<<"]["<<m<<"]: "<<endl;</p>
36、<p> for (i=0; i<n; i++)</p><p><b> {</b></p><p> for (j=0; j<m; j++)</p><p><b> {</b></p><p> cout<<" 輸入進(jìn)程 "
37、;<<i<<" 當(dāng)前已分配的資源 "<<j<<" 數(shù)量: ";</p><p> cin>>Allocation[i][j];</p><p><b> }</b></p><p> cout<<endl;</p>
38、<p> Finish[i]=0;//初始化Finish[i]</p><p><b> }</b></p><p> cout<<endl<<"輸入各進(jìn)程對(duì)各類(lèi)資源的最大需求Max["<<n<<"]["<<m<<"]: &quo
39、t;<<endl;</p><p> for (i=0; i<n; i++)</p><p><b> {</b></p><p> for (j=0; j<m; j++)</p><p><b> {</b></p><p> cout&l
40、t;<" 輸入進(jìn)程 "<<i<<" 對(duì)資源 "<<j<<" 的最大需求數(shù): ";</p><p> cin>>Max[i][j];</p><p> if(Max[i][j]>=Allocation[i][j]) //若最大需求大于已分配,則計(jì)算需求量
41、</p><p> Need[i][j] = Max[i][j]-Allocation[i][j];</p><p><b> else</b></p><p> Need[i][j]=0;//Max小于已分配的時(shí)候,此類(lèi)資源已足夠不需再申請(qǐng)</p><p><b> }</b></p
42、><p> cout<<endl;</p><p><b> }</b></p><p> cout<<endl<<"初始化完成"<<endl;</p><p><b> }</b></p><p>&l
43、t;b> //安全性算法函數(shù)</b></p><p> void safe()</p><p><b> {</b></p><p><b> l=0;</b></p><p> for (i=0; i<n;i++)</p><p><
44、b> { //i++</b></p><p> if (Finish[i]==0)</p><p> { //逐個(gè)查找Finish[i]==0的進(jìn)程 條件一</p><p> counter=0; //記數(shù)器</p><p> for (j=0; j<m; j++)</p><
45、;p><b> {</b></p><p> if (Work[j]>=Need[i][j]) counter=counter+1;//可用大于需求,記數(shù)</p><p><b> }</b></p><p> if(counter==m) //i進(jìn)程的每類(lèi)資源都符合Work[j]>=Need
46、[i][j] 條件二</p><p><b> {</b></p><p> p[l]=i; //存儲(chǔ)安全序列</p><p> Finish[i]=1; //i進(jìn)程標(biāo)志為可分配</p><p> for (j=0; j<m;j++)</p><p> Work[j]=Work
47、[j]+Allocation[i][j]; //釋放資源</p><p> l=l+1; //記數(shù),現(xiàn)在有L個(gè)進(jìn)程是安全的,當(dāng)L=N時(shí)說(shuō)明滿(mǎn)足安全序列</p><p> i= -1; //從第一個(gè)進(jìn)程開(kāi)始繼續(xù)尋找滿(mǎn)足條件一二的進(jìn)程</p><p><b> }</b></p><p><b> }&l
48、t;/b></p><p><b> }</b></p><p><b> }</b></p><p> //顯示當(dāng)前狀態(tài)函數(shù)</p><p> void show() //函數(shù)show,輸出當(dāng)前資源分配情況</p><p><b> {</b
49、></p><p> int i,j; //局部變量</p><p> int All[y]; //各種資源的總數(shù)量</p><p> cout<<"當(dāng)前的狀態(tài)為:"<<endl;</p><p> cout<<"各種資源的總數(shù)量:"<<en
50、dl;</p><p> for (j=0;j<m;j++)</p><p><b> {</b></p><p> cout<<" 資源"<<j<<": ";</p><p> All[j]=Available[j]; //總
51、數(shù)量=可用的+已分配的</p><p> for (i=0;i<n;i++) All[j]+=Allocation[i][j];</p><p> cout<<All[j]<<" ";</p><p><b> }</b></p><p> cout<
52、<endl<<"當(dāng)前各種資源可用的量為(available):"<<endl;</p><p> for (j=0;j<m;j++)</p><p> cout<<" 資源"<<j<<": "<<Available[j]<<&quo
53、t; ";</p><p> cout<<endl<<"各進(jìn)程已經(jīng)得到的資源量(allocation): "<<endl;</p><p> for (j=0;j<m;j++) cout<<'\t'<<"資源"<<j;</p>
54、<p> cout<<endl;</p><p> for(i=0;i<n;i++)</p><p><b> {</b></p><p> cout<<"進(jìn)程"<<i<<":";</p><p> for
55、(j=0;j<m;j++) cout<<'\t'<<" "<<Allocation[i][j];</p><p> cout<<endl;</p><p><b> }</b></p><p> cout<<endl<<&q
56、uot;各進(jìn)程還需要的資源量(need):"<<endl;</p><p> for (j=0;j<m;j++) cout<<'\t'<<"資源"<<j;</p><p> cout<<endl;</p><p> for(i=0;i<n;
57、i++)</p><p><b> {</b></p><p> cout<<"進(jìn)程"<<i<<":";</p><p> for (j=0;j<m;j++) cout<<'\t'<<" "&l
58、t;<Need[i][j];</p><p> cout<<endl;</p><p><b> }</b></p><p><b> }</b></p><p><b> //銀行家算法函數(shù)</b></p><p> voi
59、d bank()</p><p><b> {</b></p><p> cout<<endl<<"進(jìn)程申請(qǐng)分配資源:"<<endl;</p><p> int k=0; //用于輸入進(jìn)程編號(hào)</p><p> bool r=false; // 初值為假
60、,輸入Y繼續(xù)申請(qǐng)則置為真</p><p><b> do{//輸入請(qǐng)求</b></p><p> cout<<"輸入申請(qǐng)資源的進(jìn)程(0-"<<n-1<<"): ";</p><p><b> cin>>k;</b></p&g
61、t;<p> cout<<endl;</p><p> while(k>n-1) //輸入錯(cuò)誤處理</p><p><b> {</b></p><p> cout<<endl<<"輸入錯(cuò)誤,重新輸入:"<<endl;</p><
62、p> cout<<endl<<"輸入申請(qǐng)資源的進(jìn)程(0--"<<n-1<<"): ";</p><p><b> cin>>k;</b></p><p> cout<<endl;</p><p><b> }&
63、lt;/b></p><p> cout<<endl<<"輸入該進(jìn)程申請(qǐng)各類(lèi)資源的數(shù)量: "<<endl;</p><p> for (j=0; j<m; j++)</p><p><b> {</b></p><p> do{ //do……w
64、hile 循環(huán)判斷申請(qǐng)輸入的情況</p><p> cout<<"進(jìn)程 "<<k<<" 申請(qǐng)資源["<<j<<"]的數(shù)量:";</p><p> cin>>Request[j];</p><p> cout<<endl
65、;</p><p> if(Request[j]>Need[k][j])</p><p> { //申請(qǐng)大于需求量時(shí)出錯(cuò),提示重新輸入(貸款數(shù)目不允許超過(guò)需求數(shù)目)</p><p> cout<<"申請(qǐng)大于需要量!"<<endl;</p><p> cout<<"
66、;申請(qǐng)的資源"<<j<<"的數(shù)量為"<<Request[j]<<",大于 進(jìn)程"<<k<<"對(duì)該資源需求量"<<Need[k][j]<<"。"<<endl;</p><p> cout<<"重新
67、輸入!"<<endl;</p><p><b> }</b></p><p> else //先判斷是否申請(qǐng)大于需求量,再判斷是否申請(qǐng)大于可利用量</p><p> if(Request[j]>Available[j])</p><p> { //申請(qǐng)大于可利用量, 應(yīng)該阻塞等待
68、?…… ???</p><p> cout<<"\n沒(méi)有那么多資源,目前可利用資源"<<j<<"數(shù)量為"<<Available[j]<<",本次申請(qǐng)不成功,進(jìn)程等待!"<<endl;</p><p> Finish[k]=0; //該進(jìn)程等待<
69、;/p><p> goto ppp; //goto語(yǔ)句 跳轉(zhuǎn),結(jié)束本次申請(qǐng)</p><p><b> }</b></p><p> }while(Request[j]>Need[k][j]); //Request[j]>Available[j]||</p><p><b> }</b&
70、gt;</p><p> //改變Avilable、Allocation、Need的值</p><p> for (j=0; j<m; j++) </p><p><b> {</b></p><p> Available[j] = Available[j]-Request[j];</p>&
71、lt;p> Allocation[k][j] = Allocation[k][j]+Request[j];</p><p> Need[k][j] = Need[k][j]-Request[j];</p><p> Work[j] = Available[j];</p><p><b> }</b></p><
72、p> //判斷當(dāng)前狀態(tài)的安全性</p><p> safe(); //調(diào)用安全性算法函數(shù)</p><p><b> if (l<n)</b></p><p><b> {</b></p><p><b> l=0;</b></p><
73、p> cout<<"\n試分配后,狀態(tài)不安全,所以不予分配!恢復(fù)原狀態(tài)"<<endl;</p><p><b> //恢復(fù)數(shù)據(jù)</b></p><p> for (j=0; j<m; j++)</p><p><b> {</b></p><
74、;p> Available[j] = Available[j]+Request[j];</p><p> Allocation[k][j] = Allocation[k][j]-Request[j];</p><p> Need[k][j] = Need[k][j]+Request[j];</p><p> Work[j] = Available[j]
75、;</p><p><b> }</b></p><p> for (i=0; i<n; i++)</p><p> Finish[i]=0; //進(jìn)程置為未分配狀態(tài)</p><p><b> }</b></p><p><b> else<
76、/b></p><p><b> {</b></p><p><b> l=0;</b></p><p> cout<<"\n申請(qǐng)資源成功!!!"<<endl;</p><p> for(j=0;j<m;j++)</p>
77、<p><b> {</b></p><p> if(Need[k][j]==0);</p><p><b> else </b></p><p> { //有一種資源還沒(méi)全部申請(qǐng)到,則該進(jìn)程不可執(zhí)行,不能釋放擁有的資源</p><p> l=1; //置l為1,作為
78、判斷標(biāo)志</p><p><b> break;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> if(l!=1)</b></p><p> { //進(jìn)程可以執(zhí)
79、行,則釋放該進(jìn)程的所有資源</p><p> for (j=0;j<m;j++)</p><p><b> {</b></p><p> Available[j]=Available[j]+Allocation[k][j];</p><p> Allocation[k][j]=0;</p>&
80、lt;p><b> }</b></p><p> cout<<"該進(jìn)程已得到所有需求資源,執(zhí)行后將釋放其所有擁有資源!"<<endl;</p><p><b> }</b></p><p> l=0; //歸零</p><p> cout
81、<<"\n安全的狀態(tài)!"<<endl;</p><p> cout<<"安全序列為: ";</p><p> cout<<endl<<"進(jìn)程"<<"("<<p[0]<<")"; //輸出
82、安全序列,考慮顯示格式,先輸出第一個(gè)</p><p> Finish[0]=0;</p><p> for (i=1; i<n; i++)</p><p><b> {</b></p><p> cout<<"==>>"<<"進(jìn)程"
83、<<"("<<p[i]<<")";</p><p> Finish[i]=0; //所有進(jìn)程置為未分配狀態(tài)</p><p><b> }</b></p><p> cout<<endl<<endl;</p><p>
84、<b> }</b></p><p> show(); //顯示當(dāng)前狀態(tài)</p><p> ppp: //申請(qǐng)大于可利用量, 應(yīng)該阻塞等待,結(jié)束本次資源申請(qǐng),GOTO 語(yǔ)句跳轉(zhuǎn)至此</p><p> cout<<endl<<"是否繼續(xù)申請(qǐng)資源(y/n) ?";</p>&l
85、t;p> char* b=new char; //輸入y/n,判斷是否繼續(xù)申請(qǐng) <<endl</p><p><b> cin>>b;</b></p><p> cout<<endl;</p><p> cout<<"------------------------
86、-------------------"<<endl<<endl;</p><p> cout<<endl;</p><p> if(*b=='y'||*b=='Y') r=true;</p><p><b> else</b></p><p
87、><b> //{</b></p><p> r=false; //輸入非 Y 則令 R =false</p><p> //jieshu(); //調(diào)用結(jié)束函數(shù)</p><p><b> //}</b></p><p> } while (r==true);</p>
88、;<p><b> }</b></p><p><b> //結(jié)束函數(shù)</b></p><p> //void jieshu()</p><p><b> //{</b></p><p> // cout<<endl<<end
89、l;</p><p> // cout<<"\t\t 演示計(jì)算完畢"<<endl;</p><p> // cout<<endl<<endl;</p><p><b> //}</b></p><p><b> //主函數(shù)<
90、/b></p><p> int main()</p><p><b> {</b></p><p> cout<<endl<<endl<<"\t\t\t\t模擬銀行家算法"<<endl<<endl;</p><p> chus
91、hihua(); //初始化函數(shù)調(diào)用</p><p> cout<<endl;</p><p> show(); //輸出當(dāng)前狀態(tài)</p><p> safe(); //判斷當(dāng)前狀態(tài)的安全性</p><p> if (l<n) //l在safe中是用來(lái)記錄安全的進(jìn)程的個(gè)數(shù)的</p><p&
92、gt;<b> {</b></p><p> cout<<"\n當(dāng)前狀態(tài)不安全,拒絕申請(qǐng)!"<<endl;</p><p> cout<<endl;</p><p><b> return 0;</b></p><p><b>
93、; }</b></p><p><b> else</b></p><p><b> {</b></p><p> int i; //局部變量</p><p><b> l=0;</b></p><p> cout<<
94、;endl<<"\n當(dāng)前的狀態(tài)是安全的!安全序列為:"<<endl;</p><p> cout<<"進(jìn)程"<<"("<<p[0]<<")"; //輸出安全序列</p><p> for (i=1; i<n; i++)
95、cout<<"->>"<<"進(jìn)程"<<"("<<p[i]<<")";</p><p> for (i=0; i<n; i++) Finish[i]=0; //所有進(jìn)程置為未分配狀態(tài)</p><p> cout<<en
96、dl;</p><p><b> }</b></p><p> bank(); //調(diào)用銀行家算法函數(shù)</p><p> cout<<"\t\t 演示計(jì)算完畢"<<endl;</p><p><b> return 0;</b></p&
97、gt;<p><b> }</b></p><p><b> 4)運(yùn)行結(jié)果分析</b></p><p><b> 1.示例數(shù)據(jù)</b></p><p><b> 進(jìn)程數(shù)量:5</b></p><p><b> 資源種類(lèi)3&
98、lt;/b></p><p> 2.測(cè)試結(jié)果(以上表中數(shù)據(jù)為列)</p><p><b> 截圖如下:</b></p><p><b> 5)設(shè)計(jì)小結(jié)</b></p><p> 這次我做的課題是“銀行家算法的模擬實(shí)現(xiàn)”,通過(guò)這次的課程設(shè)計(jì),我不僅拓寬了自己的知識(shí)面,還在實(shí)踐過(guò)程中鞏固和
99、加深了自己所學(xué)的理論知識(shí),使自己的技術(shù)素質(zhì)和實(shí)踐能力有了進(jìn)一步的提高,同時(shí)我的專(zhuān)業(yè)水平也有了很大的進(jìn)步。 </p><p> 同時(shí),在軟件開(kāi)發(fā)方面也累積了不少經(jīng)驗(yàn),對(duì)操作系統(tǒng)的知識(shí)重要性的認(rèn)識(shí)更深了。通過(guò)設(shè)計(jì)過(guò)程的鍛煉,自己分析問(wèn)題和解決問(wèn)題的能力都得到了鍛煉和提高,完善了自己的知識(shí)結(jié)構(gòu),加深了對(duì)所學(xué)知識(shí)的理解。 </p><p> 通過(guò)幾天努力,這次課程設(shè)計(jì)圓滿(mǎn)的結(jié)束了,在這個(gè)過(guò)程中
100、,我學(xué)到了很多的知識(shí),在以后的學(xué)習(xí)中,我會(huì)更加努力的學(xué)好專(zhuān)業(yè)知識(shí),并將所學(xué)知識(shí)用于實(shí)踐當(dāng)中去,以便牢固掌握知識(shí)。</p><p><b> 6)參考文獻(xiàn)</b></p><p> [1]計(jì)算機(jī)操作系統(tǒng)(第3版),湯小丹,西安電子科技大學(xué)出版社,2007年7月</p><p> [2]Visual C++面向?qū)ο缶幊探坛蹋ǖ诙妫跤龍?jiān),
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 操作系統(tǒng)課程設(shè)計(jì)--銀行家算法 (2)
- 操作系統(tǒng)課程設(shè)計(jì)--銀行家算法
- 操作系統(tǒng)課程設(shè)計(jì)---銀行家算法
- 操作系統(tǒng)課程設(shè)計(jì)銀行家算法
- 操作系統(tǒng)課程設(shè)計(jì)--銀行家算法
- 操作系統(tǒng)課程設(shè)計(jì)(銀行家算法)
- 操作系統(tǒng)課程設(shè)計(jì)-銀行家算法
- 操作系統(tǒng)課程設(shè)計(jì)--銀行家算法
- 操作系統(tǒng)課程設(shè)計(jì)--銀行家算法
- 操作系統(tǒng)課程設(shè)計(jì)(銀行家算法設(shè)計(jì))
- 操作系統(tǒng)課程設(shè)計(jì)--銀行家算法 (3)
- 操作系統(tǒng)課程設(shè)計(jì)---模擬銀行家算法
- 操作系統(tǒng)課程設(shè)計(jì)---銀行家算法實(shí)現(xiàn)
- 操作系統(tǒng)課程設(shè)計(jì)報(bào)告—銀行家算法
- 操作系統(tǒng)原理課程設(shè)計(jì)--銀行家算法
- 操作系統(tǒng)課程設(shè)計(jì)報(bào)告—銀行家算法
- 操作系統(tǒng)課程設(shè)計(jì)---銀行家算法報(bào)告
- 操作系統(tǒng)課程設(shè)計(jì)-模擬銀行家算法-課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)報(bào)告---模擬實(shí)現(xiàn)銀行家算法
- 操作系統(tǒng)課程設(shè)計(jì)——銀行家算法的模擬實(shí)現(xiàn)
評(píng)論
0/150
提交評(píng)論