




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、學號P71514032 專業(yè)計算機科學與技術 姓名 實驗日期2017.11.9 教師簽字 成績實驗報告【實驗名稱】銀行家算法【實驗目的】掌握銀行家算法,用銀行家算法模擬操作系統(tǒng)避免死鎖的方法【實驗原理】銀行家算法又稱“資源分配拒絕”法,其基本思想是,系統(tǒng)中的所有進程放入進程集合,在安全狀態(tài)下系統(tǒng)受到進程的請求后試探性的把資源分配給他,現(xiàn)在系統(tǒng)將剩下的資源和進程集合中其他進程還需要的資源數(shù)做比較,找出剩余資源能滿足最大需求量的進程,從而保證進程運行完成后還回全部資源。這時系統(tǒng)將該進程從進程集合中將其清除。此時系統(tǒng)中的資源就更多了。反復執(zhí)行上面的步驟,最后檢查進程的集合為空時就表明本次申請可行,系
2、統(tǒng)處于安全狀態(tài),可以實施本次分配,否則,只要進程集合非空,系統(tǒng)便處于不安全狀態(tài),本次不能分配給他。請進程等待用C語言編寫一個簡單的銀行家算法模擬程序,用銀行家算法實現(xiàn)資源分配。程序能模擬多個進程共享多種資源的情形。進程可動態(tài)地申請資源,系統(tǒng)按各進程的申請動態(tài)地分配資源。要求程序具有顯示和打印各進程的某一時刻的資源分配表和安全序列;顯示和打印各進程依次要求申請的資源數(shù)量以及為某進程分配資源后的有關資源數(shù)據(jù)的情況【數(shù)據(jù)結(jié)構和符號說明】可利用資源向量Available最大需求矩陣Max分配矩陣Allocation需求矩陣Need工作向量Work標記向量Finishchar name10010;/定義
3、最大100個進程,每個大小為10int Max100100; /定義int Allocation100100;/可利用資源向量資源數(shù)int Need100100; /需求矩陣int avaiable100; /系統(tǒng)可利用資源int avaiable1100;int state100; /進程狀態(tài)數(shù)組char name110010;/進程名int bigger; ;/是否大于int N; /進程數(shù)int n; /資源數(shù)int counter;函數(shù):void Input()/輸入函數(shù)void Init()/初始化void output()/輸出安全序列或等待void insert_pcb()/請求
4、進程或更新進程void show()/顯示界面與選擇int CmpRequestAvailable(int Pos,int n)/比較Request和Available的大小int CmpRequestNeed(int Pos,int n)/比較Request和Need的大小void Reset(int n,int Pos)/更新request之后的Need,Allocation,Available的值void Banker()/銀行家算法【實驗流程圖及算法實現(xiàn)】用C語言編寫一個簡單的銀行家算法模擬程序,用銀行家算法實現(xiàn)資源分配。程序能模擬多個進程共享多種資源的情形。進程可動態(tài)地申請資源,系統(tǒng)
5、按各進程的申請動態(tài)地分配資源。要求程序具有顯示和打印各進程的某一時刻的資源分配表和安全序列;顯示和打印各進程依次要求申請的資源數(shù)量以及為某進程分配資源后的有關資源數(shù)據(jù)的情況【流程圖】代碼:#include<iostream>using namespace std;char name10010;定義最大100個進程,每個大小為10int Max100100; /定義int Allocation100100;/可利用資源向量資源數(shù)int Need100100; /需求矩陣int avaiable100; /int state100; /進程狀態(tài)數(shù)組int dayu; ;是否大于int
6、N;int n;void input () cout<<"輸入進程個數(shù)"<<endl; cin>>N; cout<<"輸入資源個數(shù)"<<endl; cin>>n; cout<<"系統(tǒng)現(xiàn)有的各資源的個數(shù)"<<endl; for(int i=0; i<n; i+) cin>>avaiablei; for(int i=0; i<N; i+)/輸入 cout<<"輸入第"<<i&l
7、t;<"個進程的名字"<<endl; cin>>namei; cout<<"輸入第"<<i<<"所需要各進程的最大資源數(shù)"<<endl; for(int j=0; j<n; j+) cin>>Maxij; cout<<"輸入第"<<i<<"現(xiàn)在所擁有的資源個數(shù)"<<endl; for(int j=0; j<n; j+) cin>>All
8、ocationij; statei=0; for(int i=0; i<N; i+)for(int j=0; j<n; j+) /尋找需求矩陣 Needij=Maxij-Allocationij;void yinhangjia() int i,j,k; for( i=0; i<N; i+) for( j=0; j<N; j+) if(statej=1) continue; dayu=0; for( k=0; k<n; k+) if(avaiablek>=Needjk) dayu=1; else dayu=0; break; if(dayu=1)/判斷狀態(tài) s
9、tatej=1; cout<<namej<<endl; for(int m=0; m<n; m+) avaiablem+=Allocationjm; break; int main()input();/輸入yinhangjia();截圖:帶有resquest請求更新的銀行家算法:描述:1)如果Requesti 是進程Pi的請求向量,如果Requesti,j=K,表示進程Pi需要K個Rj類型的資源。當發(fā)出資源請求后,系統(tǒng)按下述步驟進行檢查: 如果Requestij<= Needi,j,便轉(zhuǎn)向步驟2;否則認為出錯,因為它所需要的資源
10、數(shù)已超過它所宣布的最大值。 2)如果Requestij<=Availablej,便轉(zhuǎn)向步驟3,否則,表示尚無足夠資源,進程Pi須等待。3)系統(tǒng)試探著把資源分配給進程,并修改下面數(shù)據(jù)結(jié)構中的數(shù)值。4)系統(tǒng)執(zhí)行安全性算法,檢查此次資源分配后,系統(tǒng)是否處于安全狀態(tài)。若安全,才正式將資源分配給進i,以完成本次分配;否則,將本次的試探分配作廢,恢復原來的資源分配狀態(tài),讓進程等待。流程圖:代碼:#include<iostream>#include<string.h>using namespace std;char name10010;/定義最大100個進程,每個大小
11、為10int Max100100; /定義int Allocation100100;/可利用資源向量資源數(shù)int Need100100; /需求矩陣int avaiable100; /int avaiable1100;int state100; /進程狀態(tài)數(shù)組char name110010;int bigger; ;/是否大于int N;int n;int counter;void input ()/輸入函數(shù) cout<<"輸入進程個數(shù)"<<endl; cin>>N; cout<<"輸入資源個數(shù)"<&
12、lt;endl; cin>>n; cout<<"系統(tǒng)現(xiàn)有的各資源的個數(shù)"<<endl; for(int i=0; i<n; i+) cin>>avaiablei; avaiable1i=avaiablei; for(int i=0; i<N; i+)/輸入 cout<<"輸入第"<<i+1<<"個進程的名字"<<endl; cin>>namei; cout<<"輸入第"<<
13、i+1<<"所需要各進程的最大資源數(shù)"<<endl; for(int j=0; j<n; j+) cin>>Maxij; cout<<"輸入第"<<i+1<<"現(xiàn)在所擁有的資源個數(shù)"<<endl; for(int j=0; j<n; j+) cin>>Allocationij; statei=0; for(int i=0; i<N; i+) for(int j=0; j<n; j+) /尋找需求矩陣 Needij=M
14、axij-Allocationij;void Banker()/銀行家算法 int i,j,k; counter=0; for(i=0; i<N; i+) statei=0; for( i=0; i<N; i+)/循環(huán)次數(shù) for( j=0; j<N; j+)/每次從頭越查找 if(statej=1) continue; bigger=0; for( k=0; k<n; k+) if(avaiablek>=Needjk)/每一個大于需求 bigger =1; else bigger=0; break;/跳出需求循環(huán) if( bigger=1)/判斷狀態(tài),此時該進程
15、所有need<= avaiable statej=1; strcpy(name1counter+,namej); for(k=0; k<n; k+) avaiablek+=Allocationjk;/更新avaiable向量 break; void output()/輸出安全序列或等待 int i; if (counter=N) cout<<"安全序列為:" for(i=0; i<N-1; i+) cout<< name1i<<"-> " cout<< namei<<en
16、dl<<endl; else cout<<"不存在安全序列,插入失敗"<<endl;void insert_pcb()/請求進程或更新進程 char name110; int choose; int add100; cout<<"1、增加新的進程"<<endl; cout<<"2、對原有進程增加資源申請"<<endl; cin>>choose; if(choose=1) int bigger=0; cout<<"輸入插
17、入進程的名字"<<endl; cin>>nameN; cout<<"輸入該進程擁有的資源個數(shù)"<<endl; for(int j=0; j<n; j+) cin>>AllocationNj; stateN=0; cout<<"輸入該所需要各資源最大數(shù)目"<<endl; for(int j=0; j<n; j+) cin>>MaxNj; NeedNj=MaxNj-AllocationNj; stateN=0; for( int k=0; k
18、<n; k+) if(avaiablek>=NeedNk)/每一個大于需求 bigger =1; else bigger=0; break;/跳出需求循環(huán) if(bigger=1) cout<<"插入成功"<<endl; N=N+1; Banker(); output(); else cout<<"插入失敗,進程等待!"<<endl; else int pos;/找到需更新進程的位置 cout<<"輸入原有進程的名字"<<endl; cin>&g
19、t;name110; for(int i=0; i<N; i+) if(!strcmp(name1,namei) pos=i; break; cout<<"輸入該進程還需要的各資源數(shù)"<<endl; for(int j=0; j<n; j+) cin>>addj; for( int k=0; k<n; k+) if(avaiablek>=addk)/每一個大于需求 bigger =1; else bigger=0; break;/跳出需求循環(huán) if(bigger=1) cout<<"插入成功&
20、quot;<<endl; for(int m=0; m<n; m+) Maxposm+=addm; Needposm+=addm; avaiablem=avaiable1m; Banker(); output(); else cout<<"插入失敗,進程等待!"<<endl; void show()/顯示界面與選擇 int i,j; cout<<endl<<"*最大需求矩陣*"<<endl; cout<<"進程名t" for(i=0; i<
21、n; i+) cout<<"max"<<i<<""<<"t" cout<<endl; for(i=0; i<N; i+) cout<<namei<<"t" for(j=0; j<n; j+) cout<<Maxij<<"t" cout<<endl; cout<<"*"<<endl<<endl; cout<
22、<"*各進程已有資源數(shù)*"<<endl; cout<<"進程名t" for(i=0; i<n; i+) cout<<"Allocation"<<i<<""<<"t" cout<<endl; for(i=0; i<N; i+) cout<<namei<<"tt" for(j=0; j<n; j+) cout<<Allocationij&
23、lt;<"tt" cout<<endl; cout<<"*"<<endl<<endl; cout<<"*各進程需求資源數(shù)*"<<endl; cout<<"進程名t" for(i=0; i<n; i+) cout<<" Need"<<i<<""<<"t" cout<<endl; for(i=0; i<
24、;N; i+) cout<<namei<<"tt" for(j=0; j<n; j+) cout<< Needij<<"tt" cout<<endl; cout<<"*"<<endl<<endl;int main() int select; cout<<"銀行家算法"<<endl; cout<<"初始化"<<endl; input();/輸入 sh
25、ow(); Banker(); output(); do cout<<"1、更新"<<endl; cout<<"2、查看各進程的信息"<<endl; cout<<"3、結(jié)束"<<endl; cin>>select; if(select=3) break; else if(select=1) insert_pcb(); else show(); while(1);截圖:輸入資源種類數(shù)目,輸入最大需求矩陣,輸入分配矩陣,輸入可用資源數(shù)目,得到安全序列對進程P1進行請求,此時會形成一個新的安全序列,p1進程的need和max發(fā)生相應的變化。繼續(xù)修改進程4,插入各需求3 3 0,不存在安全序列,此時需要等待。請求一個新進程,所需求的最大資源為3 3 4,現(xiàn)有為2 2 3,形成新的安全序列。查看各進程信息,并輸出安全序列。再請求一個新的大進程,此時資源不足,需要等待。資源數(shù)為4:更新P1進程,程序阻塞,進程等待。請求一個新進程,P5。插入成功,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 醫(yī)學影像設備的先進教學模型課件
- 皮革保養(yǎng)行業(yè)綠色生產(chǎn)與循環(huán)經(jīng)濟考核試卷
- 移動設備充電器兼容性與故障修理考核試卷
- 紡織品在交通安全與防護產(chǎn)品的應用考核試卷
- 薯類食品品牌定位與市場推廣考核試卷
- 小班交通安全教育:小心門
- 2025年毛皮服裝及其附件合作協(xié)議書
- 《化學與物理之化學》課件
- 《電機原理與應用》課件
- 人員培訓設計方案
- 杭州市高層次人才分類認定申請表-
- 高考語文答題思維導圖
- 天然氣管道工程段線路安裝工程魚塘(水塘)穿越施工方案
- 教練技術三階段講義
- 證券公司營業(yè)部網(wǎng)絡結(jié)構拓撲圖
- 2001船舶修理價格本中文
- 某污水處理廠自控系統(tǒng)調(diào)試方案(常用)
- 藍色背景-PPT模板
- 設備檢維修作業(yè)票填寫模板
- 危大工程動態(tài)管控表
- 商場重大危險源評估標準
評論
0/150
提交評論