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

下載本文檔

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

文檔簡介

操作系統(tǒng)實驗(二)死鎖的避免1.實驗內(nèi)容使用C++實現(xiàn)模擬隨機算法和銀行家算法2.實驗目的(1)了解死鎖的產(chǎn)生因素(隨機算法)(2)理解死鎖的解決辦法(銀行家算法)3.實驗題目使用隨機算法和銀行家算法設計程序4.程序流程圖重要過程流程圖銀行家算法流程圖安全性算法流程圖5.程序代碼和運營結(jié)果#include<stdio.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=0,j=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].A,&Allocat(yī)ion[i].B,&Allocat(yī)ion[i].C);}//需求矩陣printf("輸入需求矩陣%dx%d\n",PNUMBER,PNUMBER);for(i=0;i<PNUMBER;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)配置文獻,開始導入..\n");//可分派資源fscanf(fp1,"%d%d%d",&Available.A,&Available.B,&Available.C);//最大需求矩陣MAXfor(i=0;i<PNUMBER;i++){fscanf(fp1,"%d%d%d",&Max[i].A,&Max[i].B,&Max[i].C);}//已分派矩陣Allocfor(i=0;i<PNUMBER;i++){fscanf(fp1,"%d%d%d",&Allocation[i].A,&Allocat(yī)ion[i].B,&Allocation[i].C);}//需求矩陣for(i=0;i<PNUMBER;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;Allocat(yī)ion[process].A+=res->A;Allocat(yī)ion[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;Allocat(yī)ion[process].C-=res->C;Need[process].A+=res->A;Need[process].B+=res->B;Need[process].C+=res->C;}//安全性檢查boolSafeCheck(){RESWork; Work.A=Available.A; Work.B=Available.B;?Work.C=Available.C;boolFinish[PNUMBER]={false,false,false};inti;intj=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){//request向量需小于Need矩陣中相應的向量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){//試探分派ProbeAlloc(process,res);//假如安全檢查成立,則請求成功,否則將分派回滾并返回失?。閒(SafeCheck()){returntrue;}else{printf("安全性檢查失敗。因素:系統(tǒng)將進入不安全狀態(tài),有也許引起死鎖。\n");printf("正在回滾...\n");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[0].A,Max[0].B,Max[0].C,Allocat(yī)ion[0].A,Allocation[0].B,Allocation[0].C,Need[0].A,Need[0].B,Need[0].C,Available.A,Available.B,Available.C);printf("P1%2d%2d%2d%2d%2d%2d%2d%2d%2d\n",Max[1].A,Max[1].B,Max[1].C,Allocation[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,Allocation[2].A,Allocation[2].B,Allocation[2].C,Need[2].A,Need[2].B,Need[2].C);printf("===============================================================================\n");}//銀行家算法分派voidbanker(){charch;//判斷輸入的是否是安全狀態(tài)PrintTable();printf("先檢查初始狀態(tài)是否安全。\n");if(SafeCheck()){printf("系統(tǒng)處在安全狀態(tài)。\n");printf("安全序列是{P%d,P%d,P%d}。\n",safe[0],safe[1],safe[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(process<3&&process>=0){if(request(process,&res)){printf("分派成功。\n");PrintTable();printf("安全序列是{P%d,P%d,P%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'||ch=='y');printf("執(zhí)行完畢。\n");}//隨機分派算法執(zhí)行boolRandRequest(intprocess,RES*res){//request向量需小于Available向量if(res->A<=Available.A&&res->B<=Available.B&&res->C<=Available.C){//試探分派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[process].A;Available.B+=Allocation[process].B;Available.C+=Allocation[process].C;Allocation[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(SafeCheck()){printf("系統(tǒng)處在安全狀態(tài)。\n");printf("安全序列是{P%d,P%d,P%d}。\n",safe[0],safe[1],safe[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'||ch=='y');printf("執(zhí)行完畢。\n");}intmain(){intx;while(1){printf("===============================================================================\n");printf("\t\t\t共享資源分派與銀行家算法\n");printf("===============================================================================\n");printf("\t\t\t按1.導入配置信息\n");printf("\t\t\t按2.銀行家算法\n");printf("\t\t\t按3.隨機分派算法\n");printf("\t\t\t按0.退出系統(tǒng)\n");printf("===============================================================================\n");printf("您輸入的是:");scanf("%d",&x);f

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 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

提交評論