《銀行家算法的模擬實現(xiàn)》—實驗報告_第1頁
《銀行家算法的模擬實現(xiàn)》—實驗報告_第2頁
《銀行家算法的模擬實現(xiàn)》—實驗報告_第3頁
《銀行家算法的模擬實現(xiàn)》—實驗報告_第4頁
《銀行家算法的模擬實現(xiàn)》—實驗報告_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、銀行家算法的模擬實現(xiàn)-實驗報告題目:銀行家算法的模擬實現(xiàn)專業(yè):班級:組員:_指導(dǎo)老師:一、實驗?zāi)康乃梨i會引起計算機工作僵死, 因此操作系統(tǒng)中必須防止。 本實驗的目的在于讓學(xué)生獨立的使用高級語言編寫和調(diào)試一個系統(tǒng)動態(tài)分配資源的簡單模擬程序, 了解死鎖產(chǎn)生的條件和 原因,并采用銀行家算法有效地防止死鎖的發(fā)生,以加深對課堂上所講授的知識的理解。二、實驗內(nèi)容模擬實現(xiàn)銀行家算法實現(xiàn)死鎖避免。要求:初始數(shù)據(jù)(如系統(tǒng)在 T0 時刻的資源分配情況、每一種資源的總數(shù)量)從文本文件讀入,文件中給出最大需求矩陣Max 、分配矩陣Allocation ,在程序中求得需求矩陣Need 和可利用資源向量Available

2、 。三、實驗分析過程1 、整個銀行家算法的思路。先對用戶提出的請求進行合法性檢查, 再進行預(yù)分配, 利用安全性檢查算法進行安全性檢查。1 ) 進程一開始向系統(tǒng)提出最大需求量.2)進程每次提出新的需求(分期貸款 )都統(tǒng)計是否超出它事先提出的最大需求量.3)若正常 ,則判斷該進程所需剩余剩余量(包括本次申請)是否超出系統(tǒng)所掌握的剩余資源量,若不超出,則分配 ,否則等待2 、算法用到的主要數(shù)據(jù)結(jié)構(gòu)和C 語言說明。1 ) 、可利用資源向量2 ) 、最大需求矩陣3 ) 、已分配矩陣4 ) 、還需求矩陣INT AVAILABLEM M 為資源的類型。INT MAXNM N 為進程的數(shù)量。INT ALLOC

3、A TIONNMINT NEEDNN5)、申請各類資源數(shù)量int Requestx; /6 ) 、工作向量int Workx;0 為否,非 0 為是7 ) 、 int Finishy; / 表示系統(tǒng)是否有足夠的資源分配給進程,3 、銀行家算法 (主程序)( 1 ) 、系統(tǒng)初始化。輸入進程數(shù)量,資源種類,各進程已分配、還需求各資源數(shù)量,各資源可用數(shù)量等(2)、輸入用戶的請求三元組( I, J, K) ,為進程 I 申請 K 個 J 類資源。( 3) 、檢查用戶的請求是否小于還需求的數(shù)量,條件是K<=NEEDI,J 。如果條件不符則提示重新輸入,即不允許索取大于需求量( 4) 、檢查用戶的請

4、求是否小于系統(tǒng)中的可利用資源數(shù)量,條件是K<=AVALIABLEI,J 。如果條件不符則申請失敗,阻塞該進程,重新進行進程動態(tài)資源申請(使用 goto 語句)( 5 ) 、進行資源的預(yù)分配,語句如下:AVALIBLEIJ= A VALIBLEIJ-K ;ALLOCATIONIJ= ALLOCATIONIJ+K ;NEEDIJ=NEEDIJ-K ;( 6) 、系統(tǒng)調(diào)用安全性檢查算法( checksafe() 函數(shù))進行檢查,如果檢查通過,則不用回 收,否則進行回收,進程資源申請失敗進入等待。4、安全性檢查算法(checksafe()子函數(shù))( 1 ) 、設(shè)置兩個臨時變量。FINISHN 記

5、錄進程模擬執(zhí)行的結(jié)束狀態(tài),初值為0 ,如果可以模擬執(zhí)行結(jié)束,則可設(shè)為1,也可設(shè)為其它非零值以表示執(zhí)行的先后次序。WORKM 記錄模擬執(zhí)行中資源的回收情況,初值為 AVAILABLEM 的值。( 2 ) 、在進程中查找符合以下條件的進程。條件1: FINISHI=0條件2: NEEDIJ =WORKJ( 3 ) 、如果查找成功則進行資源的模擬回收,語句如下:WORKJ=WORKJ+ALLOCA TIONIJ ;FINISHI=1 或查找到的順序號( 4) 、如果查找不成功,則檢查所有進程的 FINISH ,如果有一個為0 ,則系統(tǒng)不為0,返回不成功標志。否則返回成功標志。四、系統(tǒng)流程圖五、程序源

6、代碼#include <iostream.h>#include<stdio.h>#include<stdlib.h>const unsigned short c=3;/ 資源類數(shù) const unsigned short t=5;/ 進程數(shù) void print();/用于打印輸出表格的函數(shù) void input();/用于輸入的函數(shù) void tryfenpei(int i); 試分配函數(shù); void refenpei(int i); 恢復(fù)數(shù)據(jù)函數(shù) void checksafe(int s);/ 安全檢測函數(shù) int tempt;int workc;/定義

7、初始化數(shù)組int needtc,requestc,availablec;int maxtc=3, 5, 7 ,9 ,11,6 ,8 ,2 ,9, 5,6 ,3 ,5 ,7 ,4;int allocationtc=1 ,2 ,5 ,4, 8,5 ,4, 1 ,8 ,3 ,3 ,2 ,4, 3, 1;int totalc=17,21,25;int in;/ 用戶選擇的進程號/*main 函數(shù) */int main(int argc,char *argv)int i;char ch='Y'int l=0,m=0,a;for( i=0;i<t;i+)for(int j=0;j&l

8、t;c;j+)needij=maxij-allocationij;for( m=0;m<c;m+)a=0;for(int l=0;l<t;l+)a+=allocationlm;availablem=totalm-a;do if(ch='Y'|ch='y')cout<<"ok,現(xiàn)在開始進入實驗"<<endl;cout<<" 請輸入需要請求的進程號(0-4):"while(cin>>in)if(!(0<=in&&in<=4)"&l

9、t;<endl;cout<<"這里沒有該進程,請重新輸入else break;) cout«"您輸入的是 "<<"p"«in«""«" 進程"«endl; cout«"該進程需求量為:for(i=0;i<c;i+) (needini=maxini-allocationini; cout«needini«""cout«endl; cout«en

10、dl; cout«"請輸入請求資源向量輸入格式為x for(i=0;i<c;i+) (while(cin»requesti) (if(requesti<0) cout«"sorry,輸入的數(shù)字無效"<<endl; else if(requesti>needini)cout«"超出進程需求量"«endl«endl; if(requesti>availablei)cout«"系統(tǒng)沒有足夠多的可用資源量滿足進程需要 "

11、1;endl«endl;else break; ) ) cout<<"輸入成功,您輸入的是: "«requestO«"" «request1«" "«request2;cout«"等待已久的銀行家算法開始執(zhí)行"«endl;tryfenpei(in);/ 分配函數(shù) cout<<"試分配完成"«endl; cout<<"現(xiàn)在進入安全性檢測"«en

12、dl;checksafe(in);/安全性檢測函數(shù) cout<"您還想繼續(xù)銀行家算法的實驗嗎? (y 繼續(xù)n終止)else if(ch='N'|ch='n') (cout<”感謝您的使用,Bye "«endl«"退出 ing"«endl;break;) else cout<<"輸出無效!請重新輸入 "«endl;)while (cin»ch);return 0;)/*輸出函數(shù)*/void print()(int i,j;cout&

13、lt;<"更新數(shù)據(jù)中."<<endl;cout<<"|1111|"<<endl;cout<<"|1最大需求矩陣|已分配矩陣-|-需求矩陣-|可利用資源-|"<<endl;cout<<"| 資源 | Max | Allocation Need | available |"<<endl;cout<<"| A B C | A B C | A B C | A B C |"<<endl;cou

14、t<<"| 進程 |"<<endl;cout<<"|1111|"<<endl;for(i=0;i<5;i+)(cout<<"| p"<<i<<"| "for(j=0;j<3;j+) cout<<maxij<<" " cout<<" | "for(j=0;j<3;j+)cout<<" "<<allo

15、cationij; cout<<" | "for(j=0;j<3;j+)cout<<" "<<needij;cout<<" |"if(i=0)for(j=0;j<3;j+)cout<<" "<<availablej; cout<<"|"if(i>0)cout<<"|" cout<<endl; cout<<"|1111|"

16、<<endl;/*試分配函數(shù)*/void tryfenpei(int i)for(int f=0;f<c;f+)availablef=availablef-requestf;allocationif=allocationif+requestf;needif=needif-requestf;/* 恢復(fù)數(shù)據(jù)函數(shù) */void refenpei(int i)for(int f=0;f<c;f+)availablef=availablef+requestf;allocationif=allocationif-requestf;needif=needif+requestf;int

17、 com(int *p,int *q)int i;for(i=0;i<c;i+)if(pi>qi)return 0;return 1;/* 安全檢測函數(shù) */void checksafe(int s)int flag,tempt,i,j,l,k=0;bool finisht;for(i=0;i<t;i+)finishi=false;for(j=0;j<c;j+)workj=availablej;cout<<"|"<<endl;cout<<"| resource |-Work+Allocation-|-Fi

18、nish-|"<<endl;cout<<"| | A B C | T/F |"<<endl;cout<<"|programme |"<<endl;cout<<"|"<<endl;for(i=0;i<t;i+)l=0;for(j=0;j<c;j+)if(needij>workj)l=1;break;if(finishi=false&&l=0)(cout<<"| p"<<

19、;i<<"| ";for(j=0;j<c;j+)(workj=workj+allocationij;if(workj>9)cout<<""<<workj<<""elsecout<<""<<workj<<""cout<<""cout<<"|"cout<<" "finishi=true;cout<<

20、"true "cout<<"|"tempk=i;cout<<'temp="<<tempk<<endl;k+;i=-1;從用戶選擇的進程開始對每個進程都要檢測cout<<endl;cout<<"|11|"<<endl<<endl;for(i=0;i<t;i+)(if(finishi=false)flag=1;if(flag=1)(cout<<"系統(tǒng)不安全!本次資源申請不成功感! "<

21、;<endl;cout<<"正在恢復(fù)原來的數(shù)據(jù)"<<endl;refenpei(in);cout<<"恢復(fù)數(shù)據(jù)成功!正在打印輸出 "<<endl;print();else(cout<<"找到一個安全系列:"for(i=0;i<t;i+)cout<<"P"<<tempi<<"->"cout<<endl<<"已通過安全性測試!"<<

22、endl<<endl<<endl;cout<<"開始給第"<<"p"<<in<<""<<"進程分配資源"<<endl;cout<<"分配完成!打印輸出"<<endl<<endl;print();cout<<endl;五、程序運行結(jié)果及分1 、運行結(jié)果分配資源:輸入初值,進行安全性測試,結(jié)果安全序列,依次為 P4-P0-P1-P2-P3jO 'C:

23、Program FilesMicrosoft Visual StudioMyProject£lDebugl.exe'貨入程/R4 Jmy 井號L寸 皎請P量 詈展罐進工Az - t口王口王4求r感女 請宓元入 人成配進 欠分在 青4獸觀.:1的 fA 源您 資,領(lǐng) 檢 性 “全¥4 3等待已久的銀行家算法開始執(zhí)行resource i-Work+ftllocation-!Fin ih-!: A B C : T/F 1S!75' ti'ue!910! true1?15*true1823!true212SItrue0 475 6 111資源不足,無法繼續(xù)實

24、驗:系統(tǒng)沒有.系統(tǒng)沒有足夠多的可用資源量滿足進程需要 系統(tǒng)沒有足夠多的可用資源量滿足進程需要2、出現(xiàn)問題及解決方案本程序考慮了程序功能實現(xiàn)、格式顯示合理化、輸入錯誤異常處理等各個方面的設(shè) 計,盡可能使程序設(shè)計的更加完美。在長期的設(shè)計調(diào)試過程中遇到過許多問題,通過網(wǎng) 上搜索、查詢資料、調(diào)試試驗等方法一一解決。下面大致羅列一些主要問題:(1)、關(guān)于某些判斷算法優(yōu)劣問題:在程序中很多地方都會用到循環(huán)判斷是否符合條件的算法,在設(shè)計這些算法時 有很多方法,而有的算法可以更節(jié)省時間。如下安全性算法中尋找尋找符合 Finishi=0條件的進程的例子:/*算法一:for (j=0; j<m; j+)if

25、 (Workj>=Needij) counter=counter+1;/ 記數(shù) if(counter=m) */算法二:for (j=0; j<m; j+)if (Workj>=Needij); 可用大于等于需求elsecounter=1;break;if(counter!=1) 顯然算法二要優(yōu)于算法一。本程序中還有很多類似的地方。這里主要考慮的是一個 程序的優(yōu)化設(shè)計問題。(2)、關(guān)于某些系統(tǒng)函數(shù)調(diào)用時的執(zhí)行順序:在調(diào)用一些系統(tǒng)函數(shù)如getch()、system("pause")等時發(fā)現(xiàn)其執(zhí)行順序的一些問題。如類似:cout<<" =

26、"<<endl;cout<<" nnn"<<endl;system("pause");/ 暫停調(diào)試時發(fā)現(xiàn)此時:在Microsoft Visual C+ 6.0中先執(zhí)行system("pause")再輸出顯 示,而在調(diào)試器 Bloodshed Dev-C+中則順序執(zhí)行;但當把 cout<<" nnn"<<endl;改 為cout<<endl<<endl<<endl;其他不變時,則在兩中調(diào)試器中均為順序執(zhí)行,即先顯

27、 示后暫停。查找了一下相關(guān)幫助:在 OSTREAM.H 中有這樣的一個inline 函數(shù):inline _CRTIMP ostream& _cdecl endl(ostream& _outs) return _outs << 'n' << flush; 也就是說endl= return _outs << 'n' << flush;endl除了寫'n進外,還調(diào)用flush函數(shù),刷新緩沖區(qū),把緩沖區(qū)里的數(shù)據(jù)寫入文件或屏幕。如果考慮效率就用 'n'( 3 ) 、關(guān)于設(shè)置暫停的方法:在有些地方需要暫停一下以便于用戶查看信息等, 總結(jié)了下大致可用以下幾中方法:方法一:#include <s

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論