实验6 银行家算法避免死锁.docx
- 文档编号:27181720
- 上传时间:2023-06-27
- 格式:DOCX
- 页数:25
- 大小:19.94KB
实验6 银行家算法避免死锁.docx
《实验6 银行家算法避免死锁.docx》由会员分享,可在线阅读,更多相关《实验6 银行家算法避免死锁.docx(25页珍藏版)》请在冰豆网上搜索。
实验6银行家算法避免死锁
实验六银行家算法避免死锁
一.实验目的
1、加深对死锁概念的理解
2、能够利用银行家算法有效地避免死锁的发生、或检测死锁的存在
二.实验内容及步骤
本实验在winTC环境下实现,winTC安装程序在ftp上,请自行安装。
1.利用银行家算法写一个程序,判定系统的安全性。
已知某系统有5个进程P0,P1,P2,P3,P4,三类资源A、B、C。
死锁检测程序工作时各进程对资源的需求和占用情况如下表,当前可用资源向量available=(0,0,0)。
资源
请求进程
已占有资源Allocation
ABC
尚需资源Need
ABC
P0
0 1 1
0 0 2
P1
200
222
P2
303
000
P3
211
100
P4
002
002
#definem3
#definen5
main(){
inttest(intav[],intned[],all[]);
intavailable[m]={0,0,0},need[n][m];
intallocation[n][m]={{0,1,0},{2,0,0},{3,0,3},{2,1,1},{0,0,2}};//已占有资源
inti,j,g=1;
intfinish[n]={0,0,0,0,0};//已完成的进程
clrscr();//清屏
printf(“pleaseinputtheneedresourcedata\n”);
for(i=0;i for(j=0;j scanf(“%d”,&need[i][j]);//输入各个进程需要的资源 j=0; do{ for(i=0;i if(finish[i]==0&&test(need[i],available,allocation[i])) finish[i]=1; j++; }while(j for(i=0;i g=g&&finish[i];//判断各个进程是否在安全性算法内全部通过 if(g) printf(“safestate”); else printf(“notsafestate”); } 三.实验讨论 谈谈你今天上实验课的收获,存在的问题或疑问。 如果有实验内容以外的发现也可谈谈。 #include #definem3 #definen5 main() { inttest(intav[],intned[],intall[]); intavailable[m]={0,0,0},need[n][m]; intallocation[n][m]={{0,1,0},{2,0,0},{3,0,3},{2,1,1},{0,0,2}}; inti,j,g=1; intfinish[n]={0,0,0,0,0}; //clrscr(); printf("pleaseinputtheneedresourcedata\n"); for(i=0;i for(j=0;j scanf("%d",&need[i][j]); j=0; do{ for(i=0;i if(finish[i]==0&&test(available,need[i],allocation[i])) finish[i]=1; j++; }while(j for(i=0;i g=g&&finish[i]; if(g) printf("safestate"); else printf("notsafestate"); } inttest(intav,intned[n],intall[n])//安全性算法 { intFinish=0; intwork; work=av; if(Finish==0&&ned[n]<=work) { work=work+all[n];//变分配数 return1; } return-1; } #include #definem3 #definen5 main() { inttest(intav[],intned[],intall[]); intavailable[m]={0,0,0},need[n][m]; intallocation[n][m]={{0,1,0},{2,0,0},{3,0,3},{2,1,1},{0,0,2}}; inti,j,g=1; intfinish[n]={0,0,0,0,0}; //clrscr(); printf("pleaseinputtheneedresourcedata\n"); for(i=0;i for(j=0;j scanf("%d",&need[i][j]); j=0; do{ for(i=0;i if(finish[i]==0&&test(available,need[i],allocation[i])) finish[i]=1; j++; }while(j for(i=0;i g=g&&finish[i]; if(g) printf("safestate"); else printf("notsafestate"); } inttest(intav,intned[n],intall[n])//安全性算法 { intFinish=0; intwork; work=av; if(Finish==0&&ned[n]<=work) { work=work+all[n];//变分配数 return1; } return-1; } #include #definem3 #definen5 main() { inttest(intav[],intned[],intall[]); intavailable[m]={0,0,0},need[n][m]; intallocation[n][m]={{0,1,0},{2,0,0},{3,0,3},{2,1,1},{0,0,2}};//已占有资源 inti,j,g=1; intfinish[n]={0,0,0,0,0};//已完成的进程 //clrscr();//清屏 printf("请输入所需要的资源: \n"); for(i=0;i for(j=0;j scanf("%d",&need[i][j]);//输入各个进程需要的资源 printf("所需要的资源: \n"); for(i=0;i for(j=0;j { printf("%d\t",need[i][j]); if(j==2) printf("\n"); } printf("以占有的资源: \n"); for(i=0;i for(j=0;j { printf("%d\t",allocation[i][j]); if(j==2) printf("\n"); } printf("可分配的资源: \n"); for(j=0;j {printf("%d\t",available[j]); } printf("\n"); j=0; do{ for(i=0;i if(finish[i]==0&&test(available,need[i],allocation[i])) finish[i]=1; j++; }while(j for(i=0;i g=g&&finish[i];//判断各个进程是否在安全性算法内全部通过 if(g) printf("safestate"); else printf("notsafestate"); } inttest(intav[],intned[],intall[]) {intwork[3],i,j=0,finish; for(i=0;i<3;i++) work[i]=av[i]; for(i=0;i<3;i++) {if(ned[i]<=work[i]) j++; if(j==2) finish=1; } returnfinish; } /*for(j=0;j<3;j++) { if(req[i][j]<=need[i][j]) { if(req[i][j]<=avail[j]) { avail[j]=avail[j]-req[i][j];//先假定分配资源 alloc[i][j]=alloc[i][j]+req[i][j]; need[i][j]=need[i][j]-req[i][j]; do{ if((finish[i]==0)&&(need[i][j]<=work[j]))//安全性算法,找一个安全序列 { work[j]=work[j]+alloc[i][j];//如果进程满足该条件,执行后释放资源 finish[i]=1;//改为完成 temp[k]=i;//把这个进程号存入安全序列 k++; i=0;//从头开始找 } else i++;//找安全序列的过程用到 }while(i<5); */ /*#include #definem3 #definen5 main() { inttest(intav[],intned[],intall[]); intavailable[m]={0,0,0},need[n][m]; intallocation[n][m]={{0,1,0},{2,0,0},{3,0,3},{2,1,1},{0,0,2}};//已占有资源 inti,j,g=1; intfinish[n]={0,0,0,0,0};//已完成的进程 //clrscr();//清屏 printf("请输入所需要的资源: \n"); for(i=0;i for(j=0;j scanf("%d",&need[i][j]);//输入各个进程需要的资源 printf("所需要的资源: \n"); for(i=0;i for(j=0;j { printf("%d\t",need[i][j]); if(j==2) printf("\n"); } printf("以占有的资源: \n"); for(i=0;i for(j=0;j { printf("%d\t",allocation[i][j]); if(j==2) printf("\n"); } printf("可分配的资源: \n"); for(j=0;j {printf("%d\t",available[j]); } printf("\n"); j=0; do{ for(i=0;i if(finish[i]==0&&test(available,need[i],allocation[i])) finish[i]=1; j++; }while(j for(i=0;i g=g&&finish[i];//判断各个进程是否在安全性算法内全部通过 if(g) printf("safestate"); else printf("notsafestate"); } inttest(intav[],intned[],intall[]) {intwork[3],i,j=0,finish; for(i=0;i<3;i++) work[i]=av[i]; for(i=0;i<3;i++) {if(ned[i]<=work[i]) j++; if(j==2) finish=1; } returnfinish; } /*for(j=0;j<3;j++) { if(req[i][j]<=need[i][j]) { if(req[i][j]<=avail[j]) { avail[j]=avail[j]-req[i][j];//先假定分配资源 alloc[i][j]=alloc[i][j]+req[i][j]; need[i][j]=need[i][j]-req[i][j]; do{ if((finish[i]==0)&&(need[i][j]<=work[j]))//安全性算法,找一个安全序列 { work[j]=work[j]+alloc[i][j];//如果进程满足该条件,执行后释放资源 finish[i]=1;//改为完成 temp[k]=i;//把这个进程号存入安全序列 k++; i=0;//从头开始找 } else i++;//找安全序列的过程用到 }while(i<5); #include #include #include #definem50 intno1;//进程数 intno2;//资源数 intr; intallocation[m][m],need[m][m],available[m],max[m][m]; charname1[m],name2[m];//定义全局变量 voidmain() { voidcheck(); voidprint(); inti,j,p=0,q=0; charc; intrequest[m],allocation1[m][m],need1[m][m],available1[m]; printf("**********************************************\n"); printf("*银行家算法的设计与实现*\n"); printf("**********************************************\n"); printf("请输入进程总数: \n"); scanf("%d",&no1); printf("请输入资源种类数: \n"); scanf("%d",&no2); printf("请输入Max矩阵: \n"); for(i=0;i for(j=0;j scanf("%d",&max[i][j]);//输入已知进程最大资源需求量 printf("请输入Allocation矩阵: \n"); for(i=0;i for(j=0;j scanf("%d",&allocation[i][j]);//输入已知的进程已分配的资源数 for(i=0;i for(j=0;j need[i][j]=max[i][j]-allocation[i][j];//根据输入的两个数组计算出need矩阵的值 printf("请输入Available矩阵\n"); for(i=0;i scanf("%d",&available[i]);//输入已知的可用资源数 print();//输出已知条件 check();//检测T0时刻已知条件的安全状态 if(r==1)//如果安全则执行以下代码{ do{ q=0; p=0; printf("\n请输入请求资源的进程号(0~4): \n"); for(j=0;j<=10;j++){ scanf("%d",&i);if(i>=no1){ printf("输入错误,请重新输入: \n");continue;} elsebreak;} printf("\n请输入该进程所请求的资源数request[j]: \n");for(j=0;j scanf("%d",&request[j]);for(j=0;j if(request[j]>need[i][j])p=1; //判断请求是否超过该进程所需要的资源数 if(p) printf("请求资源超过该进程资源需求量,请求失败! \n"); else{ for(j=0;j if(request[j]>available[j])q=1; //判断请求是否超过可用资源数 if(q) printf("没有做够的资源分配,请求失败! \n"); else//请求满足条件{ for(j=0;j available1[j]=available[j]; allocation1[i][j]=allocation[i][j]; need1[i][j]=need[i][j];//保存原已分配的资源数,仍需要的资源数和可用的资源数 available[j]=available[j]-request[j]; allocation[i][j]+=request[j]; need[i][j]=need[i][j]-request[j];//系统尝试把资源分配给请求的进程 } print(); check();//检测分配后的安全性 if(r==0)//如果分配后系统不安全 { for(j=0;j { available[j]=available1[j]; allocation[i][j]=allocation1[i][j]; need[i][j]=need1[i][j];//还原已分配的资源数,仍需要的资源数和可用的资源数 } printf("返回分配前资源数\n"); print(); } } } //判断是否继续进行资源分配 } } } voidcheck()//安全算法函数 { intk,f,v=0,i,j;intwork[m],a[m];boolfinish[m];r=1; for(i=0;i finish[i]=false;//初始化进程均没得到足够资源数并完成 for(i=0;i work[i]=available[i];//work[i]表示可提供进程继续运行的各类资源数 k=no1; do{ for(i=0;i if(finish[i]==false) { f=1; for(j=0;j if(need[i][j]>work[j]) f=0; if(f==1)//找到还没有完成且需求数小于可提供进程继续运行的资源数的进程 { finish[i]=true; a[v++]=i;//记录安全序列号 for(j=0;j work[j]+=allocation[i][j];//释放该进程已分配的资源 }}} k--;//每完成一个进程分配,未完成的进程数就减1 }while(k>0);f=1; for(i=0;i { if(finish[i]==false) { f=0;break;}} if(f==0)//若有进程没完成,则为不安全状态 { printf("系统处在不安全状态! "); r=0;} else{ printf("\n系统当前为安全状态,安全序列为: \n"); for(i=0;i printf("p%d",a[i]);//输出安全序列} } voidprint()//输出函数 { inti,j; printf("\n"); printf("*************此时刻资源分配情况*********************\n");printf("进程名/号|Max|Allocation|Need|\n");for(i=0;i printf("p%d/%d",i,i); for(j=0;j {printf("%d",max[i][j]);} for(j=0;j {printf("%d",allocation[i][j]);} for(j=0;j {printf("%d",need[i][j]);} printf("\n");} printf("\n"); printf("各类资源可利用的资源数为: "); for(j=0;j { printf("%d",available[j]); } printf("\n"); }*/ //银行家算法 #include #include #defineN5//表示有5个进程 #defineM3//表示有3类资源 #definetrue1 #definefalse0 /*判断所请求的各类资源是否满足所需要的资源数不超过所宣布的资源数: */ voidrequestComToNeed(intRequest[],intNeed[
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验6 银行家算法避免死锁 实验 银行家 算法 避免 死锁
![提示](https://static.bdocx.com/images/bang_tan.gif)