操作系統(tǒng)實驗報告-死鎖的避免_第1頁
操作系統(tǒng)實驗報告-死鎖的避免_第2頁
操作系統(tǒng)實驗報告-死鎖的避免_第3頁
操作系統(tǒng)實驗報告-死鎖的避免_第4頁
操作系統(tǒng)實驗報告-死鎖的避免_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

操作系統(tǒng)實驗報告-死鎖的避免操作系統(tǒng)實驗(二)死鎖的避免1?實驗內(nèi)容使用C++實現(xiàn)模擬隨機算法和銀行家算法2?實驗?zāi)康模?)了解死鎖的產(chǎn)生原因(隨機算法)(2)理解死鎖的解決辦法(銀行家算法)3?實驗題目使用隨機算法和銀行家算法設(shè)計程序4?程序流程圖主要過程流程圖銀行家算法流程圖安全性算法流程圖5?程序代碼和運行結(jié)果#includevstdio?h>#include<stdlib.h>typedefstruct{intA;intB;intC;}RES;#definefalse0#definetrue1〃系統(tǒng)中所有進程數(shù)量#definePNUMBER3//最大需求矩陣RESMax[PNUMBER];〃已分配資源數(shù)矩陣RESAllocation[PNUMBER];〃需求矩陣RESNeed[PNUMBER];//可用資源向量RESAvailable={0,0,0};〃安全序列intsafe[PNUMBER];voidsetConfig(){inti=0j=0;printf("================開始手動配置資==================\n");//可分配資源printf("輸入可分配資源\n");scanf("%d%d%d",&Available.A,&Available.B,&Available.C);〃最大需求矩陣MAXprintf("輸入最大需求矩陣%dx%d\n",PNUMBER,PNUMBER);for(i=0;i<PNUMBER;i++){scanf("%d%d%d",&Max[i]?A,&Max[i]?B,&Max[i]?C);}〃已分配矩陣Allocprintf("輸入已分配矩陣%dx%d\n",PNUMBER,PNUMBER);for(i=0;i<PNUMBER;i++){scanf("%d%d%d",&Allocation[i].A9&Allocation[i].B9&Allocation[i]?C);}〃需求矩陣printf("輸入需求矩陣%dx%d\n"fNUMBERfNUMBER);for(i=O;ivPNUMBER;i++){scanf("%d%d%d",&Need[i]?A,&Need[i]?B,&Need[i]?C);}printf("============結(jié)束配置資源==================\n");}voidloadConfig(){FILE*fp1;if((fp1=fOpen("config.txt","r"))==NULL){printf("沒有發(fā)現(xiàn)配置文件,請手動輸入\n");setConfig();}else{inti=0;printf("發(fā)現(xiàn)配置文件,開始導(dǎo)入.An");//可分配資源fscanf(fp1,"%d%d%d",&Available?A,&Available?B,&Available?C);〃最大需求矩陣MAXfor(i=0;ivPNUMBER;i++){fscanf(fp1,"%d%d%d",&Max[i]?A,&Max[i]?B,&Max[i]?C);}〃已分配矩陣Allocfor(i=0;ivPNUMBER;i++){fscanf(fp1,"%d%d%d",&Allocation[i]?A,&Allocation[i]?B,&Allocation[i]?C);}〃需求矩陣for(i=0;ivPNUMBER;i++){fscanf(fp1,"%d%d%d",&Need[i]?A,&Need[i]?B,&Need[i]?C);〃試探分配voidProbeAlloc(intprocess,RES*res){Available.A-=res->A;Available.B-=res->B;Available.C-=res->C;Allocation[process].A+=res->A;Allocation[process].B+=res->B;Allocation[process].C+=res->C;Need[process].A-=res->A;Need[process].B-=res->B;Need[process].C-=res->C;}//若試探分配后進入不安全狀態(tài),將分配回滾voidRollBack(intprocess,RES*res){Available.A+=res->A;Available.B+=res->B;Available.C+=res->C;Allocation[process].A-=res->A;Allocation[process].B-=res->B;Allocation[process].C-=res->C;Need[process].A+=res->A;Need[process].B+=res->B;Need[process].C+=res->C;}〃安全性檢査boolSafeCheck(){RESWork;

Work.A=Available";Work.B=Available.B;Work.C=Available.C;boolintintFinish[PNUMBER]={false,false,false};?i;j=0;for(i=0;i<PNUMBER;i++){/是否已檢查過if(Finish[i]==false){/是否有足夠的資源分配給該進程if(Need[i].A=Work.A&&Need[i].B<=Work.B&&Need[i]?C<=Work.C){/有則使其執(zhí)行完成,并將已分配給該進程的資源全部回收Work.A+=Allocation[i].A;Work.B+=Allocation[i].B;Work.C+=Allocation[i].C;Finish[i]=true;safe[j++]=i;}}i=-1;/重新進行遍歷}/如果所有進程的Finish向量都為true則處于安全狀態(tài),否則為不安全狀態(tài)for(i=0;i<PNUMBER;i++){if(Finish[i]==false){returnfalse;}}returntrue;}/資源分配請求boolrequest(intprocess,RES*res){//reques向量需小于Need矩陣中對應(yīng)的向量if(res->A<=Need[process].A&&res->B<=Need[process].B&&res->C<=Need[process].C){//request向量需小于Available向量if(res->A<=Available.A&&res->B<=Available.B&&res->C<=Available.C){〃試探分配ProbeAiloc(process,res);〃如果安全檢查成立,則請求成功,否則將分配回滾并返回失敗if(SafeCheck()){returntrue;}else{printf("安全性檢查失敗。原因:系統(tǒng)將進入不安全狀態(tài),有可能引起死鎖。\n");printf("正在回滾??An");RollBack(process,res);}}else{printf("安全性檢查失敗。原因:請求大于可利用資源。\n");}}else{printf("安全性檢查失敗。原因:請求大于需求。\n");}returnfalse;}〃輸出資源分配表voidPrintTable(){printf("===================================資源分配表==================================\n");printf("ProcessMaxAllocationNeedAvailable\n");printf("ABCABCABCABC\n");printf("P0%2d%2d%2d%2d%2d%2d%2d%2d%2d%2d%2d%2d\n",Max[O].A,Max[0].B,Max[0].QAllocationlOhA,AUocation[0].B,AUocation[0].C,Need[0].A9Need[0].B9Need[0].C9Available.A9Available.B,Available.C);printf("P1%2d%2d%2d%2d%2d%2d%2d%2d%2d\n",Max[1].A,Max[1].B,Max[1].C,AUocation[1].A,Allocation[1].B,Allocation[1]?C,Need[1].A,Need[1].B,Need[1]?C);printf("P2%2d%2d%2d%2d%2d%2d%2d%2d%2d\n",Max[2].A,Max[2].B,Max[2].C,AUocation[2].A,AUocation[2].B,AUocation⑵.CNeed⑵.A,Need⑵.B^Need⑵?C);printf("===============================================================================\n");}〃銀行家算法分配voidbanker。{charch;//判斷輸入的是否是安全狀態(tài)PrintTable();printf("先檢查初始狀態(tài)是否安全。\n");if(SafeCheck()){printf("系統(tǒng)處于安全狀態(tài)。\n");printf("安全序列是{P%d,P%df%d}。\n",safe[0],safe[1],safe⑵);}else{printf("系統(tǒng)處于不安全狀態(tài)。程序?qū)⑼顺??.\n");printf("執(zhí)行完畢。\n");getchar();return;}〃開始分配do{intprocess;RESres;printf("請依次輸入請求分配的進程和對三類資源的請求數(shù)量(進程編號0.1.2.??)\n");scanf("%d%d%d%d",&process,&res?A,&res?B,&res?C);if(process<3&&process>=0){if(request(process,&res)){printf("分配成功。\n");PrintTable();printf("安全序列是{P%df%dE%d}。\n",safe[0],safe[1],safe[2]);}else{printf("分配失敗。\n");}printf("是否繼續(xù)分配?(Y/N):");getchar();ch=getchar();}else{printf("輸入的進程號0?2\n");ch='y';}}while(ch=='Y'IIch==,y,);printf("執(zhí)行完畢。\n");}〃隨機分配算法執(zhí)行boolRandRequest(intprocess,RES*res){//request向量需小于Available向量if(res->A<=Available?A&&res->B<=Available?B&&res->C<=Available.?{〃試探分配ProbeAlloc(process,res);//判斷進程是否執(zhí)行完,執(zhí)行完釋放資源if(Max[process].A<=Allocation[process].A&&Max[process].B<=Allocation[process].B&&Max[process].C<=Allocation[process].C)printf("\nP%d執(zhí)行完畢,釋放所分配的資源??.\n",process);//有則使其執(zhí)行完成,并將已分配給該進程的資源全部回收Available?A+=Allocation[proeess].A;Available.B+=Allocation[process].B;

Available.C+=Allocation[proeess]?C;AUocation[process].A=0;Allocation[process].B=0;Allocation[process].C=0;Need[process]?A=Max[process].A;Need[process].B=Max[process].B;Need[process].C=Max[process].C;}returntrue;}else{printf("分配失敗。原因:請求大于可利用資源。\n");}returnfalse;}〃隨機分配voidrandPatch(){charch;〃判斷輸入的是否是安全狀態(tài)PrintTable();printf("先檢查初始狀態(tài)是否安全。\n");if(SafeCheckO){printf("系統(tǒng)處于安全狀態(tài)。\n");printf("安全序列是{P%d,P%djP%d}。\n",safe[0]9safe[1]9safe[2]);}else{printf("系統(tǒng)處于不安全狀態(tài)。程序?qū)⑼顺??.\n");printf("執(zhí)行完畢。\n");getchar();return;}〃開始分配do{intprocess;RESres;printf("請依次輸入請求分配的進程和對三類資源的請求數(shù)量(進程編號0.1.2.??)\n");scanf("%d%d%d%d",&process,&res?A,&res?B,&res?C);if(RandRequest(process,&res)){printf("分配成功。\n");PrintTable();if(!SafeCheck()){}printf("系統(tǒng)發(fā)生死鎖。"getchar();getchar();break;}else{printf("分配失敗。\n");}printf("是否繼續(xù)分配?(Y/N):");getchar();ch=getchar();}while(ch=='Y'IIch=='y');printf("執(zhí)行完畢。\n");}intmain(){intx;while⑴{printf("=========================\n");printf("\t\t\t共享資源分配與銀行家算法\n");printf("===============================================================================\n");printf("\t\t\t按1?導(dǎo)入配置信息\n");printf("\t\t\t按2?銀行家算法\n");printf("\t\t\t按3.隨機分配算法\n");printf("\t\t\t按0?退出系統(tǒng)5");printf("===============================================================================\n");printf("您輸入的是:");scanf("%d",&x);fflush(stdin);system("cls");printf("===============================================================================\n");printf("\t\t\t共享資源分配與銀行家算法");if(x==2){printf("\t---銀行家算法\n");}elseif(x==3){printf("\t---隨機分配算法\n");}printf("==========================================================================\n");switch(x){case1:{//加載配置文件loadConfig();//打印資源分配表PrintTable();printf("信息導(dǎo)入完成????.\n");getchar();};break;case2:banker();break;

case3:randPatch();break;case0:printf(“退出系統(tǒng)?\n\n”);return0;break;default:printf("請輸入0~1之間的數(shù)字\n");}}return0;}/*Config.txt557533229

溫馨提示

  • 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)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論