编程模拟银行家算法文档格式.docx
《编程模拟银行家算法文档格式.docx》由会员分享,可在线阅读,更多相关《编程模拟银行家算法文档格式.docx(16页珍藏版)》请在冰点文库上搜索。
否则,该申请暂不能满足。
实现银行家算法要有若干数据结构,它们用来表示资源分配系统的状态。
令n表示系统中进程的数目,m表示资源的分类数。
还需要以下数据结构:
1.Available是一个长度为m的向量,它表示每类资源可用的数量。
Available[j]=k,表示rj类资源可用的数量为k。
2.Max是一个n×
m矩阵,它表示每个进程对资源的最大需求。
Max[i,j]=k,表示进程pi至多可以申请k个rj类资源单位。
3.Allocation是一个n×
m矩阵,它表示当前分给每个进程的资源数目。
Allocation[i,j]=k,表示进程pi当前分到k个rj类资源。
4.Need是一个n×
m矩阵,它表示每个进程还缺少多少资源。
Need[i,j]=k,表示进程pi尚需k个rj类资源才能完成其任务。
显然Need[i,j]=Max[i,j]-Allocation[i,j]。
这些数据结构的大小和数值随时间推移而改变。
系统所执行的安全性算法描述如下:
1.设置2个向量:
工作向量Work:
它表示系统可提供给进程继续运行所需的各类资源数目,它含有m个元素,在执行安全算法开始时,Work=Available。
Finish[i]:
它表示系统是否有足够的资源分配给进程,使之完成运行。
开始时先做Finish[i]=true。
2.从进程集合中找到一个满足下述条件的进程:
Finish[i]=flase;
Need[i,j]≤Work[j];
若找到,则执行步骤3,否则,执行步骤4。
3.当进程pi获得资源后,可顺利执行,直至完成,并释放分配给它的资源。
4.如果所有进程的Finish[i]=true都满足。
则表示系统处于安全状态;
否则,系统处于不安全状态。
2.详细设计
2.1程序源代码
#include<
iostream>
string>
stdio>
usingnamespacestd;
#defineFalse0
#defineTrue1
intMax[100][100]={0};
//各进程所需各类资源的最大需求
intAvaliable[100]={0};
//系统可用资源
charname[100]={0};
//资源的名称
intAllocation[100][100]={0};
//系统已分配资源
intNeed[100][100]={0};
//还需要资源
intRequest[100]={0};
//请求资源向量
inttemp[100]={0};
//存放安全序列
intWork[100]={0};
//存放系统可提供资源
intM=100;
//作业的最大数为100
intN=100;
//资源的最大数为100
voidshowdata()//显示资源矩阵
{
inti,j;
cout<
<
"
系统目前可用的资源[Avaliable]:
endl;
for(i=0;
i<
N;
i++)
name[i]<
"
;
for(j=0;
j<
j++)
Avaliable[j]<
//输出分配资源
MaxAllocationNeed"
进程名"
for(j=0;
3;
j++){
}
M;
i++){
Max[i][j]<
Allocation[i][j]<
Need[i][j]<
}
intchangdata(inti)//进行资源分配
{
intj;
for(j=0;
j++){
Avaliable[j]=Avaliable[j]-Request[j];
Allocation[i][j]=Allocation[i][j]+Request[j];
Need[i][j]=Need[i][j]-Request[j];
return1;
intsafe()//安全性算法
inti,k=0,m,apply,Finish[100]={0};
intflag=0;
Work[0]=Avaliable[0];
Work[1]=Avaliable[1];
Work[2]=Avaliable[2];
for(i=0;
i++){
apply=0;
if(Finish[i]==False&
&
=Work[j]){
apply++;
if(apply==N){
for(m=0;
m<
m++)
Work[m]=Work[m]+Allocation[i][m];
//变分配数
Finish[i]=True;
temp[k]=i;
i=-1;
k++;
flag++;
if(Finish[i]==False){
系统不安全"
//不成功系统不安全
return-1;
系统是安全的!
//如果安全,输出成功
分配的序列:
i++){//输出运行进程数组
temp[i];
if(i<
M-1)cout<
->
return0;
voidshare()//利用银行家算法对申请资源对进行判定
charch;
inti=0,j=0;
ch='
y'
cout<
请输入要求分配的资源进程号(0-"
M-1<
):
cin>
>
i;
//输入须申请的资源号
请输入进程"
申请的资源:
for(j=0;
name[j]<
:
Request[j];
//输入需要申请的资源
if(Request[j]>
Need[i][j])//判断申请是否大于需求,若大于则出错
{
进程"
申请的资源大于它需要的资源"
分配不合理,不予分配!
ch='
n'
break;
else{
Avaliable[j])//判断申请是否大于当前资源,若大于则
{//出错
进程"
申请的资源大于系统现在可利用的资源"
分配出错,不予分配!
if(ch=='
){
changdata(i);
//根据进程需求量变换资源
showdata();
//根据进程需求量显示变换后的资源
safe();
//根据进程需求量进行银行家算法判断
voidaddresources(){//添加资源
intn,flag;
请输入需要添加资源种类的数量:
cin>
n;
flag=N;
N=N+n;
for(inti=0;
名称:
name[flag];
数量:
Avaliable[flag++];
showdata();
safe();
voidchangeresources(){//修改资源函数
for(inti=0;
Avaliable[i]<
输入系统可用资源[Avaliable]:
Avaliable[0]>
Avaliable[1]>
Avaliable[2];
经修改后的系统可用资源为"
for(intk=0;
k<
k++)
name[k]<
Avaliable[k]<
voiddelresources(){//删除资源
charming;
inti,flag=1;
请输入需要删除的资源名称:
do{
ming;
if(ming==name[i]){
flag=0;
if(i==N)
该资源名称不存在,请重新输入:
while(flag);
for(intj=i;
N-1;
name[j]=name[j+1];
Avaliable[j]=Avaliable[j+1];
N=N-1;
voidaddprocess(){//添加作业
intflag=M;
M=M+1;
请输入该作业的最大需求量[Max]"
Max[flag][i];
Need[flag][i]=Max[flag][i]-Allocation[flag][i];
intmain()//主函数
inti,j,number,choice,m,n,flag;
*****************资源管理系统的设计与实现*****************"
请首先输入系统可供资源种类的数量:
N=n;
资源"
i+1<
的名称:
name[i]=ming;
资源的数量:
number;
Avaliable[i]=number;
请输入作业的数量:
m;
M=m;
请输入各进程的最大需求量("
*"
n<
矩阵)[Max]:
Max[i][j];
请输入各进程已经申请的资源量("
矩阵)[Allocation]:
Allocation[i][j];
if(Allocation[i][j]>
Max[i][j])
flag=1;
Need[i][j]=Max[i][j]-Allocation[i][j];
if(flag)
申请的资源大于最大需求量,请重新输入!
\n"
//显示各种资源
//用银行家算法判定系统是否安全
while(choice)
**************银行家算法演示***************"
1:
增加资源"
2:
删除资源"
3:
修改资源"
4:
分配资源"
5:
增加作业"
0:
离开"
*******************************************"
请选择功能号:
choice;
switch(choice)
{
case1:
addresources();
break;
case2:
delresources();
case3:
changeresources();
case4:
share();
case5:
addprocess();
case0:
choice=0;
default:
请正确选择功能号(0-5)!
return1;
3.调试及运行结果
3.1程序调试及运行结果
经过调试,改正了越界错误,定义错误,死循环和一些语法错误。
程序最终运行成功。
检测结果如下:
总结和体会
一周的课程设计结束了。
在这一周里,我做一个模拟银行家算法。
我觉得在着手设计前设计的思路是很重要的。
只有思路清晰才能进行下一阶段的设计。
这样才能完成整个程序的设计,完成整个文报告的书写。
课程设计这几天学到的东西还真不少。
以前不清楚的现在都暴露出来了。
以前认为学了没用的东西现在也用到了。
这次的课程设计使我进一步了解了调度与死锁的问题。
以及有关资源申请的问题、避免死锁的具体实施方法。
深入了解了银行家算法的资源申请和资源分配的过程及原则。
保证系统处于安全状态。