实验二3银行家算法汇总.docx
- 文档编号:24288257
- 上传时间:2023-05-26
- 格式:DOCX
- 页数:17
- 大小:121.07KB
实验二3银行家算法汇总.docx
《实验二3银行家算法汇总.docx》由会员分享,可在线阅读,更多相关《实验二3银行家算法汇总.docx(17页珍藏版)》请在冰豆网上搜索。
实验二3银行家算法汇总
实验二(3)银行家算法
一、实验目的
1)掌握死锁的产生的原因、产生死锁的必要条件和处理死锁的基本方法。
2)了解多道程序系统中,多个进程并发执行的资源分配。
3)掌握预防死锁的方法,系统安全状态的基本概念
4)掌握银行家算法,了解资源在进程并发执行中的资源分配策略。
二、实验内容
设计一个n个并发进程共享m个系统资源的系统。
进程课动态申请资源和释放资源,系统按照进程的申请动态的分配资源。
用银行家算法设计实现。
三、实验原理
我们可以把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。
为保证资金的安全,银行家规定:
(1)当一个顾客对资金的最大需求量不超过银行家现有的资金时就可接纳该顾客;
(2)顾客可以分歧贷款,但贷款的总数不能超过最大需求量;
(3)当银行家现有的资金不能满足顾客尚需的贷款数额时,对顾客的贷款可推迟支付,但总能使顾客在有限的时间里得到贷款;
(4)当顾客得到所需的全部资金后,一定能在有限的时间里归还所有的资金.
操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。
当进程在执行中继续申请资源时,先测试该进程已占用的资源数与本次申请的资源数之和是否超过了该进程对资源的最大需求量。
若超过则拒绝分配资源,若没有超过则再测试系统现存的资源能否满足该进程尚需的最大资源量,若能满足则按当前的申请量分配资源,否则也要推迟分配。
四、算法实现
(1)初始化这组进程的最大资源请求和依次申请的资源序列。
把各进程已占用和需求资源情况记录在进程控制块中。
假定进程控制块的内容包括:
进程名,状态,当前申请量,资源需求总量,已占资源量,能执行完标志。
其中,进程的状态有:
就绪、等待和完成。
当系统不能满足进程的资源请求时,进程处于等待态。
资源需求总量表示进程运行过程中对资源的总的需求量。
已占资源量表示进程目前已经得到但还未归还的资源量。
因此,进程在以后还需要的剩余资源量等于资源需要总量减去已占资源量。
显然每个进程的资源需求总量不应超过系统拥有的资源总量。
(2)银行家算法分配资源的原则是:
当某个进程提出资源请求时,假定先分配资源给它,然后查找各进程的剩余请求,检查系统的剩余资源量是否由于进程的分配而导致系统死锁。
若能,则让进程等待,否则,让进程的假分配变为真分配。
a)查找各进程的剩余请求,检查系统的剩余资源量是否能满足其中一进程。
如果能,则转b)。
b)将资源分配给所选的进程,这样,该进程已获得资源最大请求,最终能运行完成。
标记这个进程为终止进程,并将其占有的全部资源归还给系统。
重复第a)步和第b)步,直到所有进程都标记为终止进程,或直到一个死锁发生。
若所有进程都标记为终止进程,则系统的初始状态是安全的,否则为不安全的。
若安全,则正式将资源分配给它,否则,假定的分配作废,让其等待。
数据结构:
#defineMAXPROCESS50/*最大进程数*/
#defineMAXRESOURCE100/*最大资源数*/
intAVAILABLE[MAXRESOURCE];/*可用资源数组*/
intMAX[MAXPROCESS][MAXRESOURCE];/*最大需求矩阵*/
intALLOCATION[MAXPROCESS][MAXRESOURCE];/*分配矩阵*/
intNEED[MAXPROCESS][MAXRESOURCE];/*需求矩阵*/
intREQUEST[MAXPROCESS][MAXRESOURCE];/*进程需要资源数*/
boolFINISH[MAXPROCESS];/*系统是否有足够的资源分配*/
intp[MAXPROCESS];/*记录序列*/
intWork[MAXRESOURCE];/*工作数组*/
intm,n;/*m个进程,n个资源*/
stringshowdata1[4]={"max","allo","need","aval"};/*绘制资源以及进程状态时使用*/
stringshowdata2[5]={"work","need","allo","w+al","finish"};/*绘制银行家算法过程时使用*/
五、流程图
1:
主函数流程图:
2:
初始化流程图
3:
安全性检测流程图
4:
银行家算法流程图
六、源程序
#include
#include
#include
usingnamespacestd;
#defineMAXPROCESS50/*最大进程数*/
#defineMAXRESOURCE100/*最大资源数*/
intAVAILABLE[MAXRESOURCE];/*可用资源数组*/
intMAX[MAXPROCESS][MAXRESOURCE];/*最大需求矩阵*/
intALLOCATION[MAXPROCESS][MAXRESOURCE];/*分配矩阵*/
intNEED[MAXPROCESS][MAXRESOURCE];/*需求矩阵*/
intREQUEST[MAXPROCESS][MAXRESOURCE];/*进程需要资源数*/
boolFINISH[MAXPROCESS];/*系统是否有足够的资源分配*/
intp[MAXPROCESS];/*记录序列*/
intWork[MAXRESOURCE];/*工作数组*/
intm,n;/*m个进程,n个资源*/
stringshowdata1[4]={"max","allo","need","aval"};/*输出表格用标题*/
stringshowdata2[5]={"work","need","allo","w+al","finish"};/*输出表格用标题*/
voidiShow()
{
intsize,size2;
cout<<"系统";
for(intk=0;k<4;k++)
{
size=showdata1[k].length();
size2=(n*3+5-size)/2;/*计算出字符前端的空格*/
cout< } cout< cout<<"资源"; for(k=0;k<4;k++) { charsourcename='A';/*资源命名,从A开始*/ cout<<""; for(intkk=0;kk { cout<<""< sourcename++; } cout<<""; } cout< for(intii=0;ii { cout<<"P"< for(intjj=0;jj cout< cout<<""; for(jj=0;jj cout< cout<<""; for(jj=0;jj cout< cout<<""; if(ii==0) { for(intiii=0;iii cout< } cout<<""< } } voidfShow()/*显示表格*/ { cout<<"系统"; for(intk=0;k<5;k++) { intsize=showdata2[k].length(); intsize2=(n*3+5-size)/2; cout< } cout< cout<<"资源"; for(k=0;k<4;k++) { charsourcename='A'; cout<<""; for(intkk=0;kk { cout< sourcename++; } cout<<""; } cout< } voidInit()/*初始化算法*/ { inti,j; cout<<"请输入进程的数目: "; cin>>m; cout<<"请输入资源的种类: "; cin>>n; cout<<"请输入每个进程最多所需的各资源数,按照"< for(i=0;i for(j=0;j cin>>MAX[i][j]; cout<<"请输入每个进程已分配的各资源数,也按照"< for(i=0;i { for(j=0;j { cin>>ALLOCATION[i][j]; NEED[i][j]=MAX[i][j]-ALLOCATION[i][j]; if(NEED[i][j]<0) { cout<<"您输入的第"< "< j--; continue; } } } cout<<"请输入各个资源现有的数目: "< for(i=0;i { cin>>AVAILABLE[i]; } iShow(); } boolSafe()/*安全性算法*/ { fShow(); inti,j,k,l=0; for(i=0;i Work[i]=AVAILABLE[i]; for(i=0;i { FINISH[i]=false; } for(i=0;i { if(FINISH[i]==true) { continue; } else { for(j=0;j { if(NEED[i][j]>Work[j]) { break; } } if(j==n) { FINISH[i]=true; cout<<"P"< for(k=0;k cout< cout<<""; for(k=0;k cout< cout<<""; for(k=0;k cout< cout<<""; for(k=0;k cout< cout<<""; cout< for(k=0;k { Work[k]+=ALLOCATION[i][k]; } p[l++]=i; i=-1;/*再次由进程从小到大遍历*/ } else { continue; } } if(l==m)/*进程记录p的数量等于资源总量,全部进程均已经满足*/ { cout<<"系统是安全的"< cout<<"安全序列: "< for(i=0;i { cout< if(i! =l-1) { cout<<"-->"; } } cout<<""< returntrue; } } cout<<"\n无法继续找到可满足的进程! "< cout<<"系统是不安全的"< returnfalse; } voidBank()/*银行家算法*/ { inti,cusneed;/*cusneed为进程*/ charagain; while (1) { cout<<"请输入要申请资源的进程号(注: 第个进程号为,依次类推): P"; cin>>cusneed; cout<<"\n请输入进程所请求的各资源的数量"< for(i=0;i { cin>>REQUEST[cusneed][i]; } for(i=0;i { if(REQUEST[cusneed][i]>NEED[cusneed][i]) { cout<<"您输入的请求数超过进程的需求量! 请重新输入! "< continue; } if(REQUEST[cusneed][i]>AVAILABLE[i]) { cout<<"您输入的请求数超过系统有的资源数! 请重新输入! "< continue; } } for(i=0;i { AVAILABLE[i]-=REQUEST[cusneed][i]; ALLOCATION[cusneed][i]+=REQUEST[cusneed][i]; NEED[cusneed][i]-=REQUEST[cusneed][i]; } if(Safe()) { cout<<"同意分配请求! "< } else { cout<<"您的请求被拒绝! "< for(i=0;i { AVAILABLE[i]+=REQUEST[cusneed][i]; ALLOCATION[cusneed][i]-=REQUEST[cusneed][i]; NEED[cusneed][i]+=REQUEST[cusneed][i]; } } for(i=0;i { FINISH[i]=false; } cout<<"您还想再次请求分配吗? 是请按y/Y,否请按其它键"< cin>>again; if(again=='y'||again=='Y') { continue; } break; } } voidmain() { while(true) { Init(); if(Safe())break;/*如果初始化安全,跳出while循环*/ cout<<"当前系统不安全,请重新初始化系统"; } Bank(); } 七、实验结果及分析 八、心得体会 七、运行示例及结果分析 结果分析: 八、心得体会
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 银行家 算法 汇总