银行家算法 C语言实现.docx

上传人:b****7 文档编号:15611723 上传时间:2023-07-06 格式:DOCX 页数:14 大小:210.30KB
下载 相关 举报
银行家算法 C语言实现.docx_第1页
第1页 / 共14页
银行家算法 C语言实现.docx_第2页
第2页 / 共14页
银行家算法 C语言实现.docx_第3页
第3页 / 共14页
银行家算法 C语言实现.docx_第4页
第4页 / 共14页
银行家算法 C语言实现.docx_第5页
第5页 / 共14页
银行家算法 C语言实现.docx_第6页
第6页 / 共14页
银行家算法 C语言实现.docx_第7页
第7页 / 共14页
银行家算法 C语言实现.docx_第8页
第8页 / 共14页
银行家算法 C语言实现.docx_第9页
第9页 / 共14页
银行家算法 C语言实现.docx_第10页
第10页 / 共14页
银行家算法 C语言实现.docx_第11页
第11页 / 共14页
银行家算法 C语言实现.docx_第12页
第12页 / 共14页
银行家算法 C语言实现.docx_第13页
第13页 / 共14页
银行家算法 C语言实现.docx_第14页
第14页 / 共14页
亲,该文档总共14页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

银行家算法 C语言实现.docx

《银行家算法 C语言实现.docx》由会员分享,可在线阅读,更多相关《银行家算法 C语言实现.docx(14页珍藏版)》请在冰点文库上搜索。

银行家算法 C语言实现.docx

银行家算法C语言实现

 

《操作系统原理》

上机作业(报告)

 

作业:

银行家算法

班级:

姓名:

学号:

时间:

 

题目

银行家算法模拟

作业要求

【题目要求】编制模拟银行家算法的程序,并以下面给出的例子验证所编写的程序的正确性。

系统某一时刻T0中A、B、C3类资源分别还剩3、3、2个,请按银行家算法回答:

一、T0系统是否处于安全状态?

请打印输出找到的资源分配的安全序列。

二、如果T0时刻进程P1提出需要(1、0、2)个资源的请求,系统能否满足它的请求?

如果T0时刻进程P4提出需要(3、3、0)个资源的请求,系统能否满足它的请求?

如果T0时刻进程P0提出需要(0、2、0)个资源的请求,系统能否满足它的请求?

【实验要求】可选编程语言:

C/C++/Java/C#/Python;

实现在同一个程序文件中(C/C++);

请适当注释;

报告正文(运行屏幕截图及源代码)

1.

T0时刻系统安全

2.

P1可以完成需求

3.

P4不能完成需求

4.

P0可以完成需求

源代码:

#include

#defineresNum3

#defineproNum5

intavailable[resNum];//当前系统可用(剩余)资源

intmaxRequest[proNum][resNum]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}};//进程的最大需求资源

intallocation[proNum][resNum]={{0,1,0},{2,0,0},{3,0,2},{2,1,1},{0,0,2}};//进程已经分配的资源

intneed[proNum][resNum]={{7,4,3},{1,2,2},{6,0,0},{0,1,1},{4,3,1}};//进程还需要的资源

boolFinish[proNum];//是否安全(是否进程完成),完成true,未完成false

intsafeArray[proNum];//安全序列

intrequest[resNum];//进程请求资源量

intnum;//资源数量计数

voidinitSafeArray()//安全序列初始化

{

inti=0;

for(i=0;i

{

safeArray[i]=0;

}

}

voidprintSystemMessage()//打印当前系统信息

{

inti,j;

printf("\n------------------------------------------------------------------------------------\n");

printf("当前系统各类资源剩余:

");

for(i=0;i

{

printf("%d",available[i]);

}

printf("\n当前系统资源情况:

\n");

printf("PID\tMax\t\t\tAllocation\t\tNeed\n");

for(i=0;i

{

printf("P%d\t",i);

for(j=0;j

{

printf("%3d",maxRequest[i][j]);

}

printf("\t\t");

for(j=0;j

{

printf("%3d",allocation[i][j]);

}

printf("\t\t");

for(j=0;j

{

printf("%3d",need[i][j]);

}

printf("\n");

}

}

voidprintSafeMessage(int*work,intn)//打印安全检查信息

{

inti;

printf("P%d\t",n);

for(i=0;i

{

printf("%3d",work[i]);

}

printf("\t\t");

for(i=0;i

{

printf("%3d",allocation[n][i]);

}

printf("\t\t");

for(i=0;i

{

printf("%3d",need[n][i]);

}

printf("\t\t");

for(i=0;i

{

printf("%3d",allocation[n][i]+work[i]);

}

printf("\n");

}

boolisFinish(intn)//判断进程n的需求资源是否全为零

{

inti;

num=0;

for(i=0;i

{

if(need[n][i]==0)

{

num++;

}

}

if(num==resNum)

{

returntrue;

}

else

{

returnfalse;

}

}

//安全检查

boolisSafe()

{

inti;

intsafeArrayIndex=0;

intallFinish=0;

intwork[resNum];

intn=0;

inttemp=0;

intpNum=0;

boolflag=false;

for(i=0;i

{

work[i]=0;

}

for(i=0;i

{

work[i]=available[i];

}

for(i=0;i

{

flag=isFinish(i);

if(flag==true)

{

Finish[i]=true;

allFinish++;

}

else

{

Finish[i]=false;

}

}

while(allFinish!

=proNum)//预分配开始

{

num=0;

for(i=0;i

{

if(need[n][i]<=work[i]&&Finish[n]==false)

{

num++;

}

}

if(num==resNum)

{

for(i=0;i

{

work[i]=work[i]+allocation[n][i];

}

allFinish++;

printSafeMessage(work,n);

safeArray[safeArrayIndex]=n;

safeArrayIndex++;

Finish[n]=true;

}

n++;

if(n>=proNum)

{

n=n%proNum;

if(temp==allFinish)

{

break;

}

temp=allFinish;

}

pNum=allFinish;

}

for(i=0;i

{

if(Finish[i]==false)

{

printf("\n当前系统不安全!

\n\n");

returnfalse;

}

}

printf("\n当前系统安全!

\n安全序列为:

");

for(i=0;i

{

flag=isFinish(i);

if(flag==true)

{

pNum--;

}

}

for(i=0;i

{

printf("%d",safeArray[i]);

}

returntrue;

}

//主函数

intmain()

{

intcurProcess=0;

inta=-1,i,j;

printf("系统有1、2、3三种资源,请输入当前系统各类资源剩余:

");

for(i=0;i

{

scanf("%d",&available[i]);

}

printSystemMessage();

printf("\n系统安全情况分析\n");

printf("PID\tWork\t\t\tAllocation\t\tNeed\t\t\tWork+Allocation\n");

boolisStart=isSafe();

while(isStart)//用户输入或者预设系统资源分配合理才能继续运行

{

//限制用户输入,以防用户输入大于进程数量的数字,以及输入其他字符

do

{

if(curProcess>=proNum||a==0)

{

printf("\n请不要输入超出进程数量的值或者其他字符:

\n");

while(getchar()!

='\n'){};

a=-1;

}

printf("\n------------------------------------------------------------------------------------\n");

printf("\n输入要分配的进程:

");

a=scanf("%d",&curProcess);

printf("\n");

}while(curProcess>=proNum||a==0);

//限制用户输入,此处只接受数字,以防用户输入其他字符(乱输是不允许的)

for(i=0;i

{

do

{

if(a==0)

{

printf("\n请不要输入除数字以外的其他字符,请重新输入:

\n");

while(getchar()!

='\n'){};//清空缓冲区

a=-1;

}

printf("请输入要分配给进程P%d的第%d类资源:

",curProcess,i+1);

a=scanf("%d",&request[i]);

}while(a==0);

}

//判断用户输入的分配是否合理,如果合理,开始进行预分配

num=0;

for(i=0;i

{

if(request[i]<=need[curProcess][i]&&request[i]<=available[i])

{

num++;

}

else

{

printf("\n发生错误!

可能原因如下:

\n

(1)请求分配的资源可能大于该进程的某些资源的最大需求量\n

(2)系统所剩的资源不足\n");

break;

}

}

if(num==resNum)

{

num=0;

for(j=0;j

{

available[j]=available[j]-request[j];

allocation[curProcess][j]=allocation[curProcess][j]+request[j];

need[curProcess][j]=need[curProcess][j]-request[j];

if(need[curProcess][j]==0)

{

num++;

}

}

//如果分配以后该进程完成,则释放该进程占用资源

if(num==resNum)//释放已完成资源

{

for(i=0;i

{

available[i]=available[i]+allocation[curProcess][i];

}

printf("\n本次分配进程P%d完成,该进程占用资源全部释放完毕\n",curProcess);

}

else

{

//资源分配可以不用一次性满足进程需求

printf("\n本次分配进程P%d未完成\n",curProcess);

}

printSystemMessage();

printf("\n系统安全情况分析\n");

printf("PID\tWork\t\t\tAllocation\t\tNeed\t\t\tWork+Allocation\n");

//预分配完成以后,判断该系统是否安全,若安全,则可继续进行分配,若不安全,将已经分配的资源换回来

if(!

isSafe())

{

for(j=0;j

{

available[j]=available[j]+request[j];

allocation[curProcess][j]=allocation[curProcess][j]-request[j];

need[curProcess][j]=need[curProcess][j]+request[j];

}

printf("资源不足,分配失败!

\n");

}

}

}

return0;

}

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2