有那位仁兄会写银行家算法吗!!重聘!!

zhangwujiang 2004-11-10 12:41:44
我曾写过一个银行家算法
不太对
有那位仁兄能写出正确的银行家算法吗?
...全文
106 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
tianye3316190 2005-05-21
  • 打赏
  • 举报
回复
最大需求量 已分配资源量 剩余资源量
A B C A B C A B C
P1 8 6 4 1 2 1 2 1 1
P2 4 3 3 3 1 1
P3 10 1 3 4 1 3
P4 3 3 3 3 2 2
P5 5 4 6 1 1 3
源代码如下:
#include<iostream.h>
#include<fstream.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()
{
ifstream fin;
fin.open("tianye.txt",ios::in|ios::nocreate);
if(!fin)
{
cerr<<"Can't open!"<<endl;
}
for(int i=0;i<5;i++)
{
fin>>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;

cout<<p[i].name<<" "<<p[i].need.n_a<<" "<<p[i].need.n_b<<" "<<p[i].need.n_c<<endl;
}
fin.close();
}

int divide()
{
cout<<"Available:\n";
cout<<q.av_a<<" "<<q.av_b<<" "<<q.av_c<<endl;
int finishcnt=0,k=0,count=0;
for(int j=0;j<5;j++)
p[j].finishflag=0;

while(finishcnt<5)
{
for(int 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;
}

}
count++;
if(count>5)return 0;
}
return 1;

}


int requrest()
{
int m,i,j,k;
cout<<"请输入进程号和请求资源!如:0 2 0 2\n";
cin>>m>>i>>j>>k;
if(i<=p[m].need.n_a&&j<=p[m].need.n_b &&k<=p[m].need.n_c)
{
if(i<=q.av_a&&j<=q.av_b&&k<=q.av_c)
{
p[m].allocation.a_a+=i;
p[m].allocation.a_b+=j;
p[m].allocation.a_c+=k;

p[m].need.n_a=p[m].max.m_a-p[m].allocation.a_a;
p[m].need.n_b=p[m].max.m_b-p[m].allocation.a_b;
p[m].need.n_c=p[m].max.m_c-p[m].allocation.a_c;

cout<<"各进程的NEED:\n";
for(int w=0;w<5;w++)
cout<<" "<<p[w].name<<" "<<p[w].need.n_a<<" "<<p[w].need.n_b<<" "<<p[w].need.n_c<<endl;
return 1;
}
else
cout<<"Request>Available\n让%c等待......\n"<<p[m].name;
}
else cout<<"Request>Need\n让%c等待......\n"<<p[m].name;
return 0;

}

void main()
{
int flag;
char c;
init();
q.av_a=14;//总资源数
q.av_b=8;
q.av_c=11;

while(flag)
{
for(int 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;
}
if(divide())
{
cout<<"这样配置资源是安全的!n";
cout<<"其安全序列是:";
for(int k=0;k<5;k++)
cout<<"-->"<<na[k];
cout<<endl;
cout<<"有进程发出Request请求向量吗?(Enter y or n)\n";
cin>>c;
if(c=='y')
{
if(requrest())continue;
else break;
}else flag=0;

}
else {flag=0;cout<<"不安全\n";}


}
}


tianye3316190 2005-05-21
  • 打赏
  • 举报
回复
最大需求量 已分配资源量 剩余资源量
A B C A B C A B C
P1 8 6 4 1 2 1 2 1 1
P2 4 3 3 3 1 1
P3 10 1 3 4 1 3
P4 3 3 3 3 2 2
P5 5 4 6 1 1 3
源代码如下:
#include<iostream.h>
#include<fstream.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()
{
ifstream fin;
fin.open("tianye.txt",ios::in|ios::nocreate);
if(!fin)
{
cerr<<"Can't open!"<<endl;
}
for(int i=0;i<5;i++)
{
fin>>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;

cout<<p[i].name<<" "<<p[i].need.n_a<<" "<<p[i].need.n_b<<" "<<p[i].need.n_c<<endl;
}
fin.close();
}

int divide()
{
cout<<"Available:\n";
cout<<q.av_a<<" "<<q.av_b<<" "<<q.av_c<<endl;
int finishcnt=0,k=0,count=0;
for(int j=0;j<5;j++)
p[j].finishflag=0;

while(finishcnt<5)
{
for(int 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;
}

}
count++;
if(count>5)return 0;
}
return 1;

}


int requrest()
{
int m,i,j,k;
cout<<"请输入进程号和请求资源!如:0 2 0 2\n";
cin>>m>>i>>j>>k;
if(i<=p[m].need.n_a&&j<=p[m].need.n_b &&k<=p[m].need.n_c)
{
if(i<=q.av_a&&j<=q.av_b&&k<=q.av_c)
{
p[m].allocation.a_a+=i;
p[m].allocation.a_b+=j;
p[m].allocation.a_c+=k;

p[m].need.n_a=p[m].max.m_a-p[m].allocation.a_a;
p[m].need.n_b=p[m].max.m_b-p[m].allocation.a_b;
p[m].need.n_c=p[m].max.m_c-p[m].allocation.a_c;

cout<<"各进程的NEED:\n";
for(int w=0;w<5;w++)
cout<<" "<<p[w].name<<" "<<p[w].need.n_a<<" "<<p[w].need.n_b<<" "<<p[w].need.n_c<<endl;
return 1;
}
else
cout<<"Request>Available\n让%c等待......\n"<<p[m].name;
}
else cout<<"Request>Need\n让%c等待......\n"<<p[m].name;
return 0;

}

void main()
{
int flag;
char c;
init();
q.av_a=14;//总资源数
q.av_b=8;
q.av_c=11;

while(flag)
{
for(int 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;
}
if(divide())
{
cout<<"这样配置资源是安全的!n";
cout<<"其安全序列是:";
for(int k=0;k<5;k++)
cout<<"-->"<<na[k];
cout<<endl;
cout<<"有进程发出Request请求向量吗?(Enter y or n)\n";
cin>>c;
if(c=='y')
{
if(requrest())continue;
else break;
}else flag=0;

}
else {flag=0;cout<<"不安全\n";}


}
}

fallhunter 2004-11-10
  • 打赏
  • 举报
回复
// A test of Bank's Algorithm
// Computer Dep.0003 fallhunter 2002.11.27
// All rights reserved

#include <iostream.h>
#define MAX_RESOURCE 5
#define MAX_PROCESS 5

//// globle variables
struct Process{
bool exist; // the flag the process exsitence
int possess[MAX_RESOURCE]; //resources possessed
int require[MAX_RESOURCE]; // the requried resources
}Pro[MAX_PROCESS];

int nr; // number of resources
int np; // number of process
int total[MAX_RESOURCE]; // total resources vertex
int free[MAX_RESOURCE]; // free resources vertex

// test whether the process could be finished
bool CouldFinish ( struct Process * p ) {
int i;

for ( i=0; i<nr; i++ )
if ( p->require[i] > free[i] ) // require more than possible return false;
return true;
}

// finish the process
void Finish ( struct Process * p ) {
int i;

for ( i=0; i<nr; i++ )
free[i]+=p->possess[i]; // release the resources
p->exist = false; // delect the process
}

//////////// function ShowState current state
void ShowState( void ) {
int p,i;

cout<<"----------------------------------\n";
for ( i=0; i<nr; i++ ){
cout<<" "<<free[i]<<"\t";
for ( p=0; p<np; p++ )
if ( Pro[p].exist )
cout<<Pro[p].possess[i]<<"("<<Pro[p].require[i]<<")\t";
else cout <<"\t";
cout<<"\n";
}
}
//////////////////////////////////////
// function Init: user input and Initialize the globe variables
void Init( void ) {
int p,i;

cout<<"Input kind of resources: ";
cin>>nr;
cout<<"Input the total resources:\n";
for ( i=0; i<nr; i++ ) {
cout<<"Resource "<<i+1<<":";
cin>>total[i];
}

cout<<"Input number of process: ";
cin>>np;
cout<<"Input the allocated resources:\n";
for ( p=0; p<np; p++ ) {
cout<<"Process"<<p+1<<" ";
for ( i=0; i<nr; i++ ) {
cout<<"Resource"<<i+1<<":";
cin>>Pro[p].possess[i];
}
}
cout<<"Input the require resources:\n";
for ( p=0; p<np; p++ ) {
cout <<"Process"<<p+1<<" ";
for ( i=0; i<nr; i++ ) {
cout<<"Resource"<<i+1<<":";
cin>>Pro[p].require[i];
}
}

// caculate the free resources
for ( i=0; i<nr; i++ ){
free[i]=total[i];
for ( p=0; p<np; p++ )
free[i]-=Pro[p].possess[i];
}

// initialize the flag
for ( p=0; p<np; p++ )
Pro[p].exist=true;

// initialize the screen
cout << "\nFree \t" <<"\t Resources\n\t";
for ( i=1; i<=np; i++ )
cout <<"P"<< i << "\t";
cout << "\n";
ShowState();
}
///////////////////////////////////////////////////////
///////// function main
void main ( void ) {
bool c; // flag of that at least one process could be finish
int i,tnp;

Init(); // user input
tnp=np; // a temporary variable for number of active process

while ( tnp > 0 ) {
c=false;
for ( i=0; i<np; i++ )
if ( Pro[i].exist )
{
if ( CouldFinish( &Pro[i] ) )
{
Finish ( &Pro[i] );
ShowState();
tnp--;
c=true;
}
}
if ( !c )
{ // no process could be finished. -- deadlock
cout<<"DeadLock!\n";
break;
}
}
}

xuzheng318 2004-11-10
  • 打赏
  • 举报
回复
#include<iostream.h>
#include<stdlib.h>
const int m=3;
const int n=5;
int MaxAvailable[m]={10,5,7};
int Max[n][m]={7,5,3,3,2,2,9,0,2,2,2,2,4,3,3};
int Allocation[n][m]={0,1,0,2,0,0,3,0,2,2,1,1,0,0,2};
int Available[m];
int Need[n][m];
struct Request
{
int p;
int k[m];
};
Request r;
//int Need[n][m]={7,4,3,1,2,2,6,0,0,0,1,1,4,3,1};
bool safe()
{
int Work[m];
for(int i=0;i<m;i++)
{Work[i]=Available[i];}
bool Finish[n];
for(i=0;i<n;i++)
Finish[i]=false;
for(int iy=0;iy<n;iy++)
{
for(i=0;i<n;i++)
{
if(!Finish[i])
{
for(int j=0;j<m;j++)
{
if(Need[i][j]>Work[j])
{break;}
}
if(j==m)
{
for(int ix=0;ix<m;ix++)
{Work[ix]+=Allocation[i][ix];}
Finish[i]=true;
cout<<"["<<i<<"]"<<" ";
break;
}
}
}

}
for(i=0;i<n;i++)
{
if(!Finish[i])
break;
}
if(i<n)
{cout<<"Dengerous!"<<endl;
return false;
}
else
return true;
}
void bank(Request r)
{
int i;
int j;
for(i=0;i<n;i++)
for(j=0;j<m;j++)
{Need[i][j]=Max[i][j]-Allocation[i][j];}
for(i=0;i<m;i++)
{Available[i]=MaxAvailable[i];}
for(i=0;i<n;i++)
for(j=0;j<m;j++)
{Available[j]-=Allocation[i][j];}
for(i=0;i<m;i++)
{
if(r.k[i]>Need[r.p][i])
{break;}
}
if(i<m)
{cout<<"Your request over need!"<<endl;
exit(1);}
else
{
for(i=0;i<m;i++)
{
if(r.k[i]>Available[i])
break;
}
if(i<m)
{cout<<"Process["<<r.p<<"] Wait!"<<endl;}
else
{
for(i=0;i<m;i++)
{
Available[i]-=r.k[i];
Allocation[r.p][i]+=r.k[i];
Need[r.p][i]-=r.k[i];
//cout<<"["<<Available[i]<<"]";
//cout<<"{"<<Allocation[r.p][i]<<"}";
//cout<<Need[r.p][i]<<":::";
}
if(!safe())
{
for(i=0;i<m;i++)
{
Available[i]+=r.k[i];
Allocation[r.p][i]-=r.k[i];
Need[r.p][i]+=r.k[i];
}
cout<<"It is not safe!"<<endl;
}
else
{cout<<"Safe!"<<endl;}
}
}
}

void main()
{
Request r;
r.p=1;
int request[m]={1,0,2};
for(int i=0;i<m;i++)
{r.k[i]=request[i];}
bank(r);
}
fallhunter 2004-11-10
  • 打赏
  • 举报
回复

多资源的银行家算法

上课时的作业,应该没问题的,呵呵

64,636

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧