银行家算法报告和代码.docx
- 文档编号:13817911
- 上传时间:2023-06-17
- 格式:DOCX
- 页数:20
- 大小:126.23KB
银行家算法报告和代码.docx
《银行家算法报告和代码.docx》由会员分享,可在线阅读,更多相关《银行家算法报告和代码.docx(20页珍藏版)》请在冰点文库上搜索。
银行家算法报告和代码
课程设计(论文)
题目:
银行家算法
院(系):
信息与控制工程系
专业班级:
姓名:
学号:
指导教师:
2016年1月15日
西安建筑科技大学华清学院课程设计(论文)任务书
专业班级:
学生姓名:
指导教师(签名):
一、课程设计(论文)题目
银行家算法:
设计一个n个并发进程共享m个系统资源的程序以实现银行家算法。
二、本次课程设计(论文)应达到的目的
操作系统课程实践性比较强。
课程设计是加强学生实践能力的一个强有力手段。
课程设计要求学生在完成程序设计的同时能够写出比较规范的设计报告。
严格实施课程设计这一环节,对于学生基本程序设计素养的培养和软件工作者工作作风的训练,将起到显著的促进作用。
本题目要达到目的:
了解多道程序系统中,多个进程并发执行的资源分配。
掌握银行家算法,了解资源在进程并发执行中的资源分配情况。
掌握预防死锁的方法,系统安全状态的基本概念。
三、本次课程设计(论文)任务的主要内容和要求(包括原始数据、技术参数、设计要求等)
要求:
1)能显示当前系统资源的占用和剩余情况。
2)为进程分配资源,如果进程要求的资源大于系统剩余的资源,不与分配并且提示分配不成功;
3)撤销作业,释放资源。
编写和调试一个系统动态分配资源的简单模拟程序,观察死锁产生的条件,并采用适当的算法,有效地防止和避免死锁的发生。
银行家算法分配资源的原则是:
系统掌握每个进程对资源的最大需求量,当进程要求申请资源时,系统就测试该进程尚需资源的最大量,如果系统中现存的资源数大于或等于该进程尚需求资源最大量时,就满足进程的当前申请。
这样就可以保证至少有一个进程可能得到全部资源而执行到结束,然后归还它所占有的全部资源供其它进程使用。
四、应收集的资料及主要参考文献:
操作系统经典算法的编程实现资料非常丰富,可以在图书馆找书籍或在因特网上找资料,都很容易找到,但是大部分代码是不全的,不能直接运行,希望大家只是把它当参考,编码还是自己做。
参考文献:
【1】汤小丹、梁红兵、哲凤屏、汤子瀛编著.计算机操作系统(第三版).西安:
西安电子科技大学出版社,2007.5
【2】史美林编.计算机操作系统教程.北京:
清华大学出版社,1999.11
【3】徐甲同编著.操作系统教程.西安:
西安电子科技大学出版社,1996.8
【4】Clifford,A.Shaffer编著.数决结构与算法分析(C++版).北京:
电子工业出版社,2005.7
【5】蒋立翔编著.C++程序设计技能百练.北京:
中国铁道出版社,2004.1
五、审核批准意见
教研室主任(签字)
设计总说明
我们可以把操作系统看成是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。
操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。
当进程在执行中继续申请资源时,先测试该进程已占用的资源与本次申请的资源数之和是否超过了该进程对资源的最大需求量。
若超过则拒绝分配,若没超过则再测试系统现存的资源能否满足该进程尚需的最大资源量,若能满足则按当前的申请量分配,否则也要推迟。
关键字:
死锁,安全序列,银行家算法进程
《操作系统》课程设计
银行家算法
1.设计目的
“操作系统”是计算机专业的核心专业课,“操作系统课程设计”是理解和巩固操作系统基本理论、原理和方法的重要的实践环节。
操作系统课程主要讲述的内容是多道操作系统的原理与技术,与其它计算机原理、编译原理、汇编语言、计算机网络、程序设计等专业课程关系十分密切。
本课程设计的目的综合应用学生所学知识,建立系统和完整的计算机系统概念,理解和巩固操作系统基本理论、原理和方法,掌握操作系统基本理论与管理方式。
在算法基础上,解决实际的管理功能的问题,提高学生实际应用、编程的能力。
课程设计要求学生在完成程序设计的同时能够撰写比较规范的设计报告。
严格实施课程设计这一环节,对于学生基本程序设计素养的培养和软件工作者工作作风的训练,将起到显著的促进作用。
2.问题描述
在死锁的皮免责,银行家算法把系统状态分为安全状态和不安全状态,只要能使系统始终处于安全状态便可以避免发生死锁。
所谓安全状态,是指系统能按某种顺序为每个进程分配所需资源,直到最大需求,是每个进程都可以顺利完成,即可找到一个安全资源分配序列。
模拟视线这个过程。
3.需求分析
3.1数据需求
系统可分配资源量,进程已申请到的资源量,进程所需最大资源量,进程还需要的资源量
3.2基本功能需求
此系统主要通过银行家算法为进程进行资源的分配。
3.3非功能性需求
用户界面需求:
简洁、易用、易懂、友好的用户界面。
硬件要求:
装有VisualC++6.0的计算机。
可靠性需求:
保证用户在正常使用本系统时,用户的操作或误操作不会产生数据的丢失。
4.概要设计
4.1数据结构
数组:
可利用资源向量Available最大需求矩阵Max
分配矩阵Allocation需求矩阵Need
4.2系统包含的函数
voidshowdata();//显示主界面函数
intsafe();//安全性算法函数
voidshare();//银行家算法
intmain();//主函数
4.3函数间的关系
此系统各个函数之间相互是有联系的,比如在主函数中会调用其他的函数,在share函数中也对前面两个函数进行了调用。
4.4系统功能模块图
图4-4-1系统功能模块图
5.详细设计
5.1结构体的详细定义
intAvailable[50]={0};
intMax[50][50]={0};
intAllocation[50][50]={0};
intNeed[50][50]={0};
intRequest[50]={0};
intWork[50]={0};
charname[100]={0};
inttemp[50]={0};
intFinish[50]={0};
5.2系统函数详细介绍
voidshowdata()
此函数主要是在确定好资源和进程以及各进程的最大需求量和已分配的资源后,显示的此刻资源的分配情况。
voidshare()
此函数对申请的资源进行判定,如果合法,则予以分配;如果出错,则不给分配。
intsafe()
此函数当为进程分配资源以后,检查这个状态是不是安全的,如安全,则确认分配;否则不予分配。
5.3系统功能模块介绍
显示模块:
此模块主要是显示某时刻的资源分配情况。
银行家算法模块:
由银行家算法对资源进行分配,算法如下:
(1)如果Requesti[j] (2)如果Requesti[j] (3)系统试探着把资源分配给进程Pi,并修改下面数据结构中的数值: Available[j]: =Available[j]—Requesti[j]; Allocation[i,j]: =Allocation[i,j]+Requesti[j]; Need[i,j]: =Need[i,j]—Requesti[j]; (4)系统执行安全性算法,检查此次资源分配后系统是否处于安全状态。 若安全,才正式将资源分配给进程Pi,以完成本次分配;否则,将本次的试探分配作废,恢复原来的资源分配状态,让进程Pi等待。 安全性检查模块: 检查资源分配后系统是否处于安全状态,算法如下: (1)设置两个向量: 工作向量Work,他表示系统可提供给进程继续运行所需的各类资源数目,它含有m个元素,在执行安全算法开始时,Work: =Available. Finish,他表示系统是否有足够的资源分配给进程,使之运行完成。 开始时先做Finish[i]: =flase;当有足够资源分配给进程后,再令Finish[i]: =True. (2)从进程集合中找到一个能满足下述条件的进程: Finish[i]=flase; Need[i,j] (3)当进程Pi获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行: Work[j]: =Work[j]+Allocation[i,j]; Finish[i]: =true; gotostep2; (4)如果所有进程的Finish[i]=true都满足,则表示系统处于安全状态;否则,系统处于不安全状态。 5.4具体模块设计 图5-4-! 安全性算法流程图 6.调试分析 (1)测试数据: 根据主界面提示,输入资源的名称数量和进程的数量以及进程所需的最大需求量和已分配的资源,然后进行观察。 (2)算法改进设想: 在程序设计前期,代码运行语法部分没有出现问题,但是在运行时,在输入已分配资源那块出现问题,经过不断地修改和请教,终于成功运行出来。 7.使用说明 图7-1系统界面图 图7-2资源分配图 图7-3安全性检查图 图7-4预分配资源图 图7-5预分配资源安全检查图 图7-6预分配资源出错图 8.设计总结 此次操作系统课程设计,实现了银行家算法,他是避免死锁的重要方法。 其中,我学到了很多的东西。 首先,接到设计题目之后,在对本题目进行分析的时候,我懂得了一个很重要的道理,那就是说一个程序的产生需要一个对题目要求有一个正确全面的分析。 其次,就该考虑程序算法的问题了,一个好的算法是一个好程序的灵魂,也决定了一个程序的质量。 通过课程设计,我加深了对操作系统这门课的认识。 使自己对软件的使用能力得到提升。 通过操作系统这门课的课程设计,我更加知道了实践的重要性。 在做课设的过程当中,遇到了很多的问题。 比如,在运行程序时,输入已分配资源时出现问题,怎么调都调不正确,于是及时向郭同学请求帮助,她认真地对待并且解决了问题,使我能够及时地明白哪里不对并且改正。 课程设计几天的时间下来,对操作系统这门课有了更深的了解,它是一门很重要的课程,算法比较多,需要我们很好地去掌握。 而且在过程当中,我们也好地复习了c语言这门课,在计算机领域,很多课程都是相互联系的,相互交叉的,所以我们应该认真地对待每一门课程。 这次的课设让我明白,以后一定要自己多动手做,这样才能印象深刻,才能更好地掌握这门课。 9.参考文献 【1】汤小丹、梁红兵、哲凤屏、汤子瀛编著.计算机操作系统(第三版).西安: 西安电子科技大学出版社,2007.5 【2】史美林编.计算机操作系统教程.北京: 清华大学出版社,1999.11 【3】徐甲同编著.操作系统教程.西安: 西安电子科技大学出版社,1996.8 【4】Clifford,A.Shaffer编著.数决结构与算法分析(C++版).北京: 电子工业出版社,2005.7 【5】蒋立翔编著.C++程序设计技能百练.北京: 中国铁道出版社,2004.1 10.程序源代码 #include #include #include #definefalse0 #definetrue1 intAvailable[50]={0}; intMax[50][50]={0}; intAllocation[50][50]={0}; intNeed[50][50]={0}; intRequest[50]={0}; intWork[50]={0}; charname[100]={0}; inttemp[50]={0}; intFinish[50]={0}; intM=50;//作业最大数 intN=50;//资源最大数 voidshowdata() {inti,j; cout<<"此时刻的资源分配情况为: "< cout< cout<<"MaxAllocationNeedAvailable"< cout<<"进程名"; for(j=0;j<4;j++) {for(i=0;i cout< cout<<""; } cout< for(i=0;i {cout<<""< for(j=0;j cout< cout<<""; for(j=0;j cout< cout<<""; for(j=0;j cout< if(i==0){ cout<<""; for(j=0;j cout< } cout< } } intsafe()//安全性算法 {inti,d,k=0,m,h,s,apply,Finish[100]={0}; intj; intflag=0; for(i=0;i Work[i]=Available[i]; cout< cout<<"WorkNeedAllocationWork+AllocationFinish"< cout<<"进程名"; for(h=0;h<4;h++){ for(s=0;s cout< cout<<""; } cout< for(i=0;i apply=0; for(j=0;j if(Finish[i]==false&&Need[i][j]<=Work[j]) {apply++; if(apply==N) {cout<<""< for(d=0;d cout< cout<<""; for(d=0;d cout< cout<<""; for(d=0;d cout< cout<<""; for(m=0;m {Work[m]=Work[m]+Allocation[i][m]; cout< }//变分配数 Finish[i]=true; temp[k]=i; cout<<""; cout<<"true"<<""; cout< i=-1; k++; flag++; } } } } for(i=0;i if(Finish[i]==false){ for(j=0;j Available[j]=Available[j]+Request[j]; Allocation[i][j]=Allocation[i][j]-Request[j]; Need[i][j]=Need[i][j]+Request[j]; } cout< 此时系统不分配资源! "< return0; } } cout< "< cout<<"安全序列为: "; for(i=0;i cout< if(i } cout< return0;} voidshare()//利用银行家算法对申请资源对进行判定 {charch; inti=0,j=0; ch='y'; intsum=0; cout< "; cin>>i;//输入须申请的资源号 cout< "< for(j=0;j {cout< "; cin>>Request[j];//输入需要申请的资源 } for(j=0;j if(Request[j]>Need[i][j]) { cout< cout<<"分配不合理,不予分配! "< ch='n'; break; } else{ if(Request[j]>Available[j])//判断申请是否大于当前资源,若大于则 {//出错 cout< cout<<"分配出错,不予分配! "< ch='n'; break; } } } if(ch=='y'){ into; for(o=0;o {Available[o]=Available[o]-Request[o]; Allocation[i][o]=Allocation[i][o]+Request[o]; Need[i][o]=Need[i][o]-Request[o]; }//根据进程需求量变换资源 for(intp=0;p {if(Need[i][p]==0) {sum++; if(sum==N) {for(intu=0;u {Available[u]+=Allocation[i][u]; Allocation[i][u]-=Max[i][u]; Need[i][u]+=Max[i][u]; } } } } showdata();//根据进程需求量显示变换后的资源 safe();//根据进程需求量进行银行家算法判断 } } intmain()//主函数 {intt=1,i,j,number,m,n,flag; charming; cout<<"*****************银行家算法的设计与实现*****************"< cout< "; cin>>n; N=n; for(i=0;i {cout<<"资源"< "; cin>>ming; name[i]=ming; cout<<"资源的数量: "; cin>>number; Available[i]=number;} cout< cout<<"请输入作业的数量: "; cin>>m; M=m; cout< "< for(i=0;i for(j=0;j cin>>Max[i][j]; do{flag=0; cout<<"请输入各进程已经申请的资源量("< "< for(i=0;i for(j=0;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 (1){ if(t==1){ cout< share(); t=0;} elsebreak; cout< (按1键继续,按其它任意键退出): "; cin>>t; cout< } return1; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 银行家 算法 报告 代码
![提示](https://static.bingdoc.com/images/bang_tan.gif)