




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
操作系统实验报告-死锁的避免操作系统实验(二)死锁的避免1•实验内容使用C++实现模拟随机算法和银行家算法2•实验目的(1)了解死锁的产生原因(随机算法)(2)理解死锁的解决办法(银行家算法)3•实验题目使用随机算法和银行家算法设计程序4•程序流程图主要过程流程图银行家算法流程图安全性算法流程图5•程序代码和运行结果#includevstdio・h>#include<stdlib.h>typedefstruct{intA;intB;intC;}RES;#definefalse0#definetrue1〃系统中所有进程数量#definePNUMBER3//最大需求矩阵RESMax[PNUMBER];〃已分配资源数矩阵RESAllocation[PNUMBER];〃需求矩阵RESNeed[PNUMBER];//可用资源向量RESAvailable={0,0,0};〃安全序列intsafe[PNUMBER];voidsetConfig(){inti=0j=0;printf("================开始手动配置资==================\n");//可分配资源printf("输入可分配资源\n");scanf("%d%d%d",&Available.A,&Available.B,&Available.C);〃最大需求矩阵MAXprintf("输入最大需求矩阵%dx%d\n",PNUMBER,PNUMBER);for(i=0;i<PNUMBER;i++){scanf("%d%d%d",&Max[i]・A,&Max[i]・B,&Max[i]・C);}〃已分配矩阵Allocprintf("输入已分配矩阵%dx%d\n",PNUMBER,PNUMBER);for(i=0;i<PNUMBER;i++){scanf("%d%d%d",&Allocation[i].A9&Allocation[i].B9&Allocation[i]・C);}〃需求矩阵printf("输入需求矩阵%dx%d\n"fNUMBERfNUMBER);for(i=O;ivPNUMBER;i++){scanf("%d%d%d",&Need[i]・A,&Need[i]・B,&Need[i]・C);}printf("============结束配置资源==================\n");}voidloadConfig(){FILE*fp1;if((fp1=fOpen("config.txt","r"))==NULL){printf("没有发现配置文件,请手动输入\n");setConfig();}else{inti=0;printf("发现配置文件,开始导入.An");//可分配资源fscanf(fp1,"%d%d%d",&Available・A,&Available・B,&Available・C);〃最大需求矩阵MAXfor(i=0;ivPNUMBER;i++){fscanf(fp1,"%d%d%d",&Max[i]・A,&Max[i]・B,&Max[i]・C);}〃已分配矩阵Allocfor(i=0;ivPNUMBER;i++){fscanf(fp1,"%d%d%d",&Allocation[i]・A,&Allocation[i]・B,&Allocation[i]・C);}〃需求矩阵for(i=0;ivPNUMBER;i++){fscanf(fp1,"%d%d%d",&Need[i]・A,&Need[i]・B,&Need[i]・C);〃试探分配voidProbeAlloc(intprocess,RES*res){Available.A-=res->A;Available.B-=res->B;Available.C-=res->C;Allocation[process].A+=res->A;Allocation[process].B+=res->B;Allocation[process].C+=res->C;Need[process].A-=res->A;Need[process].B-=res->B;Need[process].C-=res->C;}//若试探分配后进入不安全状态,将分配回滚voidRollBack(intprocess,RES*res){Available.A+=res->A;Available.B+=res->B;Available.C+=res->C;Allocation[process].A-=res->A;Allocation[process].B-=res->B;Allocation[process].C-=res->C;Need[process].A+=res->A;Need[process].B+=res->B;Need[process].C+=res->C;}〃安全性检査boolSafeCheck(){RESWork;
Work.A=Available";Work.B=Available.B;Work.C=Available.C;boolintintFinish[PNUMBER]={false,false,false};•i;j=0;for(i=0;i<PNUMBER;i++){/是否已检查过if(Finish[i]==false){/是否有足够的资源分配给该进程if(Need[i].A=Work.A&&Need[i].B<=Work.B&&Need[i]・C<=Work.C){/有则使其执行完成,并将已分配给该进程的资源全部回收Work.A+=Allocation[i].A;Work.B+=Allocation[i].B;Work.C+=Allocation[i].C;Finish[i]=true;safe[j++]=i;}}i=-1;/重新进行遍历}/如果所有进程的Finish向量都为true则处于安全状态,否则为不安全状态for(i=0;i<PNUMBER;i++){if(Finish[i]==false){returnfalse;}}returntrue;}/资源分配请求boolrequest(intprocess,RES*res){//reques向量需小于Need矩阵中对应的向量if(res->A<=Need[process].A&&res->B<=Need[process].B&&res->C<=Need[process].C){//request向量需小于Available向量if(res->A<=Available.A&&res->B<=Available.B&&res->C<=Available.C){〃试探分配ProbeAiloc(process,res);〃如果安全检查成立,则请求成功,否则将分配回滚并返回失败if(SafeCheck()){returntrue;}else{printf("安全性检查失败。原因:系统将进入不安全状态,有可能引起死锁。\n");printf("正在回滚・・An");RollBack(process,res);}}else{printf("安全性检查失败。原因:请求大于可利用资源。\n");}}else{printf("安全性检查失败。原因:请求大于需求。\n");}returnfalse;}〃输出资源分配表voidPrintTable(){printf("===================================资源分配表==================================\n");printf("ProcessMaxAllocationNeedAvailable\n");printf("ABCABCABCABC\n");printf("P0%2d%2d%2d%2d%2d%2d%2d%2d%2d%2d%2d%2d\n",Max[O].A,Max[0].B,Max[0].QAllocationlOhA,AUocation[0].B,AUocation[0].C,Need[0].A9Need[0].B9Need[0].C9Available.A9Available.B,Available.C);printf("P1%2d%2d%2d%2d%2d%2d%2d%2d%2d\n",Max[1].A,Max[1].B,Max[1].C,AUocation[1].A,Allocation[1].B,Allocation[1]・C,Need[1].A,Need[1].B,Need[1]・C);printf("P2%2d%2d%2d%2d%2d%2d%2d%2d%2d\n",Max[2].A,Max[2].B,Max[2].C,AUocation[2].A,AUocation[2].B,AUocation⑵.CNeed⑵.A,Need⑵.B^Need⑵・C);printf("===============================================================================\n");}〃银行家算法分配voidbanker。{charch;//判断输入的是否是安全状态PrintTable();printf("先检查初始状态是否安全。\n");if(SafeCheck()){printf("系统处于安全状态。\n");printf("安全序列是{P%d,P%df%d}。\n",safe[0],safe[1],safe⑵);}else{printf("系统处于不安全状态。程序将退出・・.\n");printf("执行完毕。\n");getchar();return;}〃开始分配do{intprocess;RESres;printf("请依次输入请求分配的进程和对三类资源的请求数量(进程编号0.1.2.・・)\n");scanf("%d%d%d%d",&process,&res・A,&res・B,&res・C);if(process<3&&process>=0){if(request(process,&res)){printf("分配成功。\n");PrintTable();printf("安全序列是{P%df%dE%d}。\n",safe[0],safe[1],safe[2]);}else{printf("分配失败。\n");}printf("是否继续分配?(Y/N):");getchar();ch=getchar();}else{printf("输入的进程号0〜2\n");ch='y';}}while(ch=='Y'IIch==,y,);printf("执行完毕。\n");}〃随机分配算法执行boolRandRequest(intprocess,RES*res){//request向量需小于Available向量if(res->A<=Available・A&&res->B<=Available・B&&res->C<=Available.®{〃试探分配ProbeAlloc(process,res);//判断进程是否执行完,执行完释放资源if(Max[process].A<=Allocation[process].A&&Max[process].B<=Allocation[process].B&&Max[process].C<=Allocation[process].C)printf("\nP%d执行完毕,释放所分配的资源・・.\n",process);//有则使其执行完成,并将已分配给该进程的资源全部回收Available・A+=Allocation[proeess].A;Available.B+=Allocation[process].B;
Available.C+=Allocation[proeess]・C;AUocation[process].A=0;Allocation[process].B=0;Allocation[process].C=0;Need[process]・A=Max[process].A;Need[process].B=Max[process].B;Need[process].C=Max[process].C;}returntrue;}else{printf("分配失败。原因:请求大于可利用资源。\n");}returnfalse;}〃随机分配voidrandPatch(){charch;〃判断输入的是否是安全状态PrintTable();printf("先检查初始状态是否安全。\n");if(SafeCheckO){printf("系统处于安全状态。\n");printf("安全序列是{P%d,P%djP%d}。\n",safe[0]9safe[1]9safe[2]);}else{printf("系统处于不安全状态。程序将退出・・.\n");printf("执行完毕。\n");getchar();return;}〃开始分配do{intprocess;RESres;printf("请依次输入请求分配的进程和对三类资源的请求数量(进程编号0.1.2.・・)\n");scanf("%d%d%d%d",&process,&res・A,&res・B,&res・C);if(RandRequest(process,&res)){printf("分配成功。\n");PrintTable();if(!SafeCheck()){}printf("系统发生死锁。"getchar();getchar();break;}else{printf("分配失败。\n");}printf("是否继续分配?(Y/N):");getchar();ch=getchar();}while(ch=='Y'IIch=='y');printf("执行完毕。\n");}intmain(){intx;while⑴{printf("=========================\n");printf("\t\t\t共享资源分配与银行家算法\n");printf("===============================================================================\n");printf("\t\t\t按1•导入配置信息\n");printf("\t\t\t按2•银行家算法\n");printf("\t\t\t按3.随机分配算法\n");printf("\t\t\t按0・退出系统5");printf("===============================================================================\n");printf("您输入的是:");scanf("%d",&x);fflush(stdin);system("cls");printf("===============================================================================\n");printf("\t\t\t共享资源分配与银行家算法");if(x==2){printf("\t---银行家算法\n");}elseif(x==3){printf("\t---随机分配算法\n");}printf("==========================================================================\n");switch(x){case1:{//加载配置文件loadConfig();//打印资源分配表PrintTable();printf("信息导入完成・・・・.\n");getchar();};break;case2:banker();break;
case3:randPatch();break;case0:printf(“退出系统・\n\n”);return0;break;default:printf("请输入0~1之间的数字\n");}}return0;}/*Config.txt557533229
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 10 我能坚持 教学设计-2024-2025学年心理健康二年级苏科版
- 年度工作汇报:总结与展望
- 《第一单元 装扮美好生活 2 小小挂件展创意》教学设计-2024-2025学年泰山版信息技术六年级下册
- ICU常用管道的用途和管理课件
- Unit 4 Plants around us Review(教学设计)-2024-2025学年人教PEP版(2024)英语三年级上册
- 7操场上(教学设计)2024-2025学年统编版语文一年级下册
- 2023七年级数学下册 第七章 平面直角坐标系7.2 坐标方法的简单应用7.2.2 用坐标表示平移教学设计 (新版)新人教版
- 科研项目质量管理
- 2013-2014学年八年级《历史与社会》上册第四单元综合探究四《从清明上河图看北宋都市生活》教学设计(2013版)(东湖中学)
- 财务安全主题班会
- 合同顺延确认函
- 中西面点工艺基础知识单选题100道及答案解析
- 《让子弹飞》电影赏析
- 2024年四川省绵阳市中考英语试题卷(标准含答案)
- 2024年重庆高考化学试题卷(含答案解析)
- 西方文论概览(第二版)-第五章课件
- 数列的概念(第一课时)教案高二数学(人教A版2019选择性必修第二册)
- 铲车司机雇佣合同范本
- 【高中生物】100道高考生物必刷题
- 2024年广东省初中学业水平考试中考道法试卷(真题+答案解析)
- 江苏省南京市鼓楼区2023-2024学年五年级下学期期末检测语文试卷
评论
0/150
提交评论