银行家算法

运行环境VS 2010

// banker.cpp : 定义控制台应用程序的入口点。

//


#include "stdafx.h"
#include<string.h>
typedef struct Max1         // 资源的最大需求量
{ int m_a;
int m_b;
int m_c;
}Max;                
typedef struct Allocation1      //已分配的资源数
{ int a_a;
int a_b;
int a_c;
}Allocation;          
typedef struct Need1      //还需要的资源数
{ int n_a;
int n_b;
int n_c;
}Need;              
struct Available1       //可利用的资源量
{ int av_a;
int av_b;
int av_c;
} q;
struct pr              //定义一个结构
{ char name;
Max max;
Allocation allocation;
Need need;
int finishflag;
}p[5];


char na[5]; //安全序列
//********************************************
void init()  //读入文件"bank.txt"
{ int i;
    FILE *fp=NULL;


printf("各进程还需要的资源数NEED:\n");
fp=fopen("bank.txt","r+"); // 打开文件"bank.txt"
for(i=0;i<5;i++)
{ fscanf(fp,"%c%d%d%d%d%d%d\n",&p[i].name,&p[i].max.m_a,&p[i].max.m_b,
&p[i].max.m_c,&p[i].allocation.a_a,&p[i].allocation.a_b,&p[i].allocation.a_c);
p[i].need.n_a=p[i].max.m_a-p[i].allocation.a_a;
p[i].need.n_b=p[i].max.m_b-p[i].allocation.a_b;
p[i].need.n_c=p[i].max.m_c-p[i].allocation.a_c;

printf("%c: %d  %d  %d\n",p[i].name,p[i].need.n_a,p[i].need.n_b,p[i].need.n_c);
}
fclose(fp);  //关闭文件
}


//***********************************************
int fenpei()//分配资源
{ int i,j,finishcnt=0,k=0,count=0;
printf("Avaliable:");
printf("%d  %d  %d\n",q.av_a,q.av_b,q.av_c);

for(j=0;j<5;j++)  p[j].finishflag=0;


while(finishcnt<5)
{ for(i=0;i<5;i++)
{ if(p[i].finishflag==0&&q.av_a>=p[i].need.n_a&&q.av_b>=p[i].need.n_b&&q.av_c>=p[i].need.n_c)
{ q.av_a+=p[i].allocation.a_a;
q.av_b+=p[i].allocation.a_b;
q.av_c+=p[i].allocation.a_c;
p[i].finishflag=1;
finishcnt++;
na[k++]=p[i].name;
break;
}//if
}//for
count++;//禁止循环过多 
if(count>5) return 0;
}//while
for(i=0;i<5;i++){
q.av_a-= p[i].allocation.a_a;
q.av_b-= p[i].allocation.a_b;
q.av_c-= p[i].allocation.a_c;
}
return 1;
}


//****************************************************
int shenqing()  //申请资源
{
int n,a,b,c;
printf("请输入申请资源的进程序号:\n");
scanf("%d",&n);
printf("请依次输入各类资源的申请数量:\n");
scanf("%d%d%d",&a,&b,&c);
getchar();
if(p[n].need.n_a>=a&&p[n].need.n_b>=b&&p[n].need.n_c>=c){
if(q.av_a>=a&&q.av_b>=b&&q.av_c>=c){
printf("%d  %d  %d\n",q.av_a,q.av_b,q.av_c);
q.av_a=q.av_a-a;
q.av_b=q.av_b-b;
q.av_c=q.av_c-c;
p[n].allocation.a_a=p[n].allocation.a_a+a;
p[n].allocation.a_b=p[n].allocation.a_b+b;
p[n].allocation.a_c=p[n].allocation.a_c+c;
p[n].need.n_a-=a;
p[n].need.n_b-=b;
p[n].need.n_c-=c;
printf("申请成功\n");
return 1;
}
else{
printf("系统可分配资源量不足,申请失败\n");
return 1;
}
}
else{
printf("申请资源超过Need量,申请失败\n");
return 1;
}
}




int _tmain(int argc, _TCHAR* argv[])
{
int flag=1,i,k; //flag控制程序循环执行
char c;
printf("            /******** 银  行  家  算  法********/  \n");
printf("确认已经在\"bank.txt\"文档中正确输入各进程的有关信息后按回车键\n");
getchar(); //接收回车符
init();
q.av_a=10;  //各种资源的数量
q.av_b=5;
q.av_c=7;
for(i=0;i<5;i++){
q.av_a-= p[i].allocation.a_a;
q.av_b-= p[i].allocation.a_b;
q.av_c-= p[i].allocation.a_c;
}
while(flag!=0) //flag=0,循环结束
{
if(fenpei())
{
printf("这样配置资源是安全的!\n");
printf("其安全序列是:  ");
for(k=0;k<5;k++)  printf("-->%c",na[k]);
printf("\n");
printf("各进程还需要的资源数NEED:\n");
for(i=0;i<5;i++)
printf("%c: %d  %d  %d\n",p[i].name,p[i].need.n_a,p[i].need.n_b,p[i].need.n_c);
printf("有进程发出Request请求向量吗?(Enter y or Y)\n");
c=getchar();
getchar();
if(c=='y'||c=='Y') {if(shenqing())  continue; else break; }
else flag=0;
}//if
else {flag=0; printf("不安全!!!\n");}
}//while
return 0;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值