銀行家算法C語言模擬程序 這個(gè)最簡單的模擬程序,為了完成操作系統(tǒng)作業(yè)而做的。大家放心,絕對可以運(yùn)行,呵呵! 有什么不完善的地方請?zhí)岢觯。ㄔ谟?jì)數(shù)器的運(yùn)用上比較亂,希望大家看的明白) (注:各位大哥大姐們,希望大家重視小弟我身為初學(xué)者不容易,到時(shí)別在其他網(wǎng)站到處亂添,這樣小弟我會很傷心的!作者:luo盧丹) 源程序: - #include<stdio.h>
- #include<stdlib.h>
- #include<conio.h>
- int Available[10]; //可使用資源向量
- int Max[10][10]; //最大需求矩陣
- int Allocation[10][10]={0}; //分配矩陣
- int Need[10][10]={0}; //需求矩陣
- int Work[10]; //工作向量
- int Finish[10]; //狀態(tài)標(biāo)志
- int Request[10][10]; //進(jìn)程申請資源向量
- int Pause[10];
- int List[10];
- int i,j;
- int n; //系統(tǒng)資源總數(shù)
- int m; //總的進(jìn)程數(shù)
- int a; //當(dāng)前申請的進(jìn)程號
- int l,e; //計(jì)數(shù)器
- int b=0,c=0,f=0,g; //計(jì)數(shù)器
- void mainenter()//主要的輸入部分代碼
- {
- printf("請輸入系統(tǒng)總共有的資源數(shù):");
- scanf("%d",&n);
- printf("請輸入總共有多少個(gè)進(jìn)程:");
- scanf("%d",&m);
- for(i=1;i<=n;i++)
- {
- printf("第%d類資源有的資源實(shí)例:",i);
- scanf("%d",&Available[i]);
- }
- for(i=1;i<=m;i++)
- {
- for(j=1;j<=n;j++)
- {
- printf("進(jìn)程P[%d]對第%d類資源的最大需求量:",i,j);
- scanf("%d",&Max[i][j]);
- Need[i][j]=Max[i][j];
- }
- }
- }
- void mainrequest() //進(jìn)程提出新申請的代碼部分
- {
- printf("請輸入申請資源的進(jìn)程:");
- scanf("%d",&a);
- for(i=1;i<=n;i++)
- {
- printf("請輸入進(jìn)程P[%d]對%d類資源的申請量:",a,i);
- scanf("%d",&Request[a][i]);
- if(Request[a][i]>Need[a][i])
- printf("n出錯(cuò)!進(jìn)程申請的資源數(shù)多于它自己申報(bào)的最大量n");
- if(Request[a][i]>Available[i])
- printf("nP[%d]必須等待n",a);
- //以下是試探性分配
- Available[i]=Available[i]-Request[a][i];
- Allocation[a][i]=Allocation[a][i]+Request[a][i];
- Need[a][i]=Need[a][i]-Request[a][i];
- Work[i]=Available[i];
- }
- for(i=1;i<=m;i++)
- {
- Pause[i]=Available[i];//Pause[i]只是一個(gè)暫時(shí)寄存的中間變量,為防止在下面
- //安全性檢查時(shí)修改到Available[i]而代替的一維數(shù)組
- Finish[i]=false;
- }
- for(g=1;g<=m;g++)
- {
- for(i=1;i<=m;i++)
- {
- b=0; //計(jì)數(shù)器初始化
- for(j=1;j<=n;j++)
- {
- if(Need[i][j]<=Pause[j])
- {
- b=b+1;
- }
- if(Finish[i]==false&&b==n)
- {
- for(l=1;l<=n;l++)
- {
- Pause[l]=Pause[l]+Allocation[i][l];
- }
- Finish[i]=true;
- printf("$ %d ",i);//依次輸出進(jìn)程安全序列之一中每個(gè)元素
- }
- }
- }
- }
- printf("n");
- for(i=1;i<=m;i++)
- {
- if(Finish[i]==true) f=f+1;//統(tǒng)計(jì)Finish[i]==true的個(gè)數(shù)
- }
- if (f==m)
- {
- printf("safe static");
- f=0;//將計(jì)數(shù)器f重新初始化,為下一次提出新的進(jìn)程申請做準(zhǔn)備
- }
- else
- {
- printf(" unsafe static ");//以下代碼為當(dāng)系統(tǒng)被判定為不安全狀態(tài)時(shí)
- //返回提出申請前的狀態(tài)
- for(i=1;i<=n;i++)
- {
- Available[i]=Available[i]+Request[a][i];
- Allocation[a][i]=Allocation[a][i]-Request[a][i];
- Need[a][i]=Need[a][i]+Request[a][i];
- }
- }
- }
- void mainprint()
- {
- printf("當(dāng)前的系統(tǒng)狀態(tài)n");
- printf(" 目前占有量 最大需求量 尚需要量 n進(jìn)程");
- for(i=1;i<=n;i++)
- for(j=1;j<=n;j++)
- {
- printf(" %d類",j);
- }
- for(i=1;i<=m;i++)
- {
- printf("nP[%d]",i);
- for(j=1;j<=n;j++)
- {
- printf(" %d ",Allocation[i][j]);
- }
- for(j=1;j<=n;j++)
- {
- printf(" %d ",Max[i][j]);
- }
- for(j=1;j<=n;j++)
- {
- printf(" %d ",Need[i][j]);
- }
- }
- printf("nn系統(tǒng)剩余資源量: ");
- for(i=1;i<=n;i++)
- {
- printf(" %d ",Available[i]);
- }
- printf("n");
- }
- void main()
- { int k,h=1;
- while(h)
- { system("cls");
- {
- printf("nn ★ 歡迎使用本程序 ★n");
- printf("nn 1:輸入系統(tǒng)的資源數(shù)、申請進(jìn)程數(shù)、每個(gè)類資源的實(shí)例數(shù)");
- printf("n 2:…………………………………… 輸入進(jìn)程的資源申請");
- printf("n 3:…………………………………………… 輸出系統(tǒng)狀態(tài)");
- printf("n 4:………………………………………………… 退出程序");
- printf("nn please choose ");
- scanf("%d",&k);
- }
- switch(k)
- {
- case 1:mainenter(); break;
- case 2:mainrequest(); break;
- case 3:mainprint(); break;
- case 4:h=0; break;
- }
- printf("n");
- system("pause");
- }
- system("cls");
- printf("nn 謝謝使用 n");
- printf("nn See you next time!!!nnn");
- }
復(fù)制代碼
以下是程序運(yùn)行截圖:
以此輸入每個(gè)進(jìn)程對各類資源的需求量; 所有進(jìn)程輸入完成后系統(tǒng)的當(dāng)前狀態(tài)
|