![2023年操作系统实验报告死锁的避免_第1页](http://file4.renrendoc.com/view/3c78d58adbbe65114c1f7ad7d51cba34/3c78d58adbbe65114c1f7ad7d51cba341.gif)
![2023年操作系统实验报告死锁的避免_第2页](http://file4.renrendoc.com/view/3c78d58adbbe65114c1f7ad7d51cba34/3c78d58adbbe65114c1f7ad7d51cba342.gif)
![2023年操作系统实验报告死锁的避免_第3页](http://file4.renrendoc.com/view/3c78d58adbbe65114c1f7ad7d51cba34/3c78d58adbbe65114c1f7ad7d51cba343.gif)
![2023年操作系统实验报告死锁的避免_第4页](http://file4.renrendoc.com/view/3c78d58adbbe65114c1f7ad7d51cba34/3c78d58adbbe65114c1f7ad7d51cba344.gif)
![2023年操作系统实验报告死锁的避免_第5页](http://file4.renrendoc.com/view/3c78d58adbbe65114c1f7ad7d51cba34/3c78d58adbbe65114c1f7ad7d51cba345.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
操作系统实验(二)死锁的避免1.实验内容使用C++实现模拟随机算法和银行家算法2.实验目的(1)了解死锁的产生因素(随机算法)(2)理解死锁的解决办法(银行家算法)3.实验题目使用随机算法和银行家算法设计程序4.程序流程图重要过程流程图银行家算法流程图安全性算法流程图5.程序代码和运营结果#include<stdio.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=0,j=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].A,&Allocation[i].B,&Allocation[i].C);}//需求矩阵printf("输入需求矩阵%dx%d\n",PNUMBER,PNUMBER);for(i=0;i<PNUMBER;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("发现配置文献,开始导入..\n");//可分派资源fscanf(fp1,"%d%d%d",&Available.A,&Available.B,&Available.C);//最大需求矩阵MAXfor(i=0;i<PNUMBER;i++){fscanf(fp1,"%d%d%d",&Max[i].A,&Max[i].B,&Max[i].C);}//已分派矩阵Allocfor(i=0;i<PNUMBER;i++){fscanf(fp1,"%d%d%d",&Allocation[i].A,&Allocation[i].B,&Allocation[i].C);}//需求矩阵for(i=0;i<PNUMBER;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.A; Work.B=Available.B;ﻩWork.C=Available.C;boolFinish[PNUMBER]={false,false,false};inti;intj=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){//request向量需小于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){//试探分派ProbeAlloc(process,res);//假如安全检查成立,则请求成功,否则将分派回滚并返回失败if(SafeCheck()){returntrue;}else{printf("安全性检查失败。因素:系统将进入不安全状态,有也许引起死锁。\n");printf("正在回滚...\n");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[0].A,Max[0].B,Max[0].C,Allocation[0].A,Allocation[0].B,Allocation[0].C,Need[0].A,Need[0].B,Need[0].C,Available.A,Available.B,Available.C);printf("P1%2d%2d%2d%2d%2d%2d%2d%2d%2d\n",Max[1].A,Max[1].B,Max[1].C,Allocation[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,Allocation[2].A,Allocation[2].B,Allocation[2].C,Need[2].A,Need[2].B,Need[2].C);printf("===============================================================================\n");}//银行家算法分派voidbanker(){charch;//判断输入的是否是安全状态PrintTable();printf("先检查初始状态是否安全。\n");if(SafeCheck()){printf("系统处在安全状态。\n");printf("安全序列是{P%d,P%d,P%d}。\n",safe[0],safe[1],safe[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(process<3&&process>=0){if(request(process,&res)){printf("分派成功。\n");PrintTable();printf("安全序列是{P%d,P%d,P%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'||ch=='y');printf("执行完毕。\n");}//随机分派算法执行boolRandRequest(intprocess,RES*res){//request向量需小于Available向量if(res->A<=Available.A&&res->B<=Available.B&&res->C<=Available.C){//试探分派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[process].A;Available.B+=Allocation[process].B;Available.C+=Allocation[process].C;Allocation[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(SafeCheck()){printf("系统处在安全状态。\n");printf("安全序列是{P%d,P%d,P%d}。\n",safe[0],safe[1],safe[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'||ch=='y');printf("执行完毕。\n");}intmain(){intx;while(1){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.退出系统\n");printf("===============================================================================\n");printf("您输入的是:");scanf("%d",&x);f
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 三农产品网络营销作业指导书
- 2025年怀化考从业资格证货运试题
- 小学二年级数学上册口算题
- 2025年武威货运上岗证模拟考试试题
- 2025年楚雄驾校考试货运从业资格证模拟考试
- 电力调试合同(2篇)
- 电动车补充协议书范文(2篇)
- 2024-2025学年高中语文课时作业4毛泽东词两首含解析粤教版必修2
- 六年级班主任第二学期工作总结
- 小学班主任工作计划二年级
- 绵阳市高中2022级(2025届)高三第一次诊断性考试(一诊)数学试卷(含答案逐题解析)
- 小学英语800词分类(默写用)
- 真实世界研究指南 2018
- JBT 7946.3-2017 铸造铝合金金相 第3部分:铸造铝合金针孔
- 2024年燃气轮机值班员技能鉴定理论知识考试题库-上(单选题)
- 义务教育“双减”作业设计初中生物作业设计案例共三篇
- 2024-2030年中国车载冰箱行业市场发展调研及投资战略分析报告
- 第16讲 电气绝缘节工作原理讲解
- 《行政伦理学教程(第四版)》课件 第3、4章 行政理性与行政价值、行政伦理规范
- (正式版)SHT 3046-2024 石油化工立式圆筒形钢制焊接储罐设计规范
- 2024-2029年中国电力工程监理行业市场现状分析及竞争格局与投资发展研究报告
评论
0/150
提交评论