操作系统 银行家算法
#include<iostream>
using namespace std;
#include<vector>
#include<windows.h>
vector<vector<int> > mycin()
{
int x,y;
vector<vector<int> > v;
cout<<"请输入进程的个数"<<endl;
cin>>x;
cout<<"请输入资源的个数"<<endl;
cin>>y;
cout<<"请输入T时刻的资源分配情况"<<endl;
for(int i=0;i<x;i++){
vector<int> vv;
for(int j=0;j<3*y;j++){
int o;cin>>o;
vv.push_back(o);
}
v.push_back(vv);
}
cout<<"请输入系统可用资源:"<<endl;
for(int i=0;i<y;i++){
int o;cin>>o;
v[0].push_back(o);
}
return v;
}
void mycout(vector<vector<int> > v)
{
cout<<endl<<"资源分配情况如下:"<<endl;
cout<<" Max Allocation Need Available"<<endl<<" ";
for(int i=0;i<4;i++){
for(int j=0;j<v[0].size()/4;j++){
char a='A';
cout<<(char)(a+j)<<" ";
}
cout<<" ";
}
cout<<endl;
for(int i=0;i<v.size();i++){
cout<<"P"<<i<<" ";
for(int j=0;j<v[i].size();j++){
if(j%(v[0].size()/4)==0&&j!=0)
cout<<" ";
cout<<v[i][j]<<" ";
}
cout<<endl;
}
}
void compute(vector<vector<int> > v)
{
int x=v.size();
int y=v[0].size()/4;
vector<int> p;
int m=1; //是否满足
int d=1;//是否安全
for(int k=0;k<x;k++){//找x次,每次找一个,找不到就不安全
for(int i=0;i<x;i++){
m=1;
for(int j=2*y;j<3*y;j++){//need数只要有一个大于可用的,就不满足
if(v[i][j]>v[0][j+y])
m=0;
}
if(m==1){//上一个循环满足
m=0;
for(int j=2*y;j<3*y;j++){//need数只要有一个不等于0,就满足
if(v[i][j]!=0)
m=1;
}
}
if(m==1){//满足分配
for(int j=0;j<y;j++){
v[0][j+3*y]+=v[i][j+y];//完成分配,可用资源增加,need数置为0
v[i][j+2*y]=0;
}
p.push_back(i);
break;
}
}
if(m==0){
cout<<"此状态时,系统不安全"<<endl<<endl;
d=0;
break;
}
}
if(d==1){
cout<<endl<<"此状态时,系统安全"<<endl;
cout<<"存在一个安全序列如下:"<<endl;
for(int i=0;i<p.size();i++){
cout<<"p"<<p[i]<<" ";
}
cout<<endl;
}
}
void test(vector<vector<int> >& v)
{
int y=v[0].size()/4;
while(1){
int x;
vector<int> vv;
cout<<endl<<"请输入要申请资源的资源名:"<<endl;
for(int i=0;i<v.size();i++){
cout<<"P"<<i<<" ";
}
cout<<endl;
cin>>x;
cout<<"请输入P"<<x<<"发出的请求向量,如:1 0 2"<<endl;
for(int i=0;i<y;i++){
int o;cin>>o;
vv.push_back(o);
}
for(int i=0;i<y;i++){
v[x][y+i]+=vv[i];
v[x][2*y+i]-=vv[i];
v[0][3*y+i]-=vv[i];
}
int k=0;//Need数是否都为零
for(int i=0;i<y;i++){
if(v[x][2*y+i]!=0)
k=1;
}
if(k==0){
cout<<"P"<<x<<"进程已结束"<<endl;
for(int i=0;i<y;i++){
v[0][3*y+i]+=v[x][y+i];
if(x==0){
v[1].push_back(v[0][3*y+i]);
}
}
v.erase(v.begin()+x);
}
compute(v);
mycout(v);
cout<<endl<<"是否继续申请资源:"<<endl;
cout<<"1---继续 2----退出"<<endl;
int m;cin>>m;
if(m==2){
break;
}
system("cls");
mycout(v);
}
}
int main()
{
vector<vector<int> > v=mycin();
mycout(v);
compute(v);
test(v);
}
/*
资源分配表1
进程数 5
资源数 3
5
3
7 5 3 0 1 0 7 4 3
3 2 2 2 0 0 1 2 2
9 0 2 3 0 2 6 0 0
2 2 2 2 1 1 0 1 1
4 3 3 0 0 2 4 3 1
3 3 2
5
3
7 5 3 0 1 0 7 4 3
3 2 2 3 0 2 0 2 0
9 0 2 3 0 2 6 0 0
2 2 2 2 1 1 0 1 1
4 3 3 0 0 2 4 3 1
2 3 0
*/