银行家算法C++代码实现.docx
- 文档编号:29273009
- 上传时间:2023-07-21
- 格式:DOCX
- 页数:19
- 大小:151.64KB
银行家算法C++代码实现.docx
《银行家算法C++代码实现.docx》由会员分享,可在线阅读,更多相关《银行家算法C++代码实现.docx(19页珍藏版)》请在冰豆网上搜索。
银行家算法C++代码实现
编号:
实验
一
二
三
四
五
六
七
八
九
十
总评
教师签名
成绩
武汉大学计算机学院
课程实验(设计)报告
专业(班):
计算机科学与技术计科6班
学号:
2013301500217
姓名:
张伟
课程名称:
操作系统设计
任课教师:
宋伟
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 { need[i]=_need[i]; allocation[i]=_allocation[i]; max_need[i]=_max_need[i]; } } //构造函数 voidset(int_need[max_resources],int_max_need[max_resources]) { for(inti=0;i { need[i]=_need[i]; allocation[i]=0; max_need[i]=_max_need[i]; } }//赋值函数 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,空格隔开"< scanf_s("%d",&i); for(j=0;j { scanf_s("%d",&my_process[i].request[j]); } if(destribute(available,my_process[i],my_process)==true) { cout<<"此次destribute成功"< } elsecout<<"此次destribute不成功"< } break; case2: {for(i=0;i cout<<"第"< break; } default: break; } } cin.get(); cin.get(); cin.get(); cin.get(); cin.get(); cin.get(); cin.get(); cin.get(); cin.get(); return0; }银行家算法操作部分 银行家算法的基本思想是分配资源之前,判断系统是否是安全的;若是,才分配。 它是最具有代表性的避免死锁的算法。 设进程cusneed提出请求REQUEST [i],则银行家算法按如下规则进行判断。 (1)如果REQUEST [cusneed] [i]<= NEED[cusneed][i],则转 (2);否则,出错。 (2)如果REQUEST [cusneed] [i]<= 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 usingnamespacestd; #definemax_process5 #definemax_resources4 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 { need[i]=_need[i]; allocation[i]=_allocation[i]; max_need[i]=_max_need[i]; } } //构造函数 voidset(bool_finish,int_need[max_resources],int_allocation[max_resources],int_max_need[max_resources],int_request[max_resources]) { for(inti=0;i { finish=_finish; need[i]=_need[i]; allocation[i]=_allocation[i]; max_need[i]=_max_need[i]; request[i]=_request[i]; } }//赋值函数 process() { } }; boolcheck_safe(intwork[max_process],processmy_process[max_process])//安全性算法 { inttemp_work[max_process]; processtemp_process[max_process]; for(intno=0;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 { num++; for(i=0;i { for(x=0;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 { if(check_everyone[temp]==false) { check=false;break; } elsecheck=true; } /*cout<<"check"< } for(intno=0;no { 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]) {//是否分配成功的算法 inti=0; intenough=1; for(i=0;i { if(the_process.request[i]<=the_process.need[i]&&the_process.request[i] enough=enough*1; elseenough=0; }//检查request的值是不是小于need和available if(enough>0) { for(i=0;i { 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 { cout<<"请求资源超过宣布最大值或者资源不足,无法分配"< returnfalse; } if(check_safe(available,my_process)==true) { cout<<"此次分配成功"< returntrue; } else { cout<<"此次寻找失败"< for(i=0;i { 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;//安全性算法检测错误,则回档 returnfalse; } } voidinit(intavailable[max_resources],processmy_process[max_process])//初始化函数 { int_max_need[max_resources]; inti; inttemp[max_resources]={0,0,0,0}; cout<<"初始化available数组值,请输入"< for(i=0;i { scanf_s("%d",&available[i]); } for(i=0;i { cout<<"进程初始化"< cout<<"请输入第"< for(intj=0;j { scanf_s("%d",&_max_need[j]); } my_process[i].set(false,_max_need,temp,_max_need,temp); } } 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,空格隔开"< scanf_s("%d",&i); for(j=0;j { scanf_s("%d",&my_process[i].request[j]); } if(destribute(available,my_process[i],my_process)==true) { cout<<"此次destribute成功"< } elsecout<<"此次destribute不成功"< } break; case2: {for(i=0;i cout<<"第"< break; } default: break; } } cin.get(); cin.get(); cin.get(); cin.get(); cin.get(); cin.get(); cin.get(); cin.get(); cin.get(); return0; } 五、运行实例 为了便于模拟,默认是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+ 代码 实现