版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
银行家算法实验一、实验条件:计算机一台,软件vc++6.0二、实验原理:n个并发进程共享m个系统资源的系统,进程可动态申请资源和释放资源。系统按各进程的申请动态的分配资源,先对用户提出的请求进行合法性检查,再进行预分配,利用安全性检测算法进行安全性检测,如果系统分配资源,系统进入安全状态,则预分配就是正式分配,如果系统分配资源,系统进入不安全状态,则撤销预分配。三、实验内容#include<stdio.h>#include<stdlib.h>intM=3,N=5;//M为资源数量N为进程数量intavailable[3];//预分配前各类资源可用数量intmax[5][3];//各进程需要各资源最大数量intallocation[5][3];//各进程已分配各类资源的数量intneed[5][3];//各进程需要各类资源的数量intrequest[3];//进程对某一类资源的请求intwork[3];//预分配后各类资源可用数量intfinish[5];//进程结束标志数组。0表示分配失败,资源不足以满足需求量;1表示分配成功,资源满足需求量intsafe()//预分配后安全性检测{ inti=0; intj=0; intk=0; intflag1=0;//所有进程安全结束;0表示安全可以安全结束,1表示不可以安全结束 intflag2=0;//某进程对资源的需求量与可利用量的大小标志;0表示需求小于可利用,1表示需求大于可利用 for(i=0;i<N;i++) { finish[i]=0;//各进程结束标志初始化为0。 } for(i=0;i<M;i++) { work[i]=available[i];//预分配后各资源可利用量赋值给work[]数组 } while(j<N) { for(i=0;i<N;i++) { if(!finish[i])//i进程尚未分配 { flag2=0; for(k=0;k<M;k++) { if(need[i][k]>work[k])//需求大于可利用 { flag2=1; break; } } if(flag2==0) { work[0]=work[0]+allocation[i][0];//收回已分配的资源 work[1]=work[1]+allocation[i][1];//收回已分配的资源 work[2]=work[2]+allocation[i][2];//收回已分配的资源 finish[i]=1; } } } j++; } for(i=0;i<5;i++) { if(finish[i]==0) { flag1=1;//判断各进程是否能够安全结束标志,1表示不能安全结束 break; } } if(flag1==0) return0;//预分配安全 else return1;//预分配不安全}intdiaodu(){ intname; intr=0;// inti=0; intj=0; printf("请输入是几号进程申请资源\n"); scanf("%d",&name); getchar(); for(i=0;i<M;i++) { printf("请输入进程%d申请%i资源的个数\n",name,i); scanf("%d",&request[i]); getchar(); while(need[name][i]<request[i]) { printf("不允许索取大于需求量,请重新输入\n"); scanf("%d",&request[i]); } if(available[i]<request[i]) { printf("检查用户的请求大于系统中的可利用资源数量,进程%d先等待。。。\n",name); r=1; break; } } if(r==0) { //进行资源的预分配 for(i=0;i<M;i++) { available[i]=available[i]-request[i]; allocation[name][i]=allocation[name][i]+request[i]; need[name][i]=need[name][i]-request[i]; } return1;//预分配成功 } else return0;//预分配失败 }voidmain(){ inti=0,j=0; intk=0; intr=0; intq=1;//继续分配标志。0表示不继续分配1表示继续分配 intname=0;//申请资源进程的名字 printf("请输入最大需求矩阵\n"); for(i=0;i<N;i++) { // printf("请输入进程%d的各资源最大需要的数量\n",i); for(j=0;j<M;j++) { scanf("%d",&max[i][j]); getchar(); } } printf("请输入各进程已分配的矩阵\n"); for(i=0;i<N;i++) { //printf("请输入进程%d的各资源已分配的数量\n",i); for(j=0;j<M;j++) { scanf("%d",&allocation[i][j]); getchar(); } } printf("请输入各进程还需要各资源所需数量的矩阵\n"); for(i=0;i<N;i++) { // printf("请输入进程%d还需要各资源的数量\n",i); for(j=0;j<M;j++) { scanf("%d",&need[i][j]); getchar(); } }printf("请输入各资源可利用的数量\n"); for(i=0;i<M;i++) { scanf("%d",&available[i]); getchar(); } // //调度并检测安全性 // do { intr=diaodu(); switch(r) { case1: k=safe(); if(k==0)//预分配安全 { printf("分配成功!!!结果如下"); printf("各进程已分配的矩阵\n"); for(i=0;i<N;i++) { for(j=0;j<M;j++) { printf("%d,",allocation[i][j]);//打印输出各进程已分配的矩阵 } printf("\n"); } printf("各进程还需要各资源的矩阵\n"); for(i=0;i<N;i++) { for(j=0;j<M;j++) { printf("%d,",need[i][j]);//打印输出各进程还需要各资源的矩阵 } printf("\n"); } printf("各资源可利用的数量\n"); for(i=0;i<M;i++) { printf("%d,",available[i]);//打印输出各资源可利用的数量 } printf("\n"); } else//预分配不安全 { printf("调度失败!!!"); for(i=0;i<M;i++) { //撤销预分配的资源 available[i]=available[i]+request[i]; allocation[name][i]=allocation[name][i]-request[i]; need[name][i]=need[name][i]+request[i]; } } break; case0: break; } printf("是否继续,输入0否,输入1继续\n"); scanf("%d",&q); }while(q==1);}四、原始数据纪录:输入数据:最大需求矩阵:已分配的矩阵还需求的矩阵可利用的数量进程0:7,5,30,1,07,4,33,3,2进程1:3,2,22,0,01,2,2进程2:9,0,23,0,26,0,0进程3:2,2,22,1,10,1,1进程4:4,3,30,0,24,3,1T0时刻:0号进程申请:1,0,2T1时刻:1号进程申请:3,3,0T2时刻:3号进程申请:0,1,0输出数据:五:结论如图所示,实际输出数据与预期的输出相同。通过本次上机实验熟悉了银行家算法,深入了解了计算机利用银行家算法避免死锁的机制。有利于以后更好的理解操作系统内部各个机制功能的实现。附录:用C语言实现提示算法用到的主要数据结构(1)可利用资源向量intAvailable[M]//M为资源的类型(2)最大需求矩阵intMax[N][M]//N为进程的数量(3)已分配矩阵intAllocation[N][M](4)还需求矩阵intNeed[N][M](5)申请各类资源数量intRequest[x];//进程对某一类资源的请求(6)工作向量intWork[x];(7)进程结束标识数组intFinish[y];//表示系统是否有足够的资源分配给进程y,0为否,1为是银行家算法(主程序)(1)系统初始化。输入进程数量,资源种类,各进程已分配、还需求各资源数量,各资源可用数量等。(2)输入用户的请求三元组(i,j,k),为进程i申请k个j类资源。(3)检查用户的请求是否小于还需求的数量,条件是k<=Need[i,j]。如果条件不符则提示重新输入,即不允许索取大于需求量。(4)检查用户的请求是否小于系统中的可利用资源数量,条件是k<=Available[i,j]。如果条件不符则申请失败,阻塞该进程,重新进行进程动态资源申请。(5)进行资源的预分配,语句如下:Available=Available[i][j]-k;Allocation[i][j]=Allocation[i][j]+k;Need[i][j]=Need[i][j]-k;(6)系统调用安全性检查算法(safe函数)进行检查,如果检查通过,则不用回收,否则进行回收,进程资源申请失败进入等待。安全性检查算法(safe子函数)(1)设置两个临时数组变量。intFinish[N],记录进程模拟执行的结束状态,初值为0,如果可以模拟执行结束,则可设为1,也可设为其它非零值以表示执行的先后次
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年教师招聘考试综合素质试题试卷小学语文篇
- 2026年计算机技术与软件专业技术资格(水平)考试高级数据库设计专项训练试卷
- 2026年考证指南护士执业资格考试题库试题及答案
- 2026年房地产经纪人客户关系管理专项训练(附答案)
- 2025~2026学年广东揭阳市惠来县统编版七年级历史下学期教学质量自查试卷
- 2026全面防疫试题及答案展示
- 2025届贡山独龙族怒族自治县四年级数学下学期期中模拟试题含解析
- 重磅!中国拼豆行业发展前景及市场空间预测报告(智研咨询)
- 2025届西藏昌都地区八宿县数学三下期末教学质量检测模拟试题含答案
- 一网打尽网上导论试题与答案
- 2026年慢阻肺基层健康管理培训考核试题及答案
- 2026年ICA对外汉语教师资格证考试笔试试题及答案
- 2026年版关于用好乡镇(街道)履行职责事项清单的具体措施课件
- 消防安全四懂四会知识培训
- 幼儿园德育工作指南(2025版)
- 2025年成都市第八人民医院招聘真题
- 2026年税务系统青年才俊选拔综合测试卷(4月)
- 2026年反兴奋剂知识自测题库及答案详解1套
- 2026年校园传染病科学预防与健康守护指南
- 绵阳育才中学小升初入学分班考试英语考试试题及答案
- 职业病防治法规与工作场所风险评估
评论
0/150
提交评论