⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ban.c

📁 银行家算法代码供各位使用
💻 C
字号:
 #include<stdio.h>  
   #include "windows.h" 
   #define    M    5     //M为进程数                     
   #define    N    3   //N为资源数                     
   #define    FALSE    0    
   #define    TRUE    1    
   int    Max[M][N]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}};    
   int    Available[N]={10,5,7};      
   int    Request[M][N]={0};   
   int    Need[M][N]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}};    
   int    Allocation[N]={0};  //进程初分配资源   
   int    Finish[M]={FALSE}; 
   int    Work[N]={0}; 


 

 void showdata()  
 {  
int i,j;  
 printf("系统可用资源数为:\n ");  
  
  
for (j=0;j<N;j++)  
printf("资源%c: %d ",j+65, Available[j]);  
printf("\n");  
printf("进程还需要的资源量: \n");  
printf(" A B C\n" ); 
for(i=0;i<M;i++)  
 {  
printf("进程%d:",i);  
for(j=0;j<N;j++)  
printf(" %d ", Need[i][j]);  
printf("\n");  
 }  
  
printf("进程已经得到的资源量:\n");  
printf(" A B C\n" ); 
for(i=0;i<M;i++)  
 {  
printf("进程%d:",i);  
for(j=0;j<N;j++)  
printf(" %d ",Allocation[i][j]);  
printf("\n");  
 }  
 }  
  

void changdata(int k)  
 {  int j;
for(j=0;j<N;j++)  
 {  
Available[j]-=Request[j];  //预分配0之后在分配的系统剩余资源
Allocation[k][j]+=Request[j];  //申请资源之后拥有资源
Need[k][j]-=Request[j];  //分配后还需要资源数
 }  
 }  
  
int checkFinish(int k) 
{ int j;
for( j=0;j<N;j++) 
 if(Allocation[k][j]!=Max[k][j]) break; //判断进程是否满足资源数
if(j<N) return 0; 
else{ 
   Finish[k]=TRUE; 
 return 1; 
 } 
}  


void release(int k) 
{ 
 int j; 
 for(j=0;j<N;j++) 
{ 
 Available[j]+=Allocation[k][j];//某进程释放资源后的剩余资源数 
 Allocation[k][j]=0; 
 Need[k][j]=0; 
} 
}  


void rstordata(int k)  
 {  int j;
for( j=0;j<N;j++)  
 {  
Available[j]+=Request[j];  
Allocation[k][j]-=Request[j];  
Need[k][j]+=Request[j];  
 }  
 }  
  
  
int chkerr(int i,int Work[])  
 {  
    int m ,j,count=15; 
int signal[N]={FALSE} ; 
while(count){  
for(j=0;j<N;j++)  
{  
if (Finish[i]==FALSE&&Need[i][j]<=Work[j])  
{  
signal[j]=TRUE;  
  }  
} 
for( m=0;m<N;m++)  
if(signal[m]==FALSE) break; //判断某一个元组是否满足分配资源数
if(m==N);  
 { Finish[i]=TRUE; 
    for(j=0;j<N;j++) 
Work[j]+=Allocation[i][j]; } //某一进程释放资源后的剩余资源

count--; 
 i++;  
 if(i==M) i=0; 
      
}  


for(i=0;i<M;i++)  
 if(Finish[i]==FALSE)  //判断进程是否安全
 {  
printf("====================\n系统不安全!!! \n本次资源申请不成功!!!\n=================\n");  
return 1;  
 }  
printf("===========RIGHT!\n经安全性检查,系统安全,本次分配成功。\n");  
 printf("\n=============================RIGHT!\n"); 
 printf("\n");  
 return 0;  
 }  
 
 

 void main(){  
 int j=0;  
 char flag='Y';  
 showdata();  
 while(flag=='Y'||flag=='y')  
 {  
int i=M+1;  
while(i<0||i>=M)  
 {  
printf("请输入申请资源的进程号(0--4):");  
scanf("%d",&i);  
 if(i<0||i>=M)  
 printf("\n=========================ERROR!\n输入的进程号不存在,重新输入!\n=========================ERROR!\n");  
  
} 
  
 printf("请输入进程%d申请的资源数",i);  
  
 for(j=0;j<N;j++)  
 {  
printf("\n资源%c:",j+65);  
scanf("%d",&Request[j]);  
  
 if(Request[j]>Need[i][j])  
{  
printf("=================ERROR!\n进程%d申请的资源数大于进程%d还需要%c类资源的资源量!\n",i,i,j+65);  
printf("申请不合理!请重新选择!\n================ERROR!\n");  
flag='N';  
break;  
}  
 else  
{  
if(Request[j]>Available[j])  
 {  
printf("=====================ERROR!\n进程%d申请的资源数大于系统可用%c类资源的资源量!\n",i,j+65);  
printf("申请不合理!请重新选择!\n=========================ERROR!\n");  
flag='N';  
break;  
}  
}  
 }  
 if(flag=='Y'||flag=='y')  
 {  
changdata(i); 

if(checkFinish(i)) {release(i) ; printf("====================================================================\n进程%d已经完成!\n",i);}  
for(j=0;j<N;j++) Work[j]=Available[j]; 
if(chkerr(i,Work))  
{  
rstordata(i);  
showdata();  
}  
else  
showdata();  
}  
 else  
 showdata();  
 printf("\n");  
 printf("是否继续银行家算法演示?(按'Y'或'y'键继续,按其它任意键退出演示): ");  
 getchar();  

 flag=getc(stdin); 
 }  
  
 }  
 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -