银行家算法课程设计.docx
- 文档编号:24060312
- 上传时间:2023-05-23
- 格式:DOCX
- 页数:18
- 大小:121.28KB
银行家算法课程设计.docx
《银行家算法课程设计.docx》由会员分享,可在线阅读,更多相关《银行家算法课程设计.docx(18页珍藏版)》请在冰豆网上搜索。
银行家算法课程设计
课程设计报告
操作系统原理
———银行家算法
专业
软件工程
学生姓名
陈鹏
班级
3班
学号
0810321306
指导教师
万方
完成日期
2011.06.24
银行家算法
一、银行家算法原理
银行家算法是一种最有代表性的避免死锁的算法。
要解释银行家算法,必须先解释操作系统安全状态和不安全状态。
安全状态:
如果存在一个由系统中所有进程构成的安全序列P1,…,Pn,则系统处于安全状态。
安全状态一定是没有死锁发生。
不安全状态:
不存在一个安全序列。
不安全状态不一定导致死锁。
那么什么是安全序列呢?
安全序列:
一个进程序列{P1,…,Pn}是安全的,如果对于每一个进程Pi(1≤i≤n),它以后尚需要的资源量不超过系统当前剩余资源量与所有进程Pj(j
操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。
当进程在执行中继续申请资源时,先测试该进程已占用的资源数与本次申请的资源数之和是否超过了该进程对资源的最大需求量。
若超过则拒绝分配资源,若没有超过则再测试系统现存的资源能否满足该进程尚需的最大资源量,若能满足则按当前的申请量分配资源,否则也要推迟分配。
在避免死锁的方法中,所施加的限制条件较弱,有可能获得令人满意的系统性能。
在该方法中把系统的状态分为安全状态和不安全状态,只要能使系统始终都处于安全状态,便可以避免发生死锁。
银行家算法的基本思想是分配资源之前,判断系统是否是安全的;若是,才分配。
它是最具有代表性的避免死锁的算法。
二、算法的数据结构
(1)可利用资源向量Available
是个含有m个元素的数组,其中的每一个元素代表一类可利用的资源数目。
如果Available[j]=K,则表示系统中现有Rj类资源K个。
(2)最大需求矩阵Max
这是一个n×m的矩阵,它定义了系统中n个进程中的每一个进程对m类资源的最大需求。
如果Max[i,j]=K,则表示进程i需要Rj类资源的最大数目为K。
(3)分配矩阵Allocation
这也是一个n×m的矩阵,它定义了系统中每一类资源当前已分配给每一进程的资源数。
如果Allocation[i,j]=K,则表示进程i当前已分得Rj类资源的数目为K。
(4)需求矩阵Need
这也是一个n×m的矩阵,用以表示每一个进程尚需的各类资源数。
如果Need[i,j]=K,则表示进程i还需要Rj类资源K个,方能完成其任务。
其中Need[i,j]=Max[i,j]-Allocation[i,j]
三、程序流程图
四、程序代码
#include
usingnamespacestd;
#include
#include
#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]:
"< for(i=0;i cout< for(j=0;j cout< cout< cout<<"MaxAllocationNeed"< cout<<"进程名"; for(j=0;j<3;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< cout< } } 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}; intj; intflag=0; Work[0]=Avaliable[0]; Work[1]=Avaliable[1]; Work[2]=Avaliable[2]; for(i=0;i { apply=0; for(j=0;j { if(Finish[i]==False&&Need[i][j]<=Work[j]) { apply++; if(apply==N) { for(m=0;m Work[m]=Work[m]+Allocation[i][m];//变分配数 Finish[i]=True; temp[k]=i;i=-1; k++;flag++; } } } } for(i=0;i { if(Finish[i]==False) { cout<<"系统不安全"< return-1; } } cout<<"系统是安全的! "< cout<<"分配的序列: "; for(i=0;i { //输出运行进程数组 cout< if(i cout<<"->"; } cout< return0; } voidshare()//利用银行家算法对申请资源对进行判定 { charch; inti=0,j=0; ch='y'; cout<<"请输入要求分配的资源进程号(0-"< "; 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]>Avaliable[j])//判断申请是否大于当前资源,若大于则 { //出错 cout<<"进程"< cout<<"分配出错,不予分配! "< ch='n'; break; } } } if(ch=='y') { changdata(i);//根据进程需求量变换资源 showdata();//根据进程需求量显示变换后的资源 safe();//根据进程需求量进行银行家算法判断 } } voidaddresources() {//添加资源 intn,flag; cout<<"请输入需要添加资源种类的数量: "; cin>>n; flag=N; N=N+n; for(inti=0;i { cout<<"名称: "; cin>>name[flag]; cout<<"数量: "; cin>>Avaliable[flag++]; } showdata(); safe(); } voiddelresources() {//删除资源 charming; inti,flag=1; cout<<"请输入需要删除的资源名称: "; do{ cin>>ming; for(i=0;i if(ming==name[i]) { flag=0; break; } if(i==N) cout<<"该资源名称不存在,请重新输入: "; } while(flag); for(intj=i;j { name[j]=name[j+1]; Avaliable[j]=Avaliable[j+1]; } N=N-1; showdata(); safe(); } voidaddprocess() {//添加作业 intflag=M; M=M+1; cout<<"请输入该作业的最打需求量[Max]"< for(inti=0;i { cout< "; cin>>Max[flag][i]; Need[flag][i]=Max[flag][i]-Allocation[flag][i]; } showdata(); safe(); } intmain()//主函数 { inti,j,number,choice,m,n,flag; charming; cout<<"*****************资源管理系统的设计与实现*****************"< cout<<"请首先输入系统可供资源种类的数量: "; cin>>n; N=n; for(i=0;i { cout<<"资源"< "; cin>>ming; name[i]=ming; cout<<"资源的数量: "; cin>>number; Avaliable[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(true) { cout<<"**************银行家算法演示***************"< cout<<"1: 增加资源"< cout<<"2: 删除资源"< cout<<"3: 分配资源"< cout<<"4: 增加作业"< cout<<"*******************************************"< cout<<"请选择功能号: "; cin>>choice; switch(choice) { case1: addresources();break; case2: delresources();break; case3: share();break; case4: addprocess();break; default: cout<<"请正确选择功能号(0-5)! "< } } return1; } 五、运行结果 六、设计体会 经过几天的自己动手练习,对操作系统的掌握又进了一步,收获了很多课堂上和书上未出现过的或老师未讲到的一些知识。 在完成实验的过程中,进行了反复的修改和调试,这次实验,让我基本上明白了银行家算法的基本原理,加深了对课堂上知识的理解,也懂得了如何让银行家算法实现,但编程功底的原因使程序很是繁琐。 这次的设计数据是通过一道实际的题目来体现银行家算法避免死锁的问题,先用银行家算法给其中一个进程分配资源,看它所请求的资源是否大于它的需求量,才和系统所能给的资源相比较.让进程形成一个安全队列,看系统是否安全.再利用安全性算法检查此时系统是否安全。 要做一个课程设计,如果知识面只是停留在书本上,是不可能把课程设计完全地做好。 用VC++6.0编程,感觉自己有点力不从心,很多C语言的知识都忘了,只好翻出以前的C语言课本和数据结构来复习。 每次的课程设计中都能将以前的知识顺便再复习一遍,课程设计是给了我们一个机会去动手和主动复习,同时也是提醒我们应该注重平时的积累。 从课程设计以后还是要多多的动手,在实践中体会理论知识,这样才不会在要做实验和设计时,觉得无从下手。 银行家算法是操作系统中避免死锁的典型算法。 我设计的这个程序中包含了三大块,利用数据结构初始化,银行家算法,安全性算法。 在初始化这一块,程序需要用到可利用资源向量Available[j]、最大需求矩阵Max[i.j]、分配矩阵Allocation[i,j]、需求矩阵Need[i,j]。 它们之间有着一定的联系,Need[i,j]=Max[I,j]-Allocation[i,j],请求资源时需要用到银行家算法,检查资源的分配需要用到安全性算法。 在将三大块结合起来就能很好的避免死锁的发生了。 通过这次的实验,我更进一步的了解了银行家算法,并对数据结构的用法理解的更透彻了,在实验的过程中我深刻的体会到了合作的意义,我遇到了一些困难,通过对书上所学的知识反复的思考与理解和与同学之间的相互讨论,最终将银行家算法真正的理解,并且将它用C++实现。 在以后的学习当中我会更加努力的将这一门课程学好。 这次课程设计时间上虽说仓促点,但是我依然学到了很多的实用性知识。 除了更深的了解这个算法,而且对C语言进行了复习,而且其过程中有很多的知识点都不记得了。 七、参考文献 [1]庞丽萍.《操作系统原理》[M].武汉: 华中科技大学出版社,2008 [2]杨树青,王欢.《Linux环境下C编程指南》[M].北京: 清华大学出版社,2007 [3]陈维兴,林小茶.《C++面对对象程序设计教程》[M].北京: 清华大学出版社,2004 [4]杨路明.《C语言程序设计教程》[M].北京: 北京邮电大学出版社,2005
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 银行家 算法 课程设计