操作系統(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)

文檔簡介

洛陽理工學院實驗報告學院計信學院班級學號姓名課程名稱操作系統(tǒng)實驗日期10.17實驗名稱實驗二銀行家算法成績實驗目的:了解進程產(chǎn)生死鎖的原因,了解為什么要進行死鎖的避免。掌握銀行家算法的數(shù)據(jù)結(jié)構(gòu),了解算法的執(zhí)行過程,加深對銀行家算法的理解。實驗原理:n個并發(fā)進程共享m個系統(tǒng)資源的系統(tǒng),進程可動態(tài)申請資源和釋放資源。系統(tǒng)按各進程的申請動態(tài)的分配資源,先對用戶提出的請求進行合法性檢查,再進行預分配,利用安全性檢測算法進行安全性檢測,如果系統(tǒng)分配資源,系統(tǒng)進入安全狀態(tài),則預分配就是正式分配,如果系統(tǒng)分配資源,系統(tǒng)進入不安全狀態(tài),則撤銷預分配。實驗內(nèi)容:#include<stdio.h>#include<stdlib.h>#defineTRUE1#defineFALSE0inti,j,k,l;intflag;charc;typedefstructBanker{int*Available;//可利用資源向量int**Max;//最大需求矩陣int**Allocation;//分配矩陣int**Need;//需求矩陣int**Requst;//申請各類資源數(shù)量int*Work;//工作向量

int*Finish;//int*Finish;//結(jié)束向量}Process;intBank(Process*process,intm,intn);intSafe(Process*process,intm,intn);voidMax(Process*process,intm,intn);voidNeed(Process*process,intm,intn);voidAllocation(Process*process,intm,intn);voidAvailable(Process*process,intn);intRequst(Process*process,intm,intn);intBank(Process*process,intm,intn){do//資源請求失敗或者系統(tǒng)不安全時flag=0,并重新輸入。{if((flag=Requst(process,m,n))==l){printf("請求并試分配成功。\n");for(j=0;j<n;j++){(process->Available)[j]-=(process->Requst)[l][j];(process->Allocation)[l][j]+=(process->Requst)[l][j];(process->Need)[l][j]-=(process->Requst)[l][j];}}if(flag==1&&(flag二Safe(process,m,n))==O)//系統(tǒng)不安全,撤銷資源試分配{printf("撤銷資源試分配。\n");for(j=0;j<n;j++){(process—>Available)[j]+=(process—>Requst)[l][j];

(process->Allocation)[l][j]-=(process->Requst)[l][j];(process->Need)[l][j]+=(process->Requst)[l][j];}}}while(flag==O);if(flag==l){printf("分配成功。\n");printf("是否繼續(xù)請求資源分配?輸入Y繼續(xù),輸入y結(jié)束:\n");getchar();c=getchar();if(c=='Y')return1;if(c=='y')return0;}}intSafe(Process*process,intm,intn){(process->Work)=(int*)malloc(sizeof(int)*n);for(j=0;j<n;j++)(process->Work)[j]=(process->Available)[j];//系統(tǒng)可提供給進程繼續(xù)運行所需的各類資源數(shù)目(process->Finish)=(int*)malloc(sizeof(int)*m);for(i=0;i<m;i++)(process—>Finish)[i]二FALSE;k=m;intflagl;//當有不符合條件的資源時標記為0intflag2;//當所有進程不都分配成功時標記為0int*s=(int*)malloc(sizeof(int)*m);//記錄安全序列doint*s=(int*)malloc(sizeof(int)*m);//記錄安全序列do{for(i=0;i<m;i++)//一輪分配if((process->Finish)[i]二二FALSE){flag1=1;for(j=0;j<n;j++)if((process->Need)[i][j]>(process->Work)[j])flagl=O;//有不符合條件的資源if(flag1==1){for(j=0;j<n;j++)*((process->Work)+j)+二*((process->Allocation)[i]+j);(process->Finish)[i]二TRUE;*s=i;s++;}}k--;//每完成一次進程分配時k減1,以便跳出循環(huán)和防止死循環(huán)}while(k>0);flag2=1;for(i=0;i<m;i++)//判斷是否所有進程都完成{if((process->Finish)[i]二二FALSE){flag2=0;break;}}if(flag2==0){

printf("當前狀態(tài)不安全!\n");return0;}else{printf("當前狀態(tài)安全!\n");for(i=0;i<m;i++)s—;printf("安全序列為:");for(i=0;i<m;i++)printf("P%d",s[i]);printf("\n");free(s);return1;}}voidMax(Process*process,intm,intn){m個指針,用來為每個數(shù)組分process->Max=(int**)malloc(sizeof(int*)*m);//m個指針,用來為每個數(shù)組分指向數(shù)組的首地址for(i=0;i<m;i++)(process->Max)[i]=(int*)malloc(sizeof(int)*n);//配n個指針元素printf(〃輸入各進程對各類資源的最大需求量:\n");for(i=0;i<m;i++){printf(〃P%d:\n〃,i);for(j=0;j<n;j++){scanf(〃%d〃,((process->Max)[i]+j));}}}voidNeed(Process*process,intm,intn){process->Need=(int**)malloc(sizeof(int*)*m);for(i=0;i<m;i++)(process->Need)[i]=(int*)malloc(sizeof(int)*n);printf(〃輸入各進程對各類資源的需求量:\n〃);for(i=0;i<m;i++){printf(〃P%d:\n〃,i);for(j=0;j<n;j++){scanf(〃%d〃,((process->Need)[i]+j));}}}voidAllocation(Process*process,intm,intn){process->Allocation=(int**)malloc(sizeof(int*)*m);for(i=0;i<m;i++)(process->Allocation)[i]=(int*)malloc(sizeof(int)*n);for(i=0;i<m;i++)for(j=0;j<n;j++)*((process->Allocation)[i]+j)二(*((process->Max)[i]+j))-(*((process—>Need)[i]+j));}voidAvailable(Process*process,intn){process->Available=(int*)malloc(sizeof(int)*n);printf(〃輸入系統(tǒng)可用資源數(shù):\n");for(i=0;i<n;i++)scanf("%d",&(process->Available)[i]);}intRequst(Process*process,intm,intn){process->Requst=(int**)malloc(sizeof(int*)*m);for(i=0;i<m;i++)(process->Requst)[i]=(int*)malloc(sizeof(int)*n);printf(〃輸入進程名及其資源請求量:\n〃);scanf("%d",&i);l=i;for(j=0;j<n;j++)scanf(〃%d〃,(process->Requst)[i]+j);intflagl=l;//申請量大于需求量時標記為0intflag2=1;//申請量大于可利用資源量時標記為0for(j=0;j<n;j++)//檢查申請量是否小于等于需求量if((process->Requst)[i][j]>(process->Need)[i][j])flag1=0;if(flag1==0){printf(〃不允許申請量大于需求量!請重新輸入。\n〃);return0;}if(flag1==1){for(j=0;j<n;j++)//檢查申請量是否小于等于系統(tǒng)中的可利用資源量if((process->Requst)[i][j]>(process->Available)[j])flag2=0;if(flag2==0){printf(〃不允許申請量大于可利用資源量!請重新輸入。\n");

}}elsereturn1;{ntmain()Processprocess;intm,n;printf("請輸入進程數(shù):");scanf("%d",&m);printf("請輸入資源種類數(shù):");scanf("%d",&n);Max(&process,m,n);Need(&process,m,n);Allocation(&process,m,n);Available(&process,n);Safe(&process,m,n);while(Bank(&process,m,n));return0;}所諭人灶程敷:弓所諭人灶程敷:弓詩輸入舒萌種類殖;3軻人卜進fi:對務(wù)左資i?的柴大爲求W:=P0!7b3Pl:32P2;9Cl2P3:222P4;g3軻人備進禪時備荽資潮的需求量」旳:743P1:122P2;6Ci0P3:011P4:斗魯]輸入系纜可用壷涮繪:gg寧安全序列為:PlP3P4POF2輸入進程客及其憐嫄請求量:1002請求并試仆配成功,當前狀態(tài)安全!安全呼

溫馨提示

  • 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

提交評論