oracle 银行家 算法,银行家算法详解(C语言)

#include

#include

/*定义数据结构*/

int Max[100][100] ={0};//最大需求矩阵

int Allocation[100][100]={0};//已分配矩阵

int Need[100][100]={0};//需求矩阵

int Available[100]={0}; //资源可用情况

char Name[100]={0};//资源名称

int Work[100]={0};//记录系统中当前各类可用资源的数目

int Request[100]={0};//系统对各类资源请求的数目

int Security[100]={0};//保存进程在安全情况下的执行顺序

int M;//系统中进程的数量

int N;//资源类型的数量

void init()

{

int i=0,j=0;

printf("请输入可用资源的种类数量:");

scanf("%d",&N);

for(i=0;i

{

printf("请输入第 %d 个可用资源的名称: ",i);

scanf("%s",&Name[i]);

printf("请输入初始可用资源 %c 的数量: ",Name[i]);

scanf("%d",&Available[i]);

}

printf("\n");

printf("请输入进程的数量:");

scanf("%d",&M);

printf("请输入进程的Max矩阵:\n");

for(i=0;i

for(j=0;j

scanf("%d",&Max[i][j]);

}

}

printf("请输入进程的Allocation矩阵:\n");

int temp[100]={0};//为了算新的Available

for(i=0;i

for(j=0;j

scanf("%d",&Allocation[i][j]);

//第一个进程需要j类资源的数量:最大需求量-已经分配的

Need[i][j]=Max[i][j]-Allocation[i][j];

temp[j]+=Allocation[i][j]; //统计已经分配的资源量

}

}

for(j=0;j

{

Available[j]=Available[j]-temp[j];

}

}

void show(){//功能:进行资源及进程相关信息显示

printf("\t--------------------\n");

printf("\t系统当前可用的资源矩阵Available:\n");

int i;

for(i=0;i

printf("%c ",Name[i]);

}

printf("\n");

for(i=0;i

printf("%d ",Available[i]);

printf("\n");

printf("\t系统当前资源分配情况如下: \n");

printf("\t Max Allocation Need\n");

printf("进程名 ");

int j=0;

for(j=0;j<3;j++)//每个进程名要输出三次

{

for(i=0;i

printf("%c ",Name[i]);

}

}

printf("\n");

for(i=0;i

printf("P%d ",i);

for(j=0;j

printf("%d ",Max[i][j]);

}

for(j=0;j

printf("%d ",Allocation[i][j]);

}

for(j=0;j

printf("%d ",Need[i][j]);

}

printf("\n");

}

}

int safe()

{

int Finish[100]={0};//Finish:系统是否有足够的资源分配给进程,使之完成运行

// 开始时先令Finish[i]=0,当有祖国资源分配给进程时,再令Finish[i]=1

int i=0;

for(i=0;i

{

Work[i]=Available[i];//在执行安全算法开始时,Work=Available

}

int j=0,count=0,k=0,m=0;

for(i=0;i

{

count=0;//遍历完一个进程就将count置为0,对新的i号进程资源达标数进行计数

for(j=0;j

//Finish[i]=0表示未执行

if(Finish[i]==0&&Need[i][j]<=Work[j])

{//如果进程没有执行且资源需求条件满足

count++;//统计有多少种资源满足条件

if(count==N) //表示对于i号进程所有资源都满足

{

Finish[i]=1;//记录i号进程为可执行

for(k=0;k

{

Work[k]=Work[k]+Allocation[i][k];

}

Security[m]=i;//记录第m个执行的是i号进程

i=-1;//将i置为-1;通过for循环执行i++后变为0,从第一个进程重新开始找

m++;

}

}

}

}

for(i=0;i

{

if(Finish[i]==0)

{

printf("系统不安全\n");

return -1;

}

}

printf("系统时安全的\n");

for(i=0;i

{

printf("P%d",Security[i]);

if(i

printf("-->");

}

printf("\n");

return 0;

}

bool bank()

{

printf("请输入希望手动分配资源的进程的编号:");

int Id,j;

bool flag=true;

while(scanf("%d",&Id))

{

if(Id < 0 || Id > M-1)

printf("进程不存在!请重新输入\n请输入希望手动分配资源的进程的编号:");

else break;

}

printf("请输入请求资源数(%d个):\n",N);

for(j=0;j

{

scanf("%d",&Request[j]);

}

printf("开始为进程P%d分配资源:\n",Id);

for(j=0;j

{

if(Request[j]>Need[Id][j]){

printf("进程请求资源数大于所需资源数,无法分配!\n");

flag=false;

break;

}

else if(Request[j]>Available[j]){

printf("进程请求资源数大于可用资源数,无法分配!\n");

flag=false;

break;

}

else{

Available[j] -= Request[j];

Allocation[Id][j] += Request[j];

Need[Id][j] -= Request[j];

}

}

return flag;

}

int main()

{

printf("\t--------------------------\n");

printf("\t|| ||\n");

printf("\t|| 模拟银行家算法 ||\n");

printf("\t|| ||\n");

printf("\t|| ||\n");

printf("\t|| Sparky ||\n");

printf("\t|| ||\n");

printf("\t--------------------------\n");

init();

show();

safe();

char choice;

printf("\t-------------------------------------\n");

printf("\t|| ||\n");

printf("\t|| 手动进行资源请求 ||\n");

printf("\t|| 输入R(r)请求资源 ||\n");

printf("\t|| 输入E(e)退出程序 ||\n");

printf("\t|| ||\n");

printf("\t|| ||\n");

printf("\t-------------------------------------\n");

while(true){

printf("请选择资源分配还是退出");

scanf("%s",&choice);

if(choice=='R'||choice=='r')

{

if(bank()){

safe();

show();

//exit(0);

}else{//说明没有分配资源,不必退出程序。

show();

}

}

else if(choice=='E'||choice=='e')

{

exit(0);

}

else

printf("请正确选择");

}

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值