操作系统作业三
编程实现银⾏家算法进⾏资源分配以避免死锁的发⽣。
#include<bits/stdc++.h>
#include <fstream>
#include<bits/stdc++.h>
using namespace std;
const int maxx=105;
struct Processinf
{
string name;
int max[3];
int allocation[3];
int need[3];
bool finish=0;
};
struct Requestinf
{
string name;
int re[3];
};
string safe[maxx];
int temp=0;
Processinf process[maxx];
Requestinf request[maxx];
int total[3];
int available[3];
int work[3];
int rework[3];
int trans=0;
int maxs=0;
void init(char *file)
{
int cnt=0;
ifstream inFile;
inFile.open(file);
while(inFile)
{
if(cnt==0)//读取资源的总数量
{
inFile >> total[0];
inFile >> total[1];
inFile >> total[2];
cnt++;
inFile.get();
}
else if(cnt==1)//读取当前可用资源数量
{
inFile >> available[0];
inFile >> available[1];
inFile >> available[2];
cnt++;
inFile.get();
}
else //读取个进程的资源需求
{
inFile >> process[temp].name;
inFile >> process[temp].max[0];
inFile >> process[temp].max[1];
inFile >> process[temp].max[2];
inFile >> process[temp].allocation[0];
inFile >> process[temp].allocation[1];
inFile >> process[temp].allocation[2];
temp++;
inFile.get();
}
}
temp--;
}
void show()
{
cout<<"资源总数量: "<<total[0]<<" "<<total[1]<<" "<<total[2]<<endl;
cout<<"当前可用资源数量: "<<available[0]<<" "<<available[1]<<" "<<available[2]<<endl;
cout<<"Process Max Allocation Need "<<endl;
for(int i=0;i<temp;i++)
{
for(int j=0;j<3;j++)process[i].need[j]=process[i].max[j]- process[i].allocation[j];
cout<<" "<<process[i].name<<" "<<process[i].max[0]<<" "<<process[i].max[1]<<" "<<process[i].max[2]<<" "<< process[i].allocation[0]<<" "<<process[i].allocation[1]<<" "<<process[i].allocation[2]<<" "<<process[i].need[0]<<" "<<process[i].need[1]<<" "<<process[i].need[2]<<endl;
}
}
bool enable(int x,Processinf pre[maxx])
{
for(int i=0;i<3;i++)if(pre[x].need[i]>work[i])return false;
return true;
}
bool enablex(int x,Processinf pre[maxx])
{
for(int i=0;i<3;i++)if(pre[x].need[i]>rework[i])return false;
return true;
}
void bank()
{
for(int i=0;i<3;i++)work[i]=available[i];
int ans=temp;
while(ans--)
{
for(int i=0;i<temp;i++)
{
if(process[i].finish==0&&enable(i,process)==true)
{
process[i].finish=true;
safe[trans++]=process[i].name;
for(int j=0;j<3;j++)work[j]+=process[i].allocation[j];
break;
}
}
}
if(trans!=temp)cout<<"该系统处于不安全状态"<<endl;
else
{
cout<<"该系统处于安全状态"<<endl;
cout<<"该系统的一个安全序列为:";
for(int i=0;i<temp-1;i++)cout<<safe[i]<<"-->";
cout<<safe[temp-1]<<endl;
}
}
void accept(char *file)
{
ifstream inFile;
inFile.open(file);
while(inFile)
{
inFile >> request[maxs].name;
inFile >> request[maxs].re[0];
inFile >> request[maxs].re[1];
inFile >> request[maxs].re[2];
maxs++;
inFile.get();
}
maxs--;
}
void ask_if(Processinf pre[maxx],int x)
{
cout<<"对于request"<<" "<<request[x].name<<" ("<<request[x].re[0]<<" "<<request[x].re[1]<<" "<<request[x].re[2]<<")"<<endl;
for(int i=0;i<temp;i++)
{
pre[i].finish=0;
if(request[x].name==pre[i].name)
{
for(int j=0;j<3;j++)
{
pre[i].allocation[j]+=request[x].re[j];
pre[i].need[j]-=request[x].re[j];
}
}
}
rework[0]=available[0]-request[x].re[0];
rework[1]=available[1]-request[x].re[1];
rework[2]=available[2]-request[x].re[2];
if(rework[0]<0||rework[1]<0||rework[2]<0)
{
cout<<"当前资源:"<<available[0]<<" "<<available[1]<<" "<<available[2]<<endl;
cout<<"尚无充足资源,不能进行分配!"<<endl;
}
/
else
{
cout<<"资源总数量: "<<total[0]<<" "<<total[1]<<" "<<total[2]<<endl;
cout<<"当前可用资源数量: "<<available[0]<<" "<<available[1]<<" "<<available[2]<<endl;
cout<<"process Max Allocation Need "<<endl;
for(int i=0;i<temp;i++)
{
for(int j=0;j<3;j++)pre[i].need[j]=pre[i].max[j]- pre[i].allocation[j];
cout<<" "<<pre[i].name<<" "<<pre[i].max[0]<<" "<<pre[i].max[1]<<" "<<pre[i].max[2]<<" "<< pre[i].allocation[0]<<" "<<pre[i].allocation[1]<<" "<<pre[i].allocation[2]<<" "<<pre[i].need[0]<<" "<<pre[i].need[1]<<" "<<pre[i].need[2]<<endl;
}
///
int ans=temp;
trans=0;
while(ans--)
{
for(int i=0;i<temp;i++)
{
if(pre[i].finish==0&&enablex(i,pre)==true)
{
pre[i].finish=true;
safe[trans++]=pre[i].name;
for(int j=0;j<3;j++)rework[j]+=pre[i].allocation[j];
break;
}
}
}
if(trans!=temp)
{
cout<<"存在进程没有得到分配:";
for(int i=0;i<temp;i++)
{
if(pre[i].finish==0)
{
cout<<pre[i].name<<" ";
}
}
}
else
{
cout<<"该系统处于安全状态"<<endl;
cout<<"该系统的一个安全序列为:";
for(int i=0;i<temp-1;i++)cout<<safe[i]<<"-->";
cout<<safe[temp-1]<<endl;
available[0]-=request[x].re[0];
available[1]-=request[x].re[1];
available[2]-=request[x].re[2];
}
}
}
int main()
{
init("data.txt");
show();
bank();
accept("request.txt");
for(int i=0;i<maxs;i++)
{
cout<<endl;
ask_if(process,i);
}
}