银行家算法C++代码实现Word下载.docx
- 文档编号:22923842
- 上传时间:2023-02-06
- 格式:DOCX
- 页数:19
- 大小:151.62KB
银行家算法C++代码实现Word下载.docx
《银行家算法C++代码实现Word下载.docx》由会员分享,可在线阅读,更多相关《银行家算法C++代码实现Word下载.docx(19页珍藏版)》请在冰豆网上搜索。
2015年12月22日
银行家算法实现
一、实习内容
编写实现银行家算法,实现资源的安全分配。
通过本实验熟悉银行家算法,对预防死锁有更深刻的认识。
二、实习题目
初始状态下,设置数据结构存储可利用资源向量(Available),最大需求矩阵(MAX),分配矩阵(Allocation),需求矩阵(Need),输入待分配进程队列和所需资源。
设计安全性算法,设置工作向量表示系统可提供进程继续运行的可利用资源数目。
如果进程队列可以顺利执行打印输出资源分配情况,如果进程队列不能顺利执行打印输出分配过程,提示出现死锁位置。
三、设计思想
数据结构
classprocess//定义进程
{
public:
boolfinish=false;
//完成状态
intneed[max_resources];
//还需要分配的资源
intallocation[max_resources];
//已经分配的资源
intmax_need[max_resources];
//最大需求量
intrequest[max_resources];
//本次需求量
public:
process(int_need[max_resources],int_allocation[max_resources],int_max_need[max_resources])
{
for(inti=0;
i<
max_resources;
i++)
{
need[i]=_need[i];
allocation[i]=_allocation[i];
max_need[i]=_max_need[i];
}
}
//构造函数
voidset(int_need[max_resources],int_max_need[max_resources])
allocation[i]=0;
}//赋值函数
process()
};
主要函数
(1)boolcheck_safe(intwork[max_process],processmy_process[max_process])//安全性算法
(2)booldestribute(intavailable[max_resources],processthe_process,processmy_process[max_process])//是否分配空间成功的算法
(3)voidinit(intavailable[max_resources],processmy_process[max_process])//初始化函数
Main函数
intmain()
int_need[max_resources];
int_allocation[max_resources];
intavailable[max_resources];
processmy_process[max_process];
inti,j;
intchoice=1;
init(available,my_process);
while(true)
cout<
<
"
选项\n1:
继续分配\n2:
查看当前available资源数\n其他字符:
退出\n"
;
scanf_s("
%d"
&
choice);
switch(choice)
{case1:
cout<
请输入本次请求分配给第i个进程的资源,格式:
进程号xxxxxxxx,空格隔开"
<
endl;
i);
for(j=0;
j<
j++)
scanf_s("
my_process[i].request[j]);
if(destribute(available,my_process[i],my_process)==true)
此次destribute成功"
elsecout<
此次destribute不成功"
break;
case2:
{for(i=0;
第"
个资源还剩"
available[i]<
个\n"
default:
break;
cin.get();
return0;
}银行家算法操作部分
银行家算法的基本思想是分配资源之前,判断系统是否是安全的;
若是,才分配。
它是最具有代表性的避免死锁的算法。
设进程cusneed提出请求REQUEST
[i],则银行家算法按如下规则进行判断。
(1)如果REQUEST
[cusneed]
[i]<
=
NEED[cusneed][i],则转
(2);
否则,出错。
(2)如果REQUEST
AVAILABLE[cusneed][i],则转(3);
(3)系统试探分配资源,修改相关数据:
AVAILABLE[i]-=REQUEST[cusneed][i];
ALLOCATION[cusneed][i]+=REQUEST[cusneed][i];
NEED[cusneed][i]-=REQUEST[cusneed][i];
(4)系统执行安全性检查,如安全,则分配成立;
否则试探险性分配作废,系统恢复原状,进程等待。
安全性算法检验部分
1)设置两个工作向量Work=AVAILABLE;
FINISH
(2)从进程集合中找到一个满足下述条件的进程,
FINISH==false;
NEED<
=Work;
如找到,执行(3);
否则,执行(4)
(3)设进程获得资源,可顺利执行,直至完成,从而释放资源。
Work+=ALLOCATION;
Finish=true;
GOTO
2
(4)如所有的进程Finish=
true,则表示安全;
否则系统不安全。
结果显示部分
在屏幕上面打印本次分配资源是否成功或者失败
或者打印当前available资源状态
四、源代码
/*C++SourceFile*/
/*开发环境为MicrosoftVisualStudio2015*/
#include<
iostream>
usingnamespacestd;
#definemax_process5
#definemax_resources4
classprocess
voidset(bool_finish,int_need[max_resources],int_allocation[max_resources],int_max_need[max_resources],int_request[max_resources])
finish=_finish;
request[i]=_request[i];
boolcheck_safe(intwork[max_process],processmy_process[max_process])//安全性算法
inttemp_work[max_process];
processtemp_process[max_process];
for(intno=0;
no<
max_process;
no++)
temp_work[no]=work[no];
temp_process[no].set(my_process[no].finish,my_process[no].need,my_process[no].allocation,my_process[no].max_need,my_process[no].request);
}//先把每个进程的状态存储在临时数组,最后在拷贝回去
inti=0;
intx=0;
boolcheck_everyone[max_process]={true,true,true,true,true};
boolcheck=false;
intnum=0;
while(check==false&
&
num<
max_process*max_process/2)
num++;
for(i=0;
i++)//找到一个可以完成的资源
for(x=0;
x<
x++)//对于每个进程,检查资源是否够
{
if(my_process[i].finish==false)
{
check_everyone[i]=work[x]>
=my_process[i].need[x];
}
elsebreak;
if(check_everyone[i]==false)
break;
}
if(check_everyone[i]==true)
{/*先把资源分配给i进程,然后运行完后释放掉*/
for(x=0;
x++)
work[x]=work[x]+my_process[i].need[x];
break;
/*检查是否所有的进程都为true,如果是,那么check置为true*/
for(inttemp=0;
temp<
temp++)
if(check_everyone[temp]==false)
check=false;
elsecheck=true;
/*cout<
check"
*/
work[no]=temp_work[no];
my_process[no].set(temp_process[no].finish,temp_process[no].need,temp_process[no].allocation,temp_process[no].max_need,temp_process[no].request);
}//安全性算法检测完毕,把数据拷贝回来
returncheck;
}
booldestribute(intavailable[max_resources],processthe_process,processmy_process[max_process])
{//是否分配成功的算法
intenough=1;
for(i=0;
if(the_process.request[i]<
=the_process.need[i]&
the_process.request[i]<
available[i])
enough=enough*1;
elseenough=0;
}//检查request的值是不是小于need和available
if(enough>
0)
available[i]=available[i]-the_process.request[i];
the_process.allocation[i]=the_process.allocation[i]+the_process.request[i];
the_process.need[i]=the_process.need[i]-the_process.request[i];
else
请求资源超过宣布最大值或者资源不足,无法分配"
returnfalse;
if(check_safe(available,my_process)==true)
此次分配成功"
returntrue;
此次寻找失败"
available[i]=available[i]+the_process.request[i];
the_process.allocation[i]=the_process.allocation[i]-the_process.request[i];
the_process.need[i]=the_process.need[i]+the_process.request[i];
the_process.finish=false;
//安全性算法检测错误,则回档
voidinit(intavailable[max_resources],processmy_process[max_process])//初始化函数
int_max_need[max_resources];
inti;
inttemp[max_resources]={0,0,0,0};
cout<
初始化available数组值,请输入"
max_resources<
个值代表每个资源初始数目,空格隔开"
for(i=0;
available[i]);
进程初始化"
请输入第"
个进程的最大所需每个资源的值,共计"
个资源,用空格隔开"
for(intj=0;
_max_need[j]);
my_process[i].set(false,_max_need,temp,_max_need,temp);
五、运行实例
为了便于模拟,默认是5个进程,4个公共资源
首先是available资源的初始化(如图1)
图1
初始化每个进程对于每个资源的max_need值
图2
开始进行资源分配:
此数据设计为可以成功的数据:
图3
图4
查看下剩余的available值
接下来测试一些非法数据:
如图,为request>
need值的报错
图5
这是request>
available值的时候报错:
图6
接下来再次进行分配:
可见并未通过安全性算法,显示失败
图7
六、心得与体会
通过本次实验,我通过亲身实践实现了模拟银行家算法的实现来预防进程死锁,本次实验需要考虑很周全,我在编程的过程中出现了不少错误,由于考虑不周,刚开始总是顾此失彼,在经过系统的排查错误和对流程的分析,最终一个一个排除错误,得到正确的银行家算法的代码实现。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 银行家 算法 C+ 代码 实现
![提示](https://static.bdocx.com/images/bang_tan.gif)