死锁避免算法模拟实验银行家算法文档格式.docx
- 文档编号:19698549
- 上传时间:2023-01-08
- 格式:DOCX
- 页数:9
- 大小:165.99KB
死锁避免算法模拟实验银行家算法文档格式.docx
《死锁避免算法模拟实验银行家算法文档格式.docx》由会员分享,可在线阅读,更多相关《死锁避免算法模拟实验银行家算法文档格式.docx(9页珍藏版)》请在冰豆网上搜索。
No
NO
流程图:
源代码:
#include<
stdio.h>
intIsprocessallover();
//判断系统中的进程是否全部运行完毕
voidSystemstatus();
//显示当前系统中的资源及进程情况
voidAllow(int,int*);
//若进程申请不导致死锁,用此函数分配资源
voidForbidenseason(int);
//若发生死锁,则显示原因
intBanker(int,int*);
//银行家算法
intAvailiable[5]={5,6,6,5,4};
//初始状态,系统可用资源量
intMax[5][5]={{1,2,3,2,3},{3,2,2,3,3},{7,0,2,3,3},{2,2,2,2,3},{4,3,3,1,3}};
//各进程对各资源的最大需求量
intAllocation[5][5]={{0,1,0,0,1},{2,0,0,1,1},{3,0,2,0,1},{2,1,1,0,1},{0,0,2,0,1},};
//初始状态,各进程占有资源量
intNeed[5][5]={{1,1,3,2,2},{1,2,2,2,2},{4,0,0,3,2},{0,1,1,2,2},{4,3,1,1,2},};
//初始状态时,各进程运行完毕,还需要的资源量
intover[5]={0,0,0,0,0};
//标记对应进程是否得到所有资源并运行完毕
intmain()
{
inti,j,k;
intprocess=0;
//发出请求的进程
intdecide=0;
//银行家算法的返回值
intRequest[5]={0,0,0,0,0};
//申请的资源量数组
intsourcenum=0;
//申请的各资源量
/*判断系统中进程是否全部运行完毕*/
step1:
if(Isprocessallover()==1)
{
puts("
系统中全部进程运行完毕!
"
);
return0;
}
/*显示系统当前状态*/
Systemstatus();
/*人机交互界面*/
step2:
printf("
输入发出请求的进程(输入“0”退出系统):
scanf("
%d"
&
process);
if(process==0)
放弃申请,退出系统!
if(process<
1||process>
5||over[process-1]==1)
系统无此进程!
gotostep2;
此进程申请各资源(A,B,C,D,E)数目:
"
for(i=0;
i<
5;
i++)
%c资源:
65+i);
sourcenum);
Request[i]=sourcenum;
/*用银行家算法判断是否能够进行分配*/
decide=Banker(process,Request);
if(decide==0)
/*将此进程申请资源分配给它*/
Allow(process,Request);
gotostep1;
else
/*不能分配,显示原因*/
Forbidenseason(decide);
}
intIsprocessallover()
inti,j;
intprocessnum=0;
6;
//判断每个进程是否运行完毕
if(over[i]==1)processnum++;
if(processnum==5)return1;
//系统中全部进程运行完毕
voidSystemstatus()
此刻系统中存在的进程:
if(over[i]!
=1)printf("
P%d"
i+1);
此刻系统可利用资源(单位:
个):
ABCDE"
i++)printf("
%d"
Availiable[i]);
此刻各进程已占有资源如下(单位:
ABCDE"
if(over[i]==1)continue;
for(j=0;
j<
j++)printf("
Allocation[i][j]);
各进程运行完毕还需各资源如下(单位:
Need[i][j]);
intBanker(intp,int*R)
inti,j,m,n;
intnum=0;
intFinish[5]={0,0,0,0,0};
intwork[5]={0,0,0,0,0};
intAvailiableTest[5];
intAllocationTest[5][5];
intNeedTest[5][5];
/*判断申请的资源是否大于系统可提供的资源总量*/
if(*(R+i)>
Availiable[i])return1;
/*判断该进程申请资源量是否大于初始时其申明的需求量*/
Need[p-1][i])return2;
/*为检查分配的各数据结构赋初值*/
AvailiableTest[i]=Availiable[i];
j++)
AllocationTest[i][j]=Allocation[j][i];
NeedTest[i][j]=Need[j][i];
/*进行试分配*/
AvailiableTest[i]-=*(R+i);
AllocationTest[p-1][i]+=*(R+i);
NeedTest[p-1][i]-=*(R+i);
/*检测进程申请得到满足后,系统是否处于安全状态*/
work[i]=AvailiableTest[i];
for(m=1;
m<
=6;
m++)
for(n=0;
n<
n++)
num=0;
/*寻找用此刻系统中没有运行完的进程*/
if(Finish[n]==0&
&
over[n]!
=1)
4;
if(NeedTest[n][i]<
=work[i])
num++;
if(num==4)
work[i]=work[i]+AllocationTest[n][i];
Finish[n]=1;
if(Finish[i]==0&
over[i]!
return3;
voidAllow(intp,int*R)
可以满足申请!
);
//可以满足申请!
staticintovernum;
/*对进程所需的资源进行分配*/
Availiable[i]=Availiable[i]-*(R+i);
Allocation[p-1][i]=Allocation[p-1][i]+*(R+i);
Need[p-1][i]=Need[p-1][i]-*(R+i);
/*分配后判断其是否运行完毕*/
overnum=0;
if(Need[p-1][i]==0)overnum++;
if(overnum==5)
/*此进程运行完毕,释放其占有的全部资源*/
Availiable[i]=Availiable[i]+Allocation[p-1][i];
/*标记该进程运行完毕*/
over[p-1]=1;
进程P%d所需资源全部满足,此进程运行完毕!
\n"
voidForbidenseason(intd)
不能满足申请,此进程挂起,原因为:
switch(d)
case1:
申请的资源量大于系统可提供的资源量!
break;
case2:
申请的资源中有某种资源大于其声明的需求量!
case3:
若满足申请,系统将进入不安全状态,可能导致死锁!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 死锁 避免 算法 模拟 实验 银行家