银行家算法

#include "string.h" 
#include <stdio.h> 
#include <stdlib.h> 
#define M 5 
#define N 3 
#define FALSE 0 
#define TRUE 1 


/*M个进程对N类资源最大资源需求量*/ 
int MAX[M][N]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}}; 
/*系统可用资源数*/ 
int AVAILABLE[N]={1,1,2}; //N类资源最大资源量{10,5,7}
/*M个进程对N类资源最大资源需求量*/ 
int ALLOCATION[M][N]={{3,2,2},{1,1,0},{3,0,2},{1,1,1},{1,0,1}}; 
/*M个进程已经得到N类资源的资源量 */ 
int NEED[M][N]={{4,3,1},{2,1,2},{6,0,0},{1,1,1},{3,3,2}}; 
/*M个进程还需要N类资源的资源量*/ 
int Request[N]={0,0,0}; 




void main() 

int i=0,j=0; 
char flag='Y'; 
void showdata(); 
void changdata(int); 
void rstordata(int); 
int chkerr(int); 
showdata(); 
while(flag=='Y'||flag=='y') 

i=-1; 
while(i<0||i>=M) 

printf("请输入需申请资源的进程号(从0到"); 
printf("%d",M-1); 
printf(",否则重输入!):"); 
scanf("%d",&i); 
getchar();
if(i<0||i>=M)printf("输入的进程号不存在,重新输入!\n"); 

printf("请输入进程"); 
printf("%d",i); 
printf("申请的资源数\n"); 
for (j=0;j<N;j++) 

printf("资源"); 
printf("%d",j); 
printf(":"); 
scanf("%d",&Request[j]); 
getchar();
if(Request[j]>NEED[i][j]) 

printf("进程"); 
printf("%d",i); 
printf("申请的资源数大于进程"); 
printf("%d",i); 
printf("还需要"); 
printf("%d",j); 
printf("类资源的资源量!申请不合理,出错!请重新选择!\n"); 
flag='N'; 
break; 

else 

if(Request[j]>AVAILABLE[j]) 

printf("进程"); 
printf("%d",i); 
printf("申请的资源数大于系统可用"); 
printf("%d",j); 
printf("类资源的资源量!申请不合理,出错!请重新选择!\n"); 
flag='N'; 
break; 



if(flag=='Y'||flag=='y') 
{
changdata(i); 
if(chkerr(i)) 

rstordata(i); 
showdata(); 

else 
showdata(); 

else 
showdata();
printf("\n"); 
        //printf("flag=%d",flag);
printf("是否继续银行家算法演示,按'Y'或'y'键继续,按'N'或'n'键退出演示: ");
scanf("%c",&flag); 
//printf("flag=%d",flag);
getchar();




void showdata() //显示当前可用资源,各进程还需要的资源量,各进程已经得到的资源量

int i,j; 
printf("系统可用的资源数为:\n"); 
printf(" "); 
for (j=0;j<N;j++)

printf(" 资源"); 
printf("%d",j); 
printf(":"); 
printf("%d",AVAILABLE[j]); 

printf("\n"); 
printf("各进程还需要的资源量:\n"); 
for (i=0;i<M;i++) 

printf(" 进程"); 
printf("%d",i); 
printf(":"); 
for (j=0;j<N;j++)

printf("资源"); 
printf("%d",j); 
printf(":"); 
printf("%d",NEED[i][j]); 

printf("\n"); 

printf("各进程已经得到的资源量: \n"); 
for (i=0;i<M;i++) 

printf(" 进程"); 
printf("%d",i); 
for (j=0;j<N;j++)

printf("资源"); 
printf("%d",j); 
printf(":"); 
printf("%d",ALLOCATION[i][j]); 

printf("\n"); 




void changdata(int k) //改变当前可用资源,当前进程还需要的资源量,当前进程已经得到的资源量

int i,j; 
for (j=0;j<N;j++) 

AVAILABLE[j]=AVAILABLE[j]-Request[j]; 
ALLOCATION[k][j]=ALLOCATION[k][j]+Request[j]; 
NEED[k][j]=NEED[k][j]-Request[j]; 

    for (j=0;j<N;j++)

printf(" 资源"); 
printf("%d",j); 
printf(":"); 
printf("%d",AVAILABLE[j]); 

printf("\n"); 
printf("各进程还需要的资源量:\n"); 
for (i=0;i<M;i++) 

printf(" 进程"); 
printf("%d",i); 
printf(":"); 
for (j=0;j<N;j++)

printf("资源"); 
printf("%d",j); 
printf(":"); 
printf("%d",NEED[i][j]); 

printf("\n"); 




void rstordata(int k) //改变当前可用资源,当前进程还需要的资源量,当前进程已经得到的资源量

int j; 
for (j=0;j<N;j++) 

AVAILABLE[j]=AVAILABLE[j]+Request[j]; 
ALLOCATION[k][j]=ALLOCATION[k][j]-Request[j]; 
NEED[k][j]=NEED[k][j]+Request[j]; 




int chkerr(int s) //检查本次资源分配是否合理

int WORK[M],FINISH[M],temp[M]; 
int i,j,k=0; 
for(i=0;i<M;i++)
FINISH[i]=FALSE; 
i=s;
while(i<M) 

for(j=0;j<N;j++)
{  
WORK[j]=AVAILABLE[j]; 
printf("第%d个进程\n",i);
printf("当前资源%d\n",WORK[j]);
printf("当前需要资源%d\n",NEED[i][j]);
if (FINISH[i]==FALSE&&NEED[i][j]<=WORK[j]) 

WORK[j]=WORK[j]+ALLOCATION[i][j]; 
printf("当前资源%d\n",WORK[j]);
FINISH[i]=TRUE; 
temp[k]=i; 
k++; 
 


  i++; 
}
for(i=0;i<M;i++) 
if(FINISH[i]==FALSE) 

printf("\n"); 
printf("系统不安全!!! 本次资源申请不成功!!!\n"); 
printf("\n"); 
return 1; 


printf("\n"); 
printf("经安全性检查,系统安全,本次分配成功。\n"); 
printf("\n"); 
printf(" 本次安全序列:"); 
for(i=0;i<M;i++)

printf("进程"); 
printf("%d",temp[i]); 
printf("->"); 

printf("\n"); 
rstordata(s);
return 0; 
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

发哥1997

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值