?? yinhangjia.cpp
字號:
#include<stdio.h>
//全局變量
int max[5][10],allocation[5][10],need[5][10],available[10];//定義變量
int request[5][10];//進程需求
int k=5;//序列臨時變量
int jincheng=0;//當前進程
//初始化數據
int available0[10]={3,8,5,6,3,4,5,4,3,8};//可用資源
int anquanxulie[5]={1,4,3,0,2};
int max0[5][10]={
{7,5,3,2,3,1,4,6,7,3},
{3,2,2,2,3,4,5,6,1,6},
{9,0,2,4,0,4,8,2,4,7},
{2,2,2,3,6,7,2,4,2,5},
{4,3,3,4,7,3,7,2,4,6}
};//最大需求
int allocation0[5][10]={
{0,1,0,1,2,1,0,2,3,0},
{2,0,0,2,2,0,1,2,0,1},
{3,0,2,1,0,2,2,0,2,1},
{2,1,1,0,2,0,0,1,0,0},
{0,0,2,0,1,3,2,1,2,0}
};//已分配
int need0[5][10]={
{7,4,3,1,4,0,4,4,4,3},
{1,2,2,0,3,4,1,4,1,5},
{6,0,0,3,2,4,1,2,2,6},
{0,1,1,3,2,7,3,3,2,5},
{4,3,1,4,4,0,1,1,2,6}
};//需求
int check()//安全算法
{
int work[10];
int finish[5];
int i,j,n;
for(j=0;j<10;j++)
work[j]=available[j];
for(i=0;i<5;i++)
finish[i]=0;
k=0;
loop:
for(i=0;i<5;i++)
if(finish[i]==0)
{
n=1;
for(j=0;j<10;j++)
if(need[i][j]>work[j])
{n=0;break;}
if(!n)
continue;
else
{
for(j=0;j<10;j++)
work[j]+=allocation[i][j];
finish[i]=1;
n=0;
for(j=0;j<10;j++)
n+=need[i][j];
if(n)
anquanxulie[k++]=i;
goto loop;
}
}
for(j=0;j<5;j++)
if(finish[j]==0){printf("\n不安全需求\n");
return 0;}
return 1;
}
void yinhangjia()//銀行家算法
{
int allocation1[10],available1[10],need1[10];
int n;
int j;
int k1=k;
for(j=0;j<10;j++)//寫入臨時變量
{
available1[j]=available[j];
allocation1[j]=allocation[jincheng][j];
need1[j]=need[jincheng][j];
}
for(j=0;j<10;j++)
{
available[j]-=request[jincheng][j];
need[jincheng][j]-=request[jincheng][j];
allocation[jincheng][j]+=request[jincheng][j];
}
if(check())//判斷是否安全
{
n=0;
for(j=0;j<10;j++)
n+=need[jincheng][j];
if(!n)
for(j=0;j<10;j++)
{
available[j]+=allocation[jincheng][j];//如果安全則釋放資源
allocation[jincheng][j]=0;
max[jincheng][j]=0;
}
}
else
{
k=k1;
for(j=0;j<10;j++)//否則寫回全局變量
{
allocation[jincheng][j]=allocation1[j];
need[jincheng][j]=need1[j];
available[j]=available1[j];
}
}
}
void main()//主函數
{
int i,j,a,b,c,n;
for(i=0;i<5;i++)
for(j=0;j<10;j++)
max[i][j]=max0[i][j];
for(i=0;i<5;i++)
for(j=0;j<10;j++)
allocation[i][j]=allocation0[i][j];
for(i=0;i<5;i++)
for(j=0;j<10;j++)
need[i][j]=need0[i][j];
for(j=0;j<10;j++)
available[j]=available0[j];//寫入基本數值
do{
do{
a=0;b=0;
printf("\n安全序列:\n");
for(i=0;i<k;i++)
{
printf("p%d ",anquanxulie[i]);
}
printf("\n");
printf("\n 已分配資源 最大需求資源 需求資源\n");
for(i=0;i<5;i++)
{
printf("p%d ",i);
printf(" ");
for(j=0;j<10;j++)
printf("%2d",allocation[i][j]);
printf(" ");
for(j=0;j<10;j++)
printf("%2d",max[i][j]);
printf(" ");
for(j=0;j<10;j++)
printf("%2d",need[i][j]);
printf(" \n");
}
printf("可利用資源:");
for(j=0;j<10;j++)
printf("%3d",available[j]);//以上為頁面輸出
printf("\n輸入請求進程號:\n");
scanf("%d",&jincheng);
if (jincheng<0 ||jincheng>=5)
{printf("\n\n沒當前進程\n\n");//判斷有否此進程
b=1;
continue;}
n=0;
for(j=0;j<10;j++)n+=need[jincheng][j];
if (!n) {
printf("\n\np%d進程處于完成狀態\n\n",jincheng);//判斷進程是否處于完成態
a=1;
continue;
}
printf("p%d進程對各資源的需求:\n",jincheng);
for(j=0;j<10;j++)
scanf("%d",&request[jincheng][j]);
printf("\n");
for(j=0;j<10;j++){
if(request[jincheng][j]>need[jincheng][j])
{
printf("\n\n進程所請求的資源超過其需求資源!\n\n");//判斷是否超過其需求資源并標記
a=1;
break;
}
}
for(j=0;j<10;j++){
if(request[jincheng][j]>available[j])
{
printf("\n\n進程所請求的資源超過可利用資源!\n\n");//判斷是否超過可利用資源并標記
b=1;
break;
}
}
}while((a==1)||(b==1));
yinhangjia();
c=0;
for(i=0;i<5;i++)//判斷進程是否全部完成
{
for(j=0;j<10;j++)
{
if(need[i][j]!=0)
c=1;
}
}
}while(c);
printf("\n進程全部完成\n\n銀行家算法 the end \n\n");
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -