操作系統(tǒng)銀行家算法實驗報告_第1頁
操作系統(tǒng)銀行家算法實驗報告_第2頁
操作系統(tǒng)銀行家算法實驗報告_第3頁
操作系統(tǒng)銀行家算法實驗報告_第4頁
操作系統(tǒng)銀行家算法實驗報告_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

實驗四死鎖實驗?zāi)康漠斚到y(tǒng)的總資源數(shù)m小于或等于所有進程對對資源的最大需求時,就可能產(chǎn)生死鎖。死鎖會引起計算機系統(tǒng)的癱瘓。銀行家算法是在實現(xiàn)資源分配時避免死鎖的一個著名算法,該算法是在能確保系統(tǒng)處于安全狀態(tài)時才把資源分配給申請者。通過本實驗使學(xué)生能進一步理解死鎖的概念,并能選擇一個算法來避免死鎖。二、實驗題目系統(tǒng)中有m個同類資源被n個進程共享,每個進程對資源的最大需求數(shù)分別為S1,S2,…,Sn,且Max(Si)<=m,(i=1,2,…n)。進程可以動態(tài)地申請資源和釋放資源。編寫一個程序,現(xiàn)銀行家算法,當系統(tǒng)將資源分配給某一進程而不會死鎖時,就分配之。否則,推遲分配,并顯示適當?shù)男畔?。三、?shù)據(jù)結(jié)構(gòu)主要數(shù)據(jù)結(jié)構(gòu):Structaa{voidPrint();//用于打印輸出表格的函數(shù)voidInput();//用于輸入的函數(shù)voidtryfenpei(inti);//試分配函數(shù)voidrefenpei(inti);//恢復(fù)數(shù)據(jù)函數(shù)voidchecksafe(ints);//安全檢測函數(shù)};四、銀行家算法的流程圖五、源代碼#include<iostream.h>#include"stdio.h"constunsignedshortc=3;//資源類數(shù)constunsignedshortt=5;//進程數(shù)voidPrint();//用于打印輸出表格的函數(shù)voidInput();//用于輸入的函數(shù)voidtryfenpei(inti);//試分配函數(shù)voidrefenpei(inti);//恢復(fù)數(shù)據(jù)函數(shù)voidchecksafe(ints);//安全檢測函數(shù)//定義初始化數(shù)組intAvailable[c],Max[t][c],Allocation[t][c],Need[t][c],Request[c];intin;//用戶選擇的進程號intmain(intargc,char*argv[]){inti;charch='Y';cout<<"初始化數(shù)據(jù)如下:"<<endl;Input();//輸入相關(guān)數(shù)據(jù)函數(shù)Print();//打印輸出相關(guān)數(shù)據(jù)表函數(shù)cout<<"初始化完成!"<<endl<<endl;do{if(ch=='Y'||ch=='y'){cout<<"歡迎進入實驗!"<<endl;cout<<"請輸入發(fā)起請求的進程號(0-4):";while(cin>>in){if(in<0||in>4){cout<<"不存在該進程,請重新輸入"<<endl;}elsebreak;};cout<<"您輸入的是"<<"p["<<in<<"]"<<"進程"<<endl;cout<<"該進程需求量為:";for(i=0;i<c;i++)cout<<Need[in][i]<<"";cout<<endl;cout<<"請輸入請求資源的數(shù)目:";//輸入格式為Xfor(i=0;i<c;i++){while(cin>>Request[i]){if(Request[i]<0)cout<<"錯誤!輸入的數(shù)字無效."<<endl;elseif(Request[i]>Need[in][i])cout<<"錯誤!超出進程需求量"<<endl<<endl;if(Request[i]>Available[i])cout<<"錯誤!系統(tǒng)還沒有足夠的可用資源量滿足進程需要"<<endl<<endl;elsebreak;}}cout<<"輸入成功,您輸入的是:"<<Request[0]<<""<<Request[1]<<""<<Request[2]<<endl;cout<<"開始執(zhí)行銀行家算法,下面進行試分配"<<endl;tryfenpei(in);//分配函數(shù)cout<<"試分配完成!"<<endl;cout<<"進入安全性檢測..."<<endl;checksafe(in);//安全性檢測函數(shù)cout<<"需要繼續(xù)實驗嗎?(y-繼續(xù)n終止)";}elseif(ch=='N'||ch=='n'){cout<<"感謝您的使用,祝您愉快!"<<endl<<"正在退出..."<<endl;break;}elsecout<<"輸入無效!請重新輸入."<<endl;}while(cin>>ch);return0;}voidPrint(){inti,j;cout<<"進程個數(shù):"<<t<<"資源個數(shù):"<<c<<endl;cout<<endl;cout<<"|*****|***********|***********|**********|***********|"<<endl;cout<<"|****|最大需求矩陣|已分配矩陣-|-需求矩陣-可用資源向量|"<<endl;cout<<"|資源|Max|Allocation|Need|Available|"<<endl;cout<<"||ABC|ABC|ABC|ABC|"<<endl;cout<<"|進程|||||"<<endl;cout<<"|*****|**********|************|**********|***********|"<<endl;for(i=0;i<5;i++){cout<<"|p"<<i<<"|";for(j=0;j<3;j++){cout<<Max[i][j]<<"";}cout<<"|";for(j=0;j<3;j++){cout<<""<<Allocation[i][j];}cout<<"|";for(j=0;j<3;j++){cout<<""<<Need[i][j];}cout<<"|";if(i==0){for(j=0;j<3;j++){cout<<""<<Available[j];}cout<<"|";}if(i>0){cout<<"|";}cout<<endl;}cout<<"|*****|**********|************|**********|***********|"<<endl;}//輸入函數(shù)voidInput(){for(intj=0;j<c;j++){cout<<"請輸入Available["<<j<<"]:";while(cin>>Available[j]){if(Available[j]<0)cout<<"輸入數(shù)字無效,請重新輸入"<<endl;elsebreak;};}for(intk=1;k<4;k++)//其他三個屬性和一次打印輸出表{for(intl=0;l<t;l++)//五個進程循環(huán)輸入{for(intm=0;m<c;m++)//三個類資源ABC循環(huán)輸入{if(k==1&&m<t){cout<<"請輸入Max["<<l<<"]["<<m<<"]:";while(cin>>Max[l][m]){if(Max[l][m]<0)cout<<"輸入數(shù)字無效,請重新輸入"<<endl;elsebreak;};}if(k==2&&m<t){cout<<"請輸入Allocation["<<l<<"]["<<m<<"]:";while(cin>>Allocation[l][m])if(Allocation[l][m]<0)cout<<"輸入數(shù)字無效,請重新輸入"<<endl;elsebreak;}if(k==3&&m<t)Need[l][m]=Max[l][m]-Allocation[l][m];}}}}//輸入函數(shù)結(jié)束//試分配函數(shù)voidtryfenpei(inti){for(intf=0;f<c;f++){Available[f]=Available[f]-Request[f];Allocation[i][f]=Allocation[i][f]+Request[f];Need[i][f]=Need[i][f]-Request[f];}}//試分配函數(shù)結(jié)束//恢復(fù)數(shù)據(jù)函數(shù)voidrefenpei(inti){for(intf=0;f<c;f++){Available[f]=Available[f]+Request[f];Allocation[i][f]=Allocation[i][f]-Request[f];Need[i][f]=Need[i][f]+Request[f];}}//恢復(fù)數(shù)據(jù)函數(shù)結(jié)束//安全檢測函數(shù)voidchecksafe(ints){intWork,flag,temp[t],i,j,l=0,k=0;boolFinish[t];for(i=0;i<t;i++)Finish[i]=false;for(j=0;j<3;j++){Work=Available[j];//cout<<"Work="<<Work<<endl;for(i=0;i<t;i++){if(Finish[i]==true)l++;//用l是否達到5來判斷這條進程A類資源或者B類資源是否通過安全檢測,C類資源沒有經(jīng)過這里}if(l==5)//一共有三類資源ABC,一條進程下面的安全性檢測只檢測了A類。如果A類通過了,那么還要判斷B類,C類。否則不用{for(i=0;i<t;i++)Finish[l]=false;//A類通過了,就把B類的Finish重置為false,C類類推}i=s;//s傳遞進來賦給i,s是用戶輸入的進程號(有主函數(shù)里的in傳遞進來)while(i<t){if(Finish[i]==false&&Need[i][j]<=Work){Work=Work+Allocation[i][j];Finish[i]=true;temp[k]=i;//cout<<"temp="<<temp[k]<<endl;k++;i=(i+1)%t;//從用戶選擇的進程開始對每個進程都要檢測}elsei=(i++)%t;}}for(i=0;i<t;i++){if(Finish[i]==false){flag=1;//標記}}if(flag==1){cout<<"系統(tǒng)不安全!本次資源申請不成功!"<<endl;cout<<"正在恢復(fù)原來的數(shù)據(jù)"<<endl; refenpei(in);cout<<"恢復(fù)數(shù)據(jù)成功!正在打印輸出"<<endl;Print();}else{cout<<"找到一個安全序列:";for(i=0;i<t;i++)cout<<"P"<<temp[i]<<"--->"; cout<<endl<<"已通過安全性測試!"<<endl;

溫馨提示

  • 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

提交評論