要求:针对3类资源、5个进程的情况,设计相应的数据结构,分别表示每个进程占用各类资源的情况;编程实现安全性算法函数,编制主函数,动态输入资源的占用情况,进程的资源申请,调用安全性函数,实现银行家算法
#include "stdafx.h"
#include <stdio.h>
#include <iostream.h>
int available[3]; //可用资源
int work[3]; //工作向量
bool finish[5]; //用以判断系统是否有足够资源分给相应进程
int pro; //请求资源的进程
struct process {
int max[3]; //资源最大需求量
int allocation[3]; //已分配资源
int need[3]; //还需要的资源
int request[3]; //请求资源量
}p[5];
/*********************输入各类资源量及进程中各类资源的情况*****************/
void input(){
cout<<"请输入各类资源的可用量"<<endl;
for (int i=0;i<3;i++)
{
cin>>available[i]; //全部可用资源量
}
for (i=0;i<5;i++)
{
finish[i]=false; //初始化finish[i]
cout<<"请输入进程"<<i<<"对各类资源的最大需求量"<<endl;
for (int j=0;j<3;j++)
{
cin>>p[i].max[j];
}
cout<<"请输入进程"<<i<<"已分配的各类资源量"<<endl;
for (j=0;j<3;j++)
{
cin>>p[i].allocation[j];
// cout<<"需求量"<<p[i].allocation[j]<<endl;
// cout<<""
if (p[i].allocation[j]>available[j])
{
cout<<"您输入的已分配资源量大于资源总量,请重新输入!"<<endl;
j--;
continue;
}
if (p[i].allocation[j]>p[i].max[j])
{
cout<<"您输入的已分配资源量大于所需最大资源总量,请重新输入!"<<endl;
j--;
continue;
}
available[j]-=p[i].allocation[j]; //分配资源后可利用资源减少
}
for (j=0;j<3;j++)
{
p[i].need[j]=p[i].max[j]-p[i].allocation[j];
p[i].request[j]=0;
}
}
}
/*****************************输出当前时刻资源的分配情况**************************/
void print(){
cout<<"*****************此时的资源分配情况****************"<<endl;
cout<<"Process Max Allocation Need Available"<<endl;
for (int i=0;i<5;i++)
{
cout<<" "<<i<<" ";
for (int j=0;j<3;j++)
{
cout<<p[i].max[j]<<" ";
}
cout<<" ";
for (j=0;j<3;j++)
{
cout<<p[i].allocation[j]<<" ";
}
cout<<" ";
for (j=0;j<3;j++)
{
cout<<p[i].need[j]<<" ";
}
cout<<" ";
if (i==0)
{
for(j=0;j<3;j++)
cout<<available[j]<<" ";
}
cout<<endl;
}
}
/*********************银行家算法*****************/
void banker(){
cout<<"请输入请求资源的进程(0~~4)"<<endl;
cin>>pro;
if (pro>4)
{
cout<<"输入了错误的进程号,请检查"<<endl;
return;
}
cout<<"请输入进程所请求的各类资源量"<<endl;
for (int i=0;i<3;i++)
{
cin>>p[pro].request[i];
if (p[pro].request[i]>p[pro].need[i])
{
cout<<"进程请求资源量超过其所需最大资源量,非法请求"<<endl;
break;
}
if (p[pro].request[i]>available[i])
{
cout<<"进程请求资源量超过可用资源量,进程等待"<<endl;
break;
}
available[i]-=p[pro].request[i];
p[pro].allocation[i]+=p[pro].request[i];
p[pro].need[i]-=p[pro].request[i];
}
}
/*********************安全性算法*****************/
void safe(){
int k=0;
int safe[5]={-1,-1,-1,-1,-1}; //用于存放安全序列
for (int i=0;i<3;i++)
{
work[i]=available[i];
}
for (i=0;i<5;i++)
{
//cout<<"i的值"<<i<<endl;
if (finish[i]==false)
{
//cout<<"check "<<i<<endl;
for(int j=0;j<3;j++)
{
if (p[i].need[j]>work[j])
{
//cout<<i<<"不安全"<<endl;
break;
}
}
/* if (finish[i]==true)
{
cout<<i<<"为真,输出"<<endl;
}*/
if (j==3)
{
//cout<<"find "<<i<<endl;
for (j=0;j<3;j++)
{
work[j]+=p[i].allocation[j];
// cout<<" "<<work[j];
}
//cout<<endl;
finish[i]=true;
//cout<<i<<"值为真"<<endl;
// print();
safe[k]=i;
i=-1;
k++;
}
}
}
for (i=0;i<5;i++)
{
if (finish[i]==false)
{
cout<<"系统处于不安全状态不能分配"<<endl;
for (int j=0;j<3;j++)
{
available[j]+=p[pro].request[j];
p[pro].allocation[j]-=p[pro].request[j];
p[pro].need[j]+=p[pro].request[j];
}
break;
}
}
if (i==5)
{
cout<<"系统处于安全状态,一个安全序列是"<<endl;
for (i=0;i<5;i++)
{
cout<<"p["<<safe[i]<<"]"<<" ";
finish[i]=false;
}
cout<<endl;
}
}
/*********************主函数*****************/
int main(int argc, char* argv[])
{
char b;
input();
print();
safe();
cout<<"/n要继续申请资源,请按'y'或'Y',否则按'n'或'N'"<<endl;
cin>>b;
if (b=='y'||b=='Y')
{
banker();
safe();
}
else{
return 0;
}
return 1;
}