| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 812 人关注过本帖
标题:关于银行家算法的一个问题
只看楼主 加入收藏
小鸟向前飞
Rank: 1
等 级:新手上路
帖 子:72
专家分:0
注 册:2007-10-25
结帖率:100%
收藏
 问题点数:0 回复次数:3 
关于银行家算法的一个问题

具体代码:
#include <string.h>
#include <iostream.h>
#define M 5 //总进程数
#define N 3 //总资源数
#define FALSE 0
#define TRUE 1
//M个进程对N类资源最大资源需求量
int MAX[M][N]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}};
//系统可用资源数
int AVAILABLE[N]={10,5,7};
//M个进程已经得到N类资源的资源量
int ALLOCATION[M][N]={{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}};
//M个进程还需要N类资源的资源量
int NEED[M][N]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}};
int Request[N]={0,0,0};

void main()
{
int i=0,j=0;
char flag='Y';
void showdata();
void changdata(int);
void rstordata(int);
int chkerr(int);
showdata();
while(flag=='Y'||flag=='y')
{
i=-1;
while(i<0||i>=M)
{
cout<<" 请输入需申请资源的进程号(从0到"<<M-1<<",否则重输入!):";
cin>>i;
if(i<0||i>=M)cout<<" 输入的进程号不存在,重新输入!"<<endl;
}
cout<<" 请输入进程"<<i<<"申请的资源数"<<endl;
for (j=0;j<N;j++)
{
cout<<" 资源"<<j<<": ";
cin>>Request[j];
if(Request[j]>NEED[i][j])
{
cout<<" 进程"<<i<<"申请的资源数大于进程"<<i<<"还需要"<<j<<"类资源的资源量!";
cout<<"申请不合理,出错!请重新选择!"<<endl<<endl;
flag='N';
break;
}
else
{
if(Request[j]>AVAILABLE[j])
{
cout<<" 进程"<<i<<"申请的资源数大于系统可用"<<j<<"类资源的资源量!";
cout<<"申请不合理,出错!请重新选择!"<<endl<<endl;
flag='N';
break;
}
}
}
if(flag=='Y'||flag=='y')
{
changdata(i);
if(chkerr(i))
{
rstordata(i);
showdata();
}
else
showdata();
}
else
showdata();
cout<<endl;
cout<<" 是否继续银行家算法演示,按'Y'或'y'键继续,按'N'或'n'键退出演示: ";
cin>>flag;
}
}


void showdata() //显示数据
{
int i,j;
cout<<" 系统可用的资源数为:"<<endl<<endl;
cout<<" ";
for (j=0;j<N;j++)cout<<" 资源"<<j<<": "<<AVAILABLE[j];
cout<<endl;
cout<<endl;
cout<<" 各进程还需要的资源量:"<<endl<<endl;
for (i=0;i<M;i++)
{
cout<<"进程"<<i<<":";
for (j=0;j<N;j++)cout<<" 资源"<<j<<": "<<NEED[i][j];
cout<<endl;
}
cout<<endl;
cout<<" 各进程已经得到的资源量: "<<endl<<endl;
for (i=0;i<M;i++)
{
cout<<"进程"<<i<<":";
for (j=0;j<N;j++)cout<<" 资源"<<j<<": "<<ALLOCATION[i][j];
cout<<endl;
}
cout<<endl;
};


void changdata(int k) //尝试分配资源
{
int j;
for (j=0;j<N;j++)
{
AVAILABLE[j]=AVAILABLE[j]-Request[j];
ALLOCATION[k][j]=ALLOCATION[k][j]+Request[j];
NEED[k][j]=NEED[k][j]-Request[j];
}
};


void rstordata(int k) //???
{
int j;
for (j=0;j<N;j++)
{
AVAILABLE[j]=AVAILABLE[j]+Request[j];
ALLOCATION[k][j]=ALLOCATION[k][j]-Request[j];
NEED[k][j]=NEED[k][j]+Request[j];
}
};


int chkerr(int s) //安全性检查
{
int WORK,FINISH[M],temp[M];
int i,j,k=0;
for(i=0;i<M;i++)FINISH[i]=FALSE;
for(j=0;j<N;j++)
{
WORK=AVAILABLE[j];
i=s;
while(i<M)
{
if (FINISH[i]==FALSE&&NEED[i][j]<=WORK)
{
WORK=WORK+ALLOCATION[i][j];
FINISH[i]=TRUE;
temp[k]=i;
k++;
i=0;
}
else
{
i++;
}
}
for(i=0;i<M;i++)
if(FINISH[i]==FALSE)
{
cout<<endl;
cout<<" 系统不安全!!! 本次资源申请不成功!!!"<<endl;
cout<<endl;
return 1;
}
}
cout<<endl;
cout<<" 经安全性检查,系统安全,本次分配成功。"<<endl;
cout<<endl;
cout<<" 本次安全序列:";
for(i=0;i<M;i++)cout<<"进程"<<temp[i]<<"->";
cout<<endl<<endl;;
return 0;
};

蓝色部分是什么意思??
急的解答~~谢谢拉~~~

搜索更多相关主题的帖子: 银行家 算法 define 资源 MAX 
2007-11-20 17:50
cz522321
Rank: 1
等 级:禁止访问
威 望:2
帖 子:569
专家分:5
注 册:2006-3-13
收藏
得分:0 
这个算法的具体思路能说一下吗?

2007-11-20 18:46
小鸟向前飞
Rank: 1
等 级:新手上路
帖 子:72
专家分:0
注 册:2007-10-25
收藏
得分:0 

就是操作系统里的银行家算法啊 没人知道啊...


未知是最大的诱惑.
2007-11-20 21:22
appleshu
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2007-11-21
收藏
得分:0 
void changdata(int k) //尝试分配资源
{
int j;
for (j=0;j<N;j++)
{
AVAILABLE[j]=AVAILABLE[j]-Request[j];
ALLOCATION[k][j]=ALLOCATION[k][j]+Request[j];
NEED[k][j]=NEED[k][j]-Request[j];
}
};

void rstordata(int k) //???
{
int j;
for (j=0;j<N;j++)
{
AVAILABLE[j]=AVAILABLE[j]+Request[j];
ALLOCATION[k][j]=ALLOCATION[k][j]-Request[j];
NEED[k][j]=NEED[k][j]+Request[j];
}
};

发现没  这两个函数实现的功能是反的 回滚? 不知道恰不恰当

前面的是预分配,再对修改过的状态执行安全性检查(有一个安全性算法);如果发现不安全,则可有后面的函数进行

恢复,退回到之前的状态。

看看操作系统的课本吧,上面有很详细的讲解。
2007-11-23 13:11
快速回复:关于银行家算法的一个问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.021166 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved