操作系统中怎样编程实现银行家算法
展开全部
#include<iostream.h>
#include<string.h>
#include<stdio.h>
#define False 0
#define True 1
int Max[100][100]={0};//各进程所需各类资源的最大需求
int Avaliable[100]={0};//系统可用资源
char name[100]={0};//资源的名称
int Allocation[100][100]={0};//系统已分配资源
int Need[100][100]={0};//还需要资源
int Request[100]={0};//请求资源向量
int temp[100]={0};//存放安全序列
int Work[100]={0};//存放系统可提供资源
int M=100;//作业的最大数为100
int N=100;//资源的最大数为100
void showdata()//显示资源矩阵
{
int i,j;
cout<<"系统目前可用的资源[Avaliable]:"<<endl;
for(i=0;i<N;i++)
cout<<name[i]<<" ";
cout<<endl;
for (j=0;j<N;j++)
cout<<Avaliable[j]<<" ";//输出分配资源
cout<<endl;
cout<<" Max Allocation Need"<<endl;
cout<<"进程名 ";
for(j=0;j<3;j++){
for(i=0;i<N;i++)
cout<<name[i]<<" ";
cout<<" ";
}
cout<<endl;
for(i=0;i<M;i++){
cout<<" "<<i<<" ";
for(j=0;j<N;j++)
cout<<Max[i][j]<<" ";
cout<<" ";
for(j=0;j<N;j++)
cout<<Allocation[i][j]<<" ";
cout<<" ";
for(j=0;j<N;j++)
cout<<Need[i][j]<<" ";
cout<<endl;
}
}
int changdata(int i)//进行资源分配
{
int j;
for (j=0;j<M;j++) {
Avaliable[j]=Avaliable[j]-Request[j];
Allocation[i][j]=Allocation[i][j]+Request[j];
Need[i][j]=Need[i][j]-Request[j];
}
return 1;
}
int safe()//安全性算法
{
int i,k=0,m,apply,Finish[100]={0};
int j;
int flag=0;
Work[0]=Avaliable[0];
Work[1]=Avaliable[1];
Work[2]=Avaliable[2];
for(i=0;i<M;i++){
apply=0;
for(j=0;j<N;j++){
if (Finish[i]==False&&Need[i][j]<=Work[j]){
apply++;
if(apply==N){
for(m=0;m<N;m++)
Work[m]=Work[m]+Allocation[i][m];//变分配数
Finish[i]=True;
temp[k]=i;
i=-1;
k++;
flag++;
}
}
}
}
for(i=0;i<M;i++){
if(Finish[i]==False){
cout<<"系统不安全"<<endl;//不成功系统不安全
return -1;
}
}
cout<<"系统是安全的!"<<endl;//如果安全,输出成功
cout<<"分配的序列:";
for(i=0;i<M;i++){//输出运行进程数组
cout<<temp[i];
if(i<M-1) cout<<"->";
}
cout<<endl;
return 0;
}
void share()//利用银行家算法对申请资源对进行判定
{
char ch;
int i=0,j=0;
ch='y';
cout<<"请输入要求分配的资源进程号(0-"<<M-1<<"):";
cin>>i;//输入须申请的资源号
cout<<"请输入进程 "<<i<<" 申请的资源:"<<endl;
for(j=0;j<N;j++)
{
cout<<name[j]<<":";
cin>>Request[j];//输入需要申请的资源
}
for (j=0;j<N;j++){
if(Request[j]>Need[i][j])//判断申请是否大于需求,若大于则出错
{
cout<<"进程 "<<i<<"申请的资源大于它需要的资源";
cout<<" 分配不合理,不予分配!"<<endl;
ch='n';
break;
}
else {
if(Request[j]>Avaliable[j])//判断申请是否大于当前资源,若大于则
{ //出错
cout<<"进程"<<i<<"申请的资源大于系统现在可利用的资源";
cout<<" 分配出错,不予分配!"<<endl;
ch='n';
break;
}
}
}
if(ch=='y') {
changdata(i);//根据进程需求量变换资源
showdata();//根据进程需求量显示变换后的资源
safe();//根据进程需求量进行银行家算法判断
}
}
void addresources(){//添加资源
int n,flag;
cout<<"请输入需要添加资源种类的数量:";
cin>>n;
flag=N;
N=N+n;
for(int i=0;i<n;i++){
cout<<"名称:";
cin>>name[flag];
cout<<"数量:";
cin>>Avaliable[flag++];
}
showdata();
safe();
}
void delresources(){//删除资源
char ming;
int i,flag=1;
cout<<"请输入需要删除的资源名称:";
do{
cin>>ming;
for(i=0;i<N;i++)
if(ming==name[i]){
flag=0;
break;
}
if(i==N)
cout<<"该资源名称不存在,请重新输入:";
}
while(flag);
for(int j=i;j<N-1;j++)
{
name[j]=name[j+1];
Avaliable[j]=Avaliable[j+1];
}
N=N-1;
showdata();
safe();
}
void changeresources(){//修改资源函数
cout<<"系统目前可用的资源[Avaliable]:"<<endl;
for(int i=0;i<N;i++)
cout<<name[i]<<":"<<Avaliable[i]<<endl;
cout<<"输入系统可用资源[Avaliable]:"<<endl;
cin>>Avaliable[0]>>Avaliable[1]>>Avaliable[2];
cout<<"经修改后的系统可用资源为"<<endl;
for (int k=0;k<N;k++)
cout<<name[k]<<":"<<Avaliable[k]<<endl;
showdata();
safe();
}
void addprocess(){//添加作业
int flag=M;
M=M+1;
cout<<"请输入该作业的最打需求量[Max]"<<endl;
for(int i=0;i<N;i++){
cout<<name[i]<<":";
cin>>Max[flag][i];
Need[flag][i]=Max[flag][i]-Allocation[flag][i];
}
showdata();
safe();
}
int main()//主函数
{
int i,j,number,choice,m,n,flag;
char ming;
cout<<"*****************资源管理系统的设计与实现*****************"<<endl;
cout<<"请首先输入系统可供资源种类的数量:";
cin>>n;
N=n;
for(i=0;i<n;i++)
{
cout<<"资源"<<i+1<<"的名称:";
cin>>ming;
name[i]=ming;
cout<<"资源的数量:";
cin>>number;
Avaliable[i]=number;
}
cout<<endl;
cout<<"请输入作业的数量:";
cin>>m;
M=m;
cout<<"请输入各进程的最大需求量("<<m<<"*"<<n<<"矩阵)[Max]:"<<endl;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
cin>>Max[i][j];
do{
flag=0;
cout<<"请输入各进程已经申请的资源量("<<m<<"*"<<n<<"矩阵)[Allocation]:"<<endl;
for(i=0;i<m;i++)
for(j=0;j<n;j++){
cin>>Allocation[i][j];
if(Allocation[i][j]>Max[i][j])
flag=1;
Need[i][j]=Max[i][j]-Allocation[i][j];
}
if(flag)
cout<<"申请的资源大于最大需求量,请重新输入!\n";
}
while(flag);
showdata();//显示各种资源
safe();//用银行家算法判定系统是否安全
while(choice)
{
cout<<"**************银行家算法演示***************"<<endl;
cout<<" 1:增加资源 "<<endl;
cout<<" 2:删除资源 "<<endl;
cout<<" 3:修改资源 "<<endl;
cout<<" 4:分配资源 "<<endl;
cout<<" 5:增加作业 "<<endl;
cout<<" 0:离开 "<<endl;
cout<<"*******************************************"<<endl;
cout<<"请选择功能号:";
cin>>choice;
switch(choice)
{
case 1: addresources();break;
case 2: delresources();break;
case 3: changeresources();break;
case 4: share();break;
case 5: addprocess();break;
case 0: choice=0;break;
default: cout<<"请正确选择功能号(0-5)!"<<endl;break;
}
}
return 1;
}
#include<string.h>
#include<stdio.h>
#define False 0
#define True 1
int Max[100][100]={0};//各进程所需各类资源的最大需求
int Avaliable[100]={0};//系统可用资源
char name[100]={0};//资源的名称
int Allocation[100][100]={0};//系统已分配资源
int Need[100][100]={0};//还需要资源
int Request[100]={0};//请求资源向量
int temp[100]={0};//存放安全序列
int Work[100]={0};//存放系统可提供资源
int M=100;//作业的最大数为100
int N=100;//资源的最大数为100
void showdata()//显示资源矩阵
{
int i,j;
cout<<"系统目前可用的资源[Avaliable]:"<<endl;
for(i=0;i<N;i++)
cout<<name[i]<<" ";
cout<<endl;
for (j=0;j<N;j++)
cout<<Avaliable[j]<<" ";//输出分配资源
cout<<endl;
cout<<" Max Allocation Need"<<endl;
cout<<"进程名 ";
for(j=0;j<3;j++){
for(i=0;i<N;i++)
cout<<name[i]<<" ";
cout<<" ";
}
cout<<endl;
for(i=0;i<M;i++){
cout<<" "<<i<<" ";
for(j=0;j<N;j++)
cout<<Max[i][j]<<" ";
cout<<" ";
for(j=0;j<N;j++)
cout<<Allocation[i][j]<<" ";
cout<<" ";
for(j=0;j<N;j++)
cout<<Need[i][j]<<" ";
cout<<endl;
}
}
int changdata(int i)//进行资源分配
{
int j;
for (j=0;j<M;j++) {
Avaliable[j]=Avaliable[j]-Request[j];
Allocation[i][j]=Allocation[i][j]+Request[j];
Need[i][j]=Need[i][j]-Request[j];
}
return 1;
}
int safe()//安全性算法
{
int i,k=0,m,apply,Finish[100]={0};
int j;
int flag=0;
Work[0]=Avaliable[0];
Work[1]=Avaliable[1];
Work[2]=Avaliable[2];
for(i=0;i<M;i++){
apply=0;
for(j=0;j<N;j++){
if (Finish[i]==False&&Need[i][j]<=Work[j]){
apply++;
if(apply==N){
for(m=0;m<N;m++)
Work[m]=Work[m]+Allocation[i][m];//变分配数
Finish[i]=True;
temp[k]=i;
i=-1;
k++;
flag++;
}
}
}
}
for(i=0;i<M;i++){
if(Finish[i]==False){
cout<<"系统不安全"<<endl;//不成功系统不安全
return -1;
}
}
cout<<"系统是安全的!"<<endl;//如果安全,输出成功
cout<<"分配的序列:";
for(i=0;i<M;i++){//输出运行进程数组
cout<<temp[i];
if(i<M-1) cout<<"->";
}
cout<<endl;
return 0;
}
void share()//利用银行家算法对申请资源对进行判定
{
char ch;
int i=0,j=0;
ch='y';
cout<<"请输入要求分配的资源进程号(0-"<<M-1<<"):";
cin>>i;//输入须申请的资源号
cout<<"请输入进程 "<<i<<" 申请的资源:"<<endl;
for(j=0;j<N;j++)
{
cout<<name[j]<<":";
cin>>Request[j];//输入需要申请的资源
}
for (j=0;j<N;j++){
if(Request[j]>Need[i][j])//判断申请是否大于需求,若大于则出错
{
cout<<"进程 "<<i<<"申请的资源大于它需要的资源";
cout<<" 分配不合理,不予分配!"<<endl;
ch='n';
break;
}
else {
if(Request[j]>Avaliable[j])//判断申请是否大于当前资源,若大于则
{ //出错
cout<<"进程"<<i<<"申请的资源大于系统现在可利用的资源";
cout<<" 分配出错,不予分配!"<<endl;
ch='n';
break;
}
}
}
if(ch=='y') {
changdata(i);//根据进程需求量变换资源
showdata();//根据进程需求量显示变换后的资源
safe();//根据进程需求量进行银行家算法判断
}
}
void addresources(){//添加资源
int n,flag;
cout<<"请输入需要添加资源种类的数量:";
cin>>n;
flag=N;
N=N+n;
for(int i=0;i<n;i++){
cout<<"名称:";
cin>>name[flag];
cout<<"数量:";
cin>>Avaliable[flag++];
}
showdata();
safe();
}
void delresources(){//删除资源
char ming;
int i,flag=1;
cout<<"请输入需要删除的资源名称:";
do{
cin>>ming;
for(i=0;i<N;i++)
if(ming==name[i]){
flag=0;
break;
}
if(i==N)
cout<<"该资源名称不存在,请重新输入:";
}
while(flag);
for(int j=i;j<N-1;j++)
{
name[j]=name[j+1];
Avaliable[j]=Avaliable[j+1];
}
N=N-1;
showdata();
safe();
}
void changeresources(){//修改资源函数
cout<<"系统目前可用的资源[Avaliable]:"<<endl;
for(int i=0;i<N;i++)
cout<<name[i]<<":"<<Avaliable[i]<<endl;
cout<<"输入系统可用资源[Avaliable]:"<<endl;
cin>>Avaliable[0]>>Avaliable[1]>>Avaliable[2];
cout<<"经修改后的系统可用资源为"<<endl;
for (int k=0;k<N;k++)
cout<<name[k]<<":"<<Avaliable[k]<<endl;
showdata();
safe();
}
void addprocess(){//添加作业
int flag=M;
M=M+1;
cout<<"请输入该作业的最打需求量[Max]"<<endl;
for(int i=0;i<N;i++){
cout<<name[i]<<":";
cin>>Max[flag][i];
Need[flag][i]=Max[flag][i]-Allocation[flag][i];
}
showdata();
safe();
}
int main()//主函数
{
int i,j,number,choice,m,n,flag;
char ming;
cout<<"*****************资源管理系统的设计与实现*****************"<<endl;
cout<<"请首先输入系统可供资源种类的数量:";
cin>>n;
N=n;
for(i=0;i<n;i++)
{
cout<<"资源"<<i+1<<"的名称:";
cin>>ming;
name[i]=ming;
cout<<"资源的数量:";
cin>>number;
Avaliable[i]=number;
}
cout<<endl;
cout<<"请输入作业的数量:";
cin>>m;
M=m;
cout<<"请输入各进程的最大需求量("<<m<<"*"<<n<<"矩阵)[Max]:"<<endl;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
cin>>Max[i][j];
do{
flag=0;
cout<<"请输入各进程已经申请的资源量("<<m<<"*"<<n<<"矩阵)[Allocation]:"<<endl;
for(i=0;i<m;i++)
for(j=0;j<n;j++){
cin>>Allocation[i][j];
if(Allocation[i][j]>Max[i][j])
flag=1;
Need[i][j]=Max[i][j]-Allocation[i][j];
}
if(flag)
cout<<"申请的资源大于最大需求量,请重新输入!\n";
}
while(flag);
showdata();//显示各种资源
safe();//用银行家算法判定系统是否安全
while(choice)
{
cout<<"**************银行家算法演示***************"<<endl;
cout<<" 1:增加资源 "<<endl;
cout<<" 2:删除资源 "<<endl;
cout<<" 3:修改资源 "<<endl;
cout<<" 4:分配资源 "<<endl;
cout<<" 5:增加作业 "<<endl;
cout<<" 0:离开 "<<endl;
cout<<"*******************************************"<<endl;
cout<<"请选择功能号:";
cin>>choice;
switch(choice)
{
case 1: addresources();break;
case 2: delresources();break;
case 3: changeresources();break;
case 4: share();break;
case 5: addprocess();break;
case 0: choice=0;break;
default: cout<<"请正确选择功能号(0-5)!"<<endl;break;
}
}
return 1;
}
追问
编译时没有错误,但是运行时找不到exe文件,请问怎么回事啊?
追答
return 0;
展开全部
#include "stdio.h"
//函数列表
#define false 0
#define true 1
void init();//初始化各量的值
void Bank();//银行家算法
int safe();//安全性的算法
//对一些全局变量的定义
int available[3];//可利用的资源数目及其种类
int jinc[5];//进程数组
int max[5][3];//最大需求的矩阵*/
int allocation[5][3];//每类资源已有的数目
int need[5][3];//需求矩阵
int request[1][3];//申请向量
int finish[5];//是否有足够的资源
static int m=3,b=5;//m--可利用资源的种类 b-进程数
//函数实现
void init(){
int n,a,i,j;
//可利用的资源数目及其种类初始化
printf("请你输入可利用资源的种类3:\n");
//available[3]={0};
printf("请分别输入从1-3类资源的可用数目:\n");
for ( i=1;i<=m;i++)
{
scanf("%d",&a);
available[i]=a;
}
//进程数的初始化
printf("有5个进程序号是0-4:\n");
//scanf("%d",&a);
//jinc[5]={0};
for (i=0;i<5;i++)
{
jinc[i]=i;
}
//初始化了资源数目及其种类和进程数目,则现在可以初始化最大需求的矩阵
printf("请输入最大需求的矩阵:\n");
for(i=0;i<b;i++)//进程数
for (j=0;j<m;j++)//资源的种类
{
scanf("%d",&n);
max[i][j]=n;
}
//初始化各进程的已有资源数目
printf("请你输入各进程的已占资源矩阵:\n");
for( i=0;i<b;i++)//进程数
for ( j=0;j<m;j++)//资源的种类
{scanf("%d",&n);
allocation[i][j]=n;
need[i][j]=max[i][j]- allocation[i][j];//初始化各进程还需要的资源数目
if(need[i][j]<0) {
printf("您输入的第%d个进程所拥有的第%d个资源数错误,请重新输入:\n",i+1,j+1);
j--;
continue;
}}
//初始化各进程对资源的申请
//printf("请你输入各进程的申请资源的矩阵:\n");
//for(i=0;i<b;i++)//进程数
//for ( j=0;j<m;j++)//资源的种类
//{
//scanf("%d",&n);
//request[i][j]=n;
// }
}//end init();
void Bank(){
int i,j,cusneed;char again;
while(1){//资源分配请求
printf("请输入要申请资源的进程号(注:第1个进程号为0,依次类推)\n");
scanf("%d",&cusneed);
printf("请输入进程所请求的各资源的数量\n");
for(i=0;i<3;i++)
{
scanf("%d",request[i]);}
for(i=0;i<m;i++)
{
if(request[cusneed][i]>need[cusneed][i])
{
printf("您输入的请求数超过进程的需求量!请重新输入!\n");
continue;}
if(request[cusneed][i]>available[i])
{printf("您输入的请求数超过系统有的资源数!请重新输入!\n");
continue;}}
for(i=0;i<m;i++)
{
available[i]-=request[cusneed][i];
allocation[cusneed][i]+=request[cusneed][i];
need[cusneed][i]-=request[cusneed][i]; }
if(safe()){//判是否分配成功
printf("同意分配请求!\n");}
else{printf("您的请求被拒绝!\n");
for(i=0;i<m;i++)
{available[i]+=request[cusneed][i];
allocation[cusneed][i]-=request[cusneed][i];
need[cusneed][i]+=request[cusneed][i];
}}
for(i=0;i<b;i++)
{
finish[i]=false;}
}
}
int safe(){ //判断安全性
int i,j,k,l=0;
int Work[100]={0};
//工作数组?
for(i=0;i<m;i++)
Work[i]=available[i];
for(i=0;i<b;i++)
{finish[i]=false;}
for(i=0;i<b;i++)
{ if(finish[i]==true)
{continue;}
else{
for(j=0;j<m;j++){
if(need[i][j]>Work[j])
{ break; }}
if(j==m){
finish[i]=true;
for(k=0;k<m;k++)
{ Work[k]+=allocation[i][k];}
jinc[l++]=i;i=-1;}
else{continue;}}
if(l==m){
printf("系统是安全的\n");
printf("安全序列:\n");
for(i=0;i<l;i++)
{printf("%d",jinc[i]);
if(i!=l-1)
{printf("-->\n");}
}
printf("\n");
return true;}}
printf("系统是不安全的\n");
return false;}
//}
#include "head.h"
int main(){
init();
Bank();
safe();
return 1;
}
//函数列表
#define false 0
#define true 1
void init();//初始化各量的值
void Bank();//银行家算法
int safe();//安全性的算法
//对一些全局变量的定义
int available[3];//可利用的资源数目及其种类
int jinc[5];//进程数组
int max[5][3];//最大需求的矩阵*/
int allocation[5][3];//每类资源已有的数目
int need[5][3];//需求矩阵
int request[1][3];//申请向量
int finish[5];//是否有足够的资源
static int m=3,b=5;//m--可利用资源的种类 b-进程数
//函数实现
void init(){
int n,a,i,j;
//可利用的资源数目及其种类初始化
printf("请你输入可利用资源的种类3:\n");
//available[3]={0};
printf("请分别输入从1-3类资源的可用数目:\n");
for ( i=1;i<=m;i++)
{
scanf("%d",&a);
available[i]=a;
}
//进程数的初始化
printf("有5个进程序号是0-4:\n");
//scanf("%d",&a);
//jinc[5]={0};
for (i=0;i<5;i++)
{
jinc[i]=i;
}
//初始化了资源数目及其种类和进程数目,则现在可以初始化最大需求的矩阵
printf("请输入最大需求的矩阵:\n");
for(i=0;i<b;i++)//进程数
for (j=0;j<m;j++)//资源的种类
{
scanf("%d",&n);
max[i][j]=n;
}
//初始化各进程的已有资源数目
printf("请你输入各进程的已占资源矩阵:\n");
for( i=0;i<b;i++)//进程数
for ( j=0;j<m;j++)//资源的种类
{scanf("%d",&n);
allocation[i][j]=n;
need[i][j]=max[i][j]- allocation[i][j];//初始化各进程还需要的资源数目
if(need[i][j]<0) {
printf("您输入的第%d个进程所拥有的第%d个资源数错误,请重新输入:\n",i+1,j+1);
j--;
continue;
}}
//初始化各进程对资源的申请
//printf("请你输入各进程的申请资源的矩阵:\n");
//for(i=0;i<b;i++)//进程数
//for ( j=0;j<m;j++)//资源的种类
//{
//scanf("%d",&n);
//request[i][j]=n;
// }
}//end init();
void Bank(){
int i,j,cusneed;char again;
while(1){//资源分配请求
printf("请输入要申请资源的进程号(注:第1个进程号为0,依次类推)\n");
scanf("%d",&cusneed);
printf("请输入进程所请求的各资源的数量\n");
for(i=0;i<3;i++)
{
scanf("%d",request[i]);}
for(i=0;i<m;i++)
{
if(request[cusneed][i]>need[cusneed][i])
{
printf("您输入的请求数超过进程的需求量!请重新输入!\n");
continue;}
if(request[cusneed][i]>available[i])
{printf("您输入的请求数超过系统有的资源数!请重新输入!\n");
continue;}}
for(i=0;i<m;i++)
{
available[i]-=request[cusneed][i];
allocation[cusneed][i]+=request[cusneed][i];
need[cusneed][i]-=request[cusneed][i]; }
if(safe()){//判是否分配成功
printf("同意分配请求!\n");}
else{printf("您的请求被拒绝!\n");
for(i=0;i<m;i++)
{available[i]+=request[cusneed][i];
allocation[cusneed][i]-=request[cusneed][i];
need[cusneed][i]+=request[cusneed][i];
}}
for(i=0;i<b;i++)
{
finish[i]=false;}
}
}
int safe(){ //判断安全性
int i,j,k,l=0;
int Work[100]={0};
//工作数组?
for(i=0;i<m;i++)
Work[i]=available[i];
for(i=0;i<b;i++)
{finish[i]=false;}
for(i=0;i<b;i++)
{ if(finish[i]==true)
{continue;}
else{
for(j=0;j<m;j++){
if(need[i][j]>Work[j])
{ break; }}
if(j==m){
finish[i]=true;
for(k=0;k<m;k++)
{ Work[k]+=allocation[i][k];}
jinc[l++]=i;i=-1;}
else{continue;}}
if(l==m){
printf("系统是安全的\n");
printf("安全序列:\n");
for(i=0;i<l;i++)
{printf("%d",jinc[i]);
if(i!=l-1)
{printf("-->\n");}
}
printf("\n");
return true;}}
printf("系统是不安全的\n");
return false;}
//}
#include "head.h"
int main(){
init();
Bank();
safe();
return 1;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询