版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 一、實(shí)驗(yàn)名稱:</b></p><p><b> 模擬實(shí)現(xiàn)銀行家算法</b></p><p><b> 二、實(shí)驗(yàn)?zāi)康模?lt;/b></p><p> 用程序語言模擬實(shí)現(xiàn)銀行家算法。銀行家算法是避免死鎖的一種重要方法,通過編寫一個(gè)簡單的銀行家算法程序,加深了解有關(guān)資源申請(qǐng)
2、、避免死鎖等概念,并體會(huì)和了解死鎖和避免死鎖的具體實(shí)施方法。</p><p><b> 三、問題分析與設(shè)計(jì)</b></p><p> 1、算法思路:先對(duì)用戶提出的請(qǐng)求進(jìn)行合法性檢查,即檢查請(qǐng)求是否大于需要的,是否大于可利用的。若請(qǐng)求合法,則進(jìn)行預(yù)分配,對(duì)分配后的狀態(tài)調(diào)用安全性算法進(jìn)行檢查。若安全,則分配;若不安全,則拒絕申請(qǐng),恢復(fù)到原來的狀態(tài),拒絕申請(qǐng)。</
3、p><p> 2、銀行家算法步驟:</p><p> ?。?)如果Requesti<o(jì)r =Need,則轉(zhuǎn)向步驟(2);否則,認(rèn)為出錯(cuò),因?yàn)樗枰馁Y源數(shù)已超過它所宣布的最大值。</p><p> ?。?)如果Request<o(jì)r=Available,則轉(zhuǎn)向步驟(3);否則,表示系統(tǒng)中尚無足夠的資源,進(jìn)程必須等待。</p><p> ?。?)
4、系統(tǒng)試探把要求的資源分配給進(jìn)程Pi,并修改下面數(shù)據(jù)結(jié)構(gòu)中的數(shù)值:</p><p> Available=Available-Request[i];</p><p> Allocation=Allocation+Request;</p><p> Need=Need-Request;</p><p> (4)系統(tǒng)執(zhí)行安全性算法,檢查此次
5、資源分配后,系統(tǒng)是否處于安全狀態(tài)。</p><p> 3、安全性算法步驟:</p><p><b> (1)設(shè)置兩個(gè)向量</b></p><p> ?、俟ぷ飨蛄縒ork。它表示系統(tǒng)可提供進(jìn)程繼續(xù)運(yùn)行所需要的各類資源數(shù)目,執(zhí)行安全算法開始時(shí),Work=Allocation;</p><p> ?、诓紶栂蛄縁inish。
6、它表示系統(tǒng)是否有足夠的資源分配給進(jìn)程,使之運(yùn)行完成,開始時(shí)先做Finish[i]=false,當(dāng)有足夠資源分配給進(jìn)程時(shí),令Finish[i]=true。</p><p> (2)從進(jìn)程集合中找到一個(gè)能滿足下述條件的進(jìn)程:</p><p> ?、貴inish[i]=false</p><p> ?、贜eed<or=Work</p><p&g
7、t; 如找到,執(zhí)行步驟(3);否則,執(zhí)行步驟(4)。</p><p> ?。?)當(dāng)進(jìn)程P獲得資源后,可順利執(zhí)行,直至完成,并釋放出分配給它的資源,故應(yīng)執(zhí)行:</p><p> Work=Work+Allocation;</p><p> Finish[i]=true; </p><p><b> 轉(zhuǎn)向步驟(2)。</b
8、></p><p> ?。?)如果所有進(jìn)程的Finish[i]=true,則表示系統(tǒng)處于安全狀態(tài);否則,系統(tǒng)處于不安全狀態(tài)。</p><p><b> 4、流程圖:</b></p><p> ?、傧到y(tǒng)主要過程流程圖:</p><p> ?、阢y行家算法流程圖:</p><p> ③安全性算
9、法流程圖:</p><p><b> 5、實(shí)現(xiàn)過程:</b></p><p><b> 一、開發(fā)環(huán)境</b></p><p><b> 編程語言:java</b></p><p> 開發(fā)環(huán)境:windows & eclipse</p><p&
10、gt;<b> 二、開發(fā)過程:</b></p><p> 1、display()用于初始化資源矩陣和初始化進(jìn)程,available[][]、allocation[]、need[][]、resource[]、process[]。</p><p> 2、print(int)用于打印T時(shí)刻的資源矩陣。</p><p> 3、cal()用于進(jìn)行
11、安全性算法。</p><p> 4、changeStatu()通過request向量改變資源使用情況并進(jìn)行安全性檢測(cè)。</p><p> 5、main()用于初始化程序。</p><p> 三 、 關(guān)鍵代碼</p><p><b> 1.銀行家算法</b></p><p> whil
12、e(flag){</p><p> int[] req=new int[5];</p><p> System.out.print("請(qǐng)輸入您要請(qǐng)求資源的 編號(hào):");</p><p> int choose=scan.nextInt();</p><p> System.out.print("請(qǐng)輸入該進(jìn)
13、程的請(qǐng)求向量:");</p><p> for (int i = 0; i < resource; i++) {</p><p> req[i]=scan.nextInt();</p><p> }//將請(qǐng)求向量存入數(shù)組</p><p> boolean flag1 = (req[0]<=need[choose]
14、[0]&&req[1]<=need[choose][1]&&req[2]<=need[choose][2]&&req[3]<=need[choose][3]&&req[4]<=need[choose][4]);</p><p> boolean flag2 = (req[0]<=available[0]&&am
15、p;req[1]<=available[1]&&req[2]<=available[2]&&req[3]<=available[3]&&req[4]<=available[4]);</p><p> System.out.println(flag1);</p><p> System.out.println(fla
16、g2);</p><p> if(flag1){</p><p> if(flag2){</p><p> //判斷請(qǐng)求向量是否小于可用資源數(shù) </p><p> for (int i = 0; i < resource; i++) {</p><p> available[i]=available[i
17、]-req[i]; //改變可用資源數(shù) </p><p> allocation[choose][i]=allocation[choose][i]+req[i]; </p><p> need[choose][i]=need[choose][i]-req[i]; //改變所需資源數(shù)3</p><p><b> }</b></p>
18、;<p> int[] work=new int[5];//資源種類數(shù)量大小的數(shù)組 </p><p> boolean[] finish1=new boolean[process]; //設(shè)置finish標(biāo)志數(shù)組 </p><p> for (int i = 0; i < process; i++) {</p><p> finish1[
19、i]=false;</p><p><b> }</b></p><p> int[] array1=new int[process];</p><p> int num1=1;</p><p> int count11=0; </p><p> while(num1<proces
20、s){</p><p> for (int i = 0; i < process; i++) {</p><p> if(finish1[i]==false){</p><p> if(need[i][0]<=work[0]&&need[i][1]<=work[1]&&need[i][2]<=work[0
21、]&&need[i][3]<= work[3]&&need[i][4]<=work[4]){</p><p> for (int j2 = 0; j2 < resource; j2++) {</p><p> available[j2]=available[j2]+allocation[i][j2
22、];</p><p> available[j2] = work[j2];</p><p><b> }</b></p><p> finish1[i]=true;</p><p> array1[count11]=i;</p><p> count11++;</p>&l
23、t;p><b> }</b></p><p><b> }</b></p><p><b> }num1++;</b></p><p> } //安全性算法3</p><p> int count2=0;</p><p> for (i
24、nt i = 0; i < array1.length; i++) {</p><p> if(finish1[i]==true){</p><p><b> count2++;</b></p><p><b> }</b></p><p> } //判斷有多少個(gè)進(jìn)程已經(jīng)成功得到所需進(jìn)
25、程并結(jié)束</p><p> if(count2==process){</p><p> System.out.println("存在一個(gè)安全序列:");</p><p> for (int i = 0; i < array1.length; i++) {</p><p> System.out.print(&
26、quot;P"+array1[i]+"→");</p><p><b> }</b></p><p> } //判斷整個(gè)進(jìn)程序列書否全部完成 并打印輸出安全序列</p><p><b> else{</b></p><p> System.out.printl
27、n("系統(tǒng)處于不安全狀態(tài)!");</p><p><b> }</b></p><p> System.out.println();</p><p><b> }</b></p><p><b> else{</b></p><p
28、> System.out.println("資源不夠清等待!");</p><p><b> }</b></p><p><b> }//if結(jié)束</b></p><p><b> else{</b></p><p> System.out.
29、println("請(qǐng)求資源已超過所需資源!");</p><p><b> }</b></p><p> }//while結(jié)束</p><p> }//end of method changeStatu</p><p> public static void main(String args[
30、]) throws IOException{</p><p> work w = new work();</p><p> int count2 = 1; </p><p> w.display();</p><p> w.print(count2++);</p><p><b> w.cal();
31、</b></p><p> w.changeStatu();</p><p> } //end of method main</p><p><b> 2.安全性算法</b></p><p> boolean[] finish = new boolean[process];</p>&l
32、t;p> for (int i = 0; i < process; i++) {</p><p> finish[i]=false;//初始化數(shù)組finish</p><p><b> }</b></p><p> int[] array = new int[process];//定義一個(gè)數(shù)組保存安全序列</p>
33、<p> int num=1;</p><p> int count1=1; </p><p> while(num<process){</p><p> for (int i = 0; i < process; i++) {</p><p> if(finish[i]==false){</p>
34、<p> if(need[i][0]<=available[0]&&need[i][1]<=available[1]&&need[i][2]<=available[0]&&need[i][3]<=available[3]&&need[i][4]<=available[4]){</p><p> for
35、(int j2 = 0; j2 < resource; j2++) {</p><p> available[j2]=available[j2]+allocation[i][j2];</p><p><b> }</b></p><p> finish[i]=true;</p><p> array[cou
36、nt1-1]=i;</p><p><b> count1++;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }num++;</b></p><p><
37、b> } //安全性算法</b></p><p><b> 3、實(shí)驗(yàn)結(jié)果</b></p><p><b> 6、程序清單</b></p><p> package banker;</p><p> import java.io.IOException;</p>
38、<p> import java.util.Scanner;</p><p> public class work {</p><p><b> public</b></p><p> int resource;</p><p> int process;</p><p>
39、 int available[];</p><p> int max[][];</p><p> int allocation[][];</p><p> int need[][];//定義基本的數(shù)據(jù)</p><p> boolean flag1;</p><p> boolean flag2;</p
40、><p> Scanner scan = new Scanner(System.in);</p><p> public void display(){</p><p> System.out.println("\t\t"+"操作系統(tǒng)課程設(shè)計(jì)--銀行家算法");</p><p> System.ou
41、t.print("請(qǐng)輸入進(jìn)程數(shù):");</p><p> process = scan.nextInt();</p><p> System.out.print("請(qǐng)輸入資源種類數(shù):");</p><p> resource = scan.nextInt();</p><p> System.o
42、ut.print("請(qǐng)輸入可用資源數(shù):");</p><p> available = new int[5];</p><p> for(int i = 0;i<resource;i++){</p><p> available[i] = scan.nextInt();</p><p><b> }
43、</b></p><p> System.out.println("請(qǐng)輸入資源分配矩陣");</p><p> allocation = new int [5][5];</p><p> for(int i = 0;i<process;i++){</p><p> System.out.print
44、("請(qǐng)輸入"+ i + "號(hào)進(jìn)程已分配資源數(shù):");</p><p> for(int j =0;j<resource;j++){</p><p> allocation[i][j] = scan.nextInt();</p><p> }//end of resource</p><p>
45、 } //end of process</p><p> need = new int[5][5];</p><p> for(int i = 0;i<process;i++){</p><p> System.out.print("請(qǐng)輸入"+ i + "號(hào)進(jìn)程還需要資源數(shù):");</p><
46、p> for(int j =0;j<resource;j++){</p><p> need[i][j] = scan.nextInt();</p><p> }//end of resource</p><p> } //end of process</p><p> max = new int[5][5];</
47、p><p> for(int i = 0;i<process;i++){</p><p> System.out.print("請(qǐng)輸入"+ i + "號(hào)進(jìn)程最大需求資源數(shù):");</p><p> for(int j = 0;j<resource;j++){</p><p> max[i
48、][j] = scan.nextInt();</p><p> } // end of resource</p><p> }// end of for process</p><p> } //end of method display</p><p> public void print(int g){</p>&l
49、t;p> System.out.println();</p><p><b> /*</b></p><p><b> * 打印資源分配表</b></p><p><b> * */</b></p><p> System.out.println("T
50、"+g+"時(shí)刻的資源分配矩陣");</p><p> System.out.println("進(jìn)程\tmax\t\tallocation\tneed\t\tavailable");</p><p> System.out.print("P0 ");</p><p> for (int i
51、= 0; i <resource; i++) {</p><p> System.out.print(max[0][i]+" ");</p><p><b> }</b></p><p> System.out.print(" ");</p><p> for
52、(int i = 0; i <resource; i++) {</p><p> System.out.print(allocation[0][i]+" ");</p><p><b> }</b></p><p> System.out.print(" ");</p>&
53、lt;p> for (int i = 0; i <resource; i++) {</p><p> System.out.print(need[0][i]+" ");</p><p><b> }</b></p><p> System.out.print(" ");</
54、p><p> for (int i = 0; i <resource; i++) {</p><p> System.out.print(available[i]+" ");</p><p><b> }</b></p><p> System.out.println();</p&
55、gt;<p> for (int i = 1; i < process; i++) {</p><p> System.out.print("P"+i+" ");</p><p> for (int j = 0; j < resource; j++) {</p><p> System.ou
56、t.print(max[i][j]+" ");</p><p><b> }</b></p><p> System.out.print(" ");</p><p> for (int j = 0; j < resource; j++) {</p><p> S
57、ystem.out.print(allocation[i][j]+" ");</p><p><b> }</b></p><p> System.out.print(" ");</p><p> for (int j = 0; j < resource; j++) {</p>
58、;<p> System.out.print(need[i][j]+" ");</p><p><b> }</b></p><p> System.out.println();</p><p> } //此段程序輸出已輸入數(shù)據(jù)s </p><p>
59、 }//end of method print</p><p> public void cal(){</p><p><b> /**</b></p><p><b> * 檢查安全序列</b></p><p><b> * */</b></p><
60、;p> boolean[] finish = new boolean[process];</p><p> for (int i = 0; i < process; i++) {</p><p> finish[i]=false;//初始化數(shù)組finish</p><p><b> }</b></p><
61、p> int[] array = new int[process];//定義一個(gè)數(shù)組保存安全序列</p><p> int num=1;</p><p> int count1=1; </p><p> while(num<process){</p><p> for (int i = 0; i < process
62、; i++) {</p><p> if(finish[i]==false){</p><p> if(need[i][0]<=available[0]&&need[i][1]<=available[1]&&need[i][2]<=available[0]&&need[i][3]<=available[3]&
63、;&need[i][4]<=available[4]){</p><p> for (int j2 = 0; j2 < resource; j2++) {</p><p> available[j2]=available[j2]+allocation[i][j2];</p><p><b> }</b></p&g
64、t;<p> finish[i]=true;</p><p> array[count1-1]=i;</p><p><b> count1++;</b></p><p><b> }</b></p><p><b> }</b></p>
65、<p><b> }num++;</b></p><p><b> } //安全性算法</b></p><p> int count=0;</p><p> for (int i = 0; i < array.length; i++) {</p><p> if(finis
66、h[i]==true){</p><p><b> count++;</b></p><p><b> }</b></p><p> }//檢查已完成的進(jìn)程數(shù)目</p><p> if(count==process){</p><p> System.out.pri
67、ntln("存在一個(gè)安全序列:");</p><p> for (int i = 0; i < array.length; i++) {</p><p> System.out.print("P"+array[i]+"→");</p><p><b> }</b></
68、p><p><b> }//輸出安全序列</b></p><p><b> else{</b></p><p> System.out.println("系統(tǒng)處于不安全狀態(tài)!");</p><p><b> }</b></p><p&
69、gt; System.out.println();</p><p> }//end of cal</p><p> public void prinSecurityList(){</p><p> }//end of method prinSecurityList</p><p> public void changeStatu()
70、{</p><p> boolean flag=true;</p><p> while(flag){</p><p> int[] req=new int[5];</p><p> System.out.print("請(qǐng)輸入您要請(qǐng)求資源的 編號(hào):");</p><p> int choo
71、se=scan.nextInt();</p><p> System.out.print("請(qǐng)輸入該進(jìn)程的請(qǐng)求向量:");</p><p> for (int i = 0; i < resource; i++) {</p><p> req[i]=scan.nextInt();</p><p> }//將請(qǐng)求
72、向量存入數(shù)組</p><p> boolean flag1 = (req[0]<=need[choose][0]&&req[1]<=need[choose][1]&&req[2]<=need[choose][2]&&req[3]<=need[choose][3]&&req[4]<=need[choose][4]);&l
73、t;/p><p> boolean flag2 = (req[0]<=available[0]&&req[1]<=available[1]&&req[2]<=available[2]&&req[3]<=available[3]&&req[4]<=available[4]);</p><p> Sy
74、stem.out.println(flag1);</p><p> System.out.println(flag2);</p><p> if(flag1){</p><p> if(flag2){</p><p> //判斷請(qǐng)求向量是否小于可用資源數(shù) </p><p> for (int i = 0; i
75、 < resource; i++) {</p><p> available[i]=available[i]-req[i]; //改變可用資源數(shù) 分配資源</p><p> allocation[choose][i]=allocation[choose][i]+req[i]; //由于已分配資源 </p><p> need[choose][i]=ne
76、ed[choose][i]-req[i]; //改變所需資源數(shù)3</p><p><b> }</b></p><p> int[] work=new int[5];//資源種類數(shù)量大小的數(shù)組 用來構(gòu)建available的數(shù)</p><p> boolean[] finish1=new boolean[process]; //設(shè)置fini
77、sh標(biāo)志數(shù)組 </p><p> for (int i = 0; i < process; i++) {</p><p> finish1[i]=false;</p><p><b> }</b></p><p> int[] array1=new int[process];</p><
78、p> int num1=1;</p><p> int count11=0; </p><p> while(num1<process){</p><p> for (int i = 0; i < process; i++) {</p><p> if(finish1[i]==false){</p>
79、<p> if(need[i][0]<=work[0]&&need[i][1]<=work[1]&&need[i][2]<=work[0]&&need[i][3]<=work[3]&&need[i][4]<=work[4]){</p><p> for (int j2 = 0; j2 < resour
80、ce; j2++) {</p><p> available[j2]=available[j2]+allocation[i][j2];</p><p> available[j2] = work[j2];</p><p><b> }</b></p><p> finish1[i]=true;</p>
81、<p> array1[count11]=i;</p><p> count11++;</p><p><b> }</b></p><p><b> }</b></p><p><b> }num1++;</b></p><p>
82、; } //安全性算法3</p><p> int count2=0;</p><p> for (int i = 0; i < array1.length; i++) {</p><p> if(finish1[i]==true){</p><p><b> count2++;</b></p>
83、;<p><b> }</b></p><p> } //判斷有多少個(gè)進(jìn)程已經(jīng)成功得到所需進(jìn)程并結(jié)束</p><p> if(count2==process){</p><p> System.out.println("存在一個(gè)安全序列:");</p><p> for (in
84、t i = 0; i < array1.length; i++) {</p><p> System.out.print("P"+array1[i]+"→");</p><p><b> }</b></p><p> } //判斷整個(gè)進(jìn)程序列書否全部完成 并打印輸出安全序列</p>
85、;<p><b> else{</b></p><p> System.out.println("系統(tǒng)處于不安全狀態(tài)!");</p><p><b> }</b></p><p> System.out.println();</p><p><b>
86、; }</b></p><p><b> else{</b></p><p> System.out.println("資源不夠清等待!");</p><p><b> }</b></p><p><b> }//if結(jié)束</b><
87、;/p><p><b> else{</b></p><p> System.out.println("請(qǐng)求資源已超過所需資源!");</p><p><b> }</b></p><p> }//while結(jié)束</p><p> }//end of
88、 method changeStatu</p><p> public static void main(String args[]) throws IOException{</p><p> work w = new work();</p><p> int count2 = 1; </p><p> w.display();<
89、;/p><p> w.print(count2++);</p><p><b> w.cal();</b></p><p> w.changeStatu();</p><p> } //end of method main</p><p> }// end of class work<
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 課程設(shè)計(jì)--銀行家算法
- 銀行家算法—課程設(shè)計(jì)
- 銀行家算法-課程設(shè)計(jì)
- 銀行家算法課程設(shè)計(jì)
- 銀行家算法課程設(shè)計(jì)
- 銀行家算法課程設(shè)計(jì)報(bào)告
- 銀行家算法課程設(shè)計(jì)報(bào)告
- 銀行家算法課程設(shè)計(jì)2
- 銀行家算法課程設(shè)計(jì)報(bào)告 (2)
- 銀行家算法模擬實(shí)現(xiàn)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)--銀行家算法
- 銀行家算法的實(shí)現(xiàn)課程設(shè)計(jì)報(bào)告
- 課程設(shè)計(jì)---銀行家算法實(shí)驗(yàn)報(bào)告
- 操作系統(tǒng)課程設(shè)計(jì)---銀行家算法
- 課程設(shè)計(jì)--銀行家算法的模擬實(shí)現(xiàn)
- 操作系統(tǒng)課程設(shè)計(jì)銀行家算法
- 操作系統(tǒng)課程設(shè)計(jì)--銀行家算法
- 操作系統(tǒng)課程設(shè)計(jì)(銀行家算法)
- 操作系統(tǒng)課程設(shè)計(jì)-銀行家算法
- 操作系統(tǒng)課程設(shè)計(jì)--銀行家算法
評(píng)論
0/150
提交評(píng)論