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

下載本文檔

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

文檔簡介

1、操作系統(tǒng)實驗報告-死鎖的避免操作系統(tǒng)實驗(二)死鎖的避免1 .實驗內(nèi)容使用C+實現(xiàn)模擬隨機算法和銀行家算法2 .實驗?zāi)康模?) 了解死鎖的產(chǎn)生原因(隨機算法)(2)理解死鎖的解決辦法(銀行家算法)3 .實驗題目使用隨機算法和銀行家算法設(shè)計程序4 .程序流程圖主要過程流程圖開始安全性算法流程圖5 .程序代碼和運行結(jié)果#include <stdio.h>#include<stdlib.h>typedef structint A;int B;int C;RES;#define false 0#define true 1/系統(tǒng)中所有進(jìn)程數(shù)量#define PNUMBER 3/最

2、大需求矩陣RES MaxPNUMBER;/已分配資源數(shù)矩陣RES AllocationPNUMBER;/需求矩陣RES NeedPNUMBER;/可用資源向量RES Available=0,0,0;/安全序列int safePNUMBER;void setConfig()int i=0,j=0;printf("=開 始 手 動 配 置 資 源=n");/可分配資源printf("輸入可分配資源n");scanf("%d%d%d",&Available.A,&Available.B,&Available.C);/

3、最大需求矩陣MAXprintf("輸入最大需求矩陣 dx%dn",PNUMBER,PNUMBER );for (i=0;i<PNUMBER;i+)scanf("%d%d%d”,&Maxi.A,&Maxi.B,&Maxi.C);/已分配矩陣Allocprintf("輸入已分配矩陣 dx%dn",PNUMBER,PNUMBER);for (i=0;i<PNUMBER;i+)scanf("%d%d%d”,&Allocationi.A,&Allocationi.B,&Allocati

4、oni.C);/需求矩陣printf("輸入需求矩陣 dx%dn",PNUMBER,PNUMBER);for (i=0;i<PNUMBER;i+) scanf("%d%d%d”,&Needi.A,&Needi.B,&Needi.C);printf("=結(jié)束配置資源=n");void loadConfig()FILE *fp1;if (fp1=fopen("config.txt","r")=NULL) printf("沒有發(fā)現(xiàn)配置文件,請手動輸入!!n");

5、setConfig();elseint i=0;printf("發(fā)現(xiàn)配置文件,開始導(dǎo)入.n");/可分配資源fscanf(fp1,"%d%d%d",&Available.A,&Available.B,&Available.C);/最大需求矩陣MAXfor (i=0;i<PNUMBER;i+) fscanf(fp1,"%d%d%d”,&Maxi.A,&Maxi.B,&Maxi.C);/已分配矩陣Allocfor (i=0;i<PNUMBER;i+) fscanf(fp1,"%d

6、%d%d”,&Allocationi.A,&Allocationi.B,&Allocationi.C);/需求矩陣for (i=0;i<PNUMBER;i+)fscanf(fp1,"%d%d%d”,&Needi.A,&Needi.B,&Needi.C);/試探分配void ProbeAlloc(int process,RES *res)Available.A -= res->A;Available.B -= res->B;Available.C -= res->C;Allocationprocess.A += r

7、es->A;Allocationprocess.B += res->B;Allocationprocess.C += res->C;Needprocess.A -= res->A;Needprocess.B -= res->B;Needprocess.C -= res->C;/若試探分配后進(jìn)入不安全狀態(tài),將分配回滾void RollBack(int process,RES *res)Available.A += res->A;Available.B += res->B;Available.C += res->C;Allocationproc

8、ess.A -= res->A;Allocationprocess.B -= res->B;Allocationprocess.C -= res->C;Needprocess.A += res->A;Needprocess.B += res->B;Needprocess.C += res->C;/安全性檢查bool SafeCheck() RES Work;Work.A = Available.A;Work.B = Available.B;Work.C = Available.C;boolFinishPNUMBER = false,false,false;i

9、nti;intj = 0;for (i = 0; i < PNUMBER; i+)/是否已檢查過if(Finishi = false)/是否有足夠的資源分配給該進(jìn)程if(Needi.A <= Work.A && Needi.B <= Work.B && Needi.C<=Work.C)/有則使其執(zhí)行完成,并將已分配給該進(jìn)程的資源全部回收Work.A += Allocationi.A;Work.B += Allocationi.B;Work.C += Allocationi.C;Finishi = true;safej+ = i;i = -

10、1;/重新進(jìn)行遍歷/如果所有進(jìn)程的Finish向量都為true則處于安全狀態(tài),否則為不安全狀 態(tài)for (i = 0; i < PNUMBER; i+)if (Finishi = false)return false;return true;/資源分配請求bool request(int process,RES *res)/request向量需小于Need矩陣中對應(yīng)的向量if(res->A <= Needprocess.A && res->B <= Needprocess.B && res->C <=Needproces

11、s.C)(/request向量需小于Available向量 if(res->A <= Available.A && res->B <= Available.B && res->C <=Available.C)/試探分配ProbeA110c(process,res);/如果安全檢查成立,則請求成功,否則將分配回滾并返回失敗 if(SafeCheck() (return true; else ( printf("安全性檢查失敗。原因:系統(tǒng)將進(jìn)入不安全狀態(tài),有可能引起死鎖。n");printf("正在回

12、滾.n"); RollBack(process,res); else ( printf("安全性檢查失敗。原因:請求大于可利用資源。n");else( printf("安全性檢查失敗。原因:請求大于需求。n"); return false;/輸出資源分配表 void PrintTable() (printf("=資源分配表=n");NeedA Bprintf("Process MaxAllocationAvailablen"); printf("ABC ABCCAB Cn");prin

13、tf("P0 %2d%2d%2d%2d%2d%2d%2d%2d%2d%2d%2d %2dn",Max0AMax0.B,Max0CAllocation0AAllocation0.B,Allocation0CNeed0ANeed0.B,Need0CAvailableAAvail able.B,Available.C);printf("P1 %2d%2d%2d%2d%2d%2d%2d%2d%2dn",Max1.A,Max1.B,Max1CAllocation1.A,Allocation1.B,Allocatio n1.C,Need1.A,Need1.B,Nee

14、d1.C);printf("P2 %2d%2d%2d%2d%2d%2d%2d%2d%2dn",Max2.A,Max2.B,Max2CAllocation2.A,Allocation2.B,Allocatio n2.C,Need2.A,Need2.B,Need2.C);printf("= =n");/銀行家算法分配 void banker()char ch;/判斷輸入的是否是安全狀態(tài)PrintTable();printf("先檢查初始狀態(tài)是否安全。n");if (SafeCheck() printf("系統(tǒng)處于安全狀態(tài)。n&q

15、uot;);printf("安全序列是P%d,P%d,P%d 。 n",safe0,safe1,safe2); elseprintf("系統(tǒng)處于不安全狀態(tài)。程序?qū)⑼顺鰊");printf("執(zhí)行完畢。n");getchar(); return ;/開始分配 doint process;RES res;printf("請依次輸入請求分配的進(jìn)程和對三類資源的請求數(shù)量(進(jìn)程編號 0.1.2.)n");scanf("%d%d%d%d",&process,&res.A,&res.B

16、,&res.C);if(process<3 && process>=0)if (request(process,&res)printf("分配成功。n");PrintTable();printf(" 安 全 序 列 是P%d,P%d,P%d。n",safe0,safe1,safe2); else printf("分配失敗。n");printf("是否繼續(xù)分配? (Y/N):");getchar();ch = getchar();elseprintf("輸入的進(jìn)程

17、號02n");ch = 'y' while (ch = 'Y' | ch = 'y');printf("執(zhí)行完畢。n");/隨機分配算法執(zhí)行bool RandRequest(int process,RES *res) /request向量需小于Available向量if(res->A <= Available.A && res->B <= Available.B && res->C <= Available.C)/試探分配ProbeAlloc(pro

18、cess,res);/判斷進(jìn)程是否執(zhí)行完,執(zhí)行完釋放資源if(Maxprocess.A <= Allocationprocess.A && Maxprocess.B <=Allocationprocess.B && Maxprocess.C <= Allocationprocess.C)printf("nP%d 執(zhí)行完畢,釋放所分配的資源n",process);/有則使其執(zhí)行完成,并將已分配給該進(jìn)程的資源全部回收 Available.A += Allocationprocess.A;Available.B += Alloca

19、tionprocess.B;Available.C += Allocationprocess.C;Allocationprocess.A = 0;Allocationprocess.B = 0;Allocationprocess.C = 0;Needprocess.A = Maxprocess.A;Needprocess.B = Maxprocess.B;Needprocess.C = Maxprocess.C; return true;else printf("分配失敗。原因:請求大于可利用資源。n");return false;/隨機分配void randPatch()

20、char ch;/判斷輸入的是否是安全狀態(tài)PrintTable();printf("先檢查初始狀態(tài)是否安全。n");if (SafeCheck()printf("系統(tǒng)處于安全狀態(tài)。n");printf("安全序列是P%d,P%d,P%d 。 n",safe0,safe1,safe2);elseprintf("系統(tǒng)處于不安全狀態(tài)。程序?qū)⑼顺鰊");printf("執(zhí)行完畢。n");getchar(); return ;/開始分配doint process;RES res;(進(jìn)程編printf(&q

21、uot;請依次輸入請求分配的進(jìn)程和對三類資源的請求數(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");

22、printf("是否繼續(xù)分配?(Y/N):");getchar();ch = getchar(); while (ch = 'Y' | ch = 'y');printf("執(zhí)行完畢。n"); int main()int x;while(1) printf("= =n");printf("ttt共享資源分配與銀行家算法n");printf("= =n");printf("ttt 按1.導(dǎo)入配置信息n");printf("ttt 按 2.

23、銀行家算法 n");printf("ttt 按3.隨機分配算法n");printf("ttt 按 0.退出系統(tǒng) n");printf("= =n");printf("您輸入的是:");scanf("%d",&x);fflush(stdin);system("cls");printf("= =n");printf("ttt共享資源分配與銀行家算法");if (x = 2)printf("t-銀行家算法 n&qu

24、ot;);else if(x=3) printf("t-隨機分配算法n");printf("= =n");switch(x)case 1:/加載配置文件loadConfig();/打印資源分配表PrintTable();printf("信息導(dǎo)入完成.n");getchar();break;case 2: banker();break;case 3: randPatch(); break;case 0:printf( 退出系統(tǒng)n");return 0;break;default:printf("請輸入01之間的數(shù)字n"); return 0;/*Config.txt 5 5 5 7 5 3 3 2 2 9 0 2 0 1 0 2 0 0 3 0 2 7 4 3 1 2 2 6 0 0*/共享資源分配與銀行家算法息法 哈法茸 置三配.統(tǒng)R菜出導(dǎo)銀篇12 3 088你輸入的是:隨機3配算法與銀行家算去發(fā)理己置文件,開始導(dǎo)入一資源分配表ProcessHaxFl llocat ionA

溫馨提示

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

評論

0/150

提交評論