操作系统实验四银行家算法.docx

上传人:b****6 文档编号:7211088 上传时间:2023-05-11 格式:DOCX 页数:10 大小:111.03KB
下载 相关 举报
操作系统实验四银行家算法.docx_第1页
第1页 / 共10页
操作系统实验四银行家算法.docx_第2页
第2页 / 共10页
操作系统实验四银行家算法.docx_第3页
第3页 / 共10页
操作系统实验四银行家算法.docx_第4页
第4页 / 共10页
操作系统实验四银行家算法.docx_第5页
第5页 / 共10页
操作系统实验四银行家算法.docx_第6页
第6页 / 共10页
操作系统实验四银行家算法.docx_第7页
第7页 / 共10页
操作系统实验四银行家算法.docx_第8页
第8页 / 共10页
操作系统实验四银行家算法.docx_第9页
第9页 / 共10页
操作系统实验四银行家算法.docx_第10页
第10页 / 共10页
亲,该文档总共10页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

操作系统实验四银行家算法.docx

《操作系统实验四银行家算法.docx》由会员分享,可在线阅读,更多相关《操作系统实验四银行家算法.docx(10页珍藏版)》请在冰点文库上搜索。

操作系统实验四银行家算法.docx

操作系统实验四银行家算法

操作系统实验

实验四银行家算法

 

学号1215108019

姓名李克帆

班级12电子2班

 

华侨大学电子工程系

 

实验目的

1、理解银行家算法。

2、掌握进程安全性检查的方法与资源分配的方法。

实验内容与基本要求

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

进程

已占资源

最大需求数

A

B

C

D

A

B

C

D

P0

0

0

1

2

0

0

1

2

P1

1

0

0

0

1

7

5

0

P2

1

3

5

4

2

3

5

6

P3

0

6

3

2

0

6

5

2

P4

0

0

1

4

0

6

5

6

现在系统中A、B、C、D4类资源分别还剩1、5、2、0个,请按银行家算法回答:

1、现在系统是否处于安全状态?

2、如果现在进程P1提出需要(0、4、2、0)个资源的请求,系统能否满足它的请求?

实验报告内容

1、银行家算法和安全性检查算法原理。

操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。

当进程在执行中继续申请资源时,先测试该进程本次申请的资源数是否超过了该资源所剩余的总量。

若超过则拒绝分配资源,若能满足则按当前的申请量分配资源,否则也要推迟分配。

2、程序流程图。

3、程序及注释。

#include

#include

#defineM4//资源的种类数

#defineN5//进程的个数

voidoutput(intiMax[N][M],intiAllocation[N][M],intiNeed[N][M],intiAvailable[M],charcName[N]);//统一的输出格式

boolsafety(intiAllocation[N][M],intiNeed[N][M],intiAvailable[M],charcName[N]);

boolbanker(intiAllocation[N][M],intiNeed[N][M],intiAvailable[M],charcName[N]);

voidmain()

{

inti,j;

//当前可用每类资源的资源数

intiAvailable[M]={1,5,2,0};

//系统中N个进程中的每一个进程对M类资源的最大需求

intiMax[N][M]={{0,0,1,2},{1,7,5,0},{2,3,5,6},{0,6,5,2},{0,6,5,6}};

//iNeed[N][M]每一个进程尚需的各类资源数

//iAllocation[N][M]为系统中每一类资源当前已分配给每一进程的资源数

intiNeed[N][M],iAllocation[N][M]={{0,0,1,2},{1,0,0,0},{1,3,5,4},{0,6,3,2},{0,0,1,4}};

//进程名

charcName[N]={'a','b','c','d','e'};

boolbExitFlag=true;//退出标记

charch;//接收选择是否继续提出申请时传进来的值

boolbSafe;//存放安全与否的标志

//计算iNeed[N][M]的值

for(i=0;i

for(j=0;j

iNeed[i][j]=iMax[i][j]-iAllocation[i][j];

//输出初始值

output(iMax,iAllocation,iNeed,iAvailable,cName);

//判断当前状态是否安全

bSafe=safety(iAllocation,iNeed,iAvailable,cName);

//是否继续提出申请

while(bExitFlag)

{

cout<<"\n"<<"继续提出申请?

\ny为是;n为否。

\n";

cin>>ch;

switch(ch)

{

case'y':

//cout<<"调用银行家算法";

bSafe=banker(iAllocation,iNeed,iAvailable,cName);

if(bSafe)//安全,则输出变化后的数据

output(iMax,iAllocation,iNeed,iAvailable,cName);

break;

case'n':

cout<<"退出。

\n";

bExitFlag=false;

break;

default:

cout<<"输入有误,请重新输入:

\n";

}

}

}

//输出

voidoutput(intiMax[N][M],intiAllocation[N][M],intiNeed[N][M],intiAvailable[M],charcName[N])

{

inti,j;

cout<<"\n\tMax\tAllocation\tNeed\tAvailable"<

cout<<"\tABCD\tABCD\tABCD\tABCD"<

for(i=0;i

{

cout<

for(j=0;j

cout<

cout<<"\t";

for(j=0;j

cout<

cout<<"\t";

for(j=0;j

cout<

cout<<"\t";

cout<<"";

//Available只需要输出一次

if(i==0)

for(j=0;j

cout<

cout<

}

}

//安全性算法,进行安全性检查;安全返回true,并且输出安全序列,不安全返回false,并输出不安全的提示;

boolsafety(intiAllocation[N][M],intiNeed[N][M],intiAvailable[M],charcName[N])

{

inti,j,flag,x=0;

charnum[5];

intWork[M];

boolFinish[N];//定义基本变量

for(j=0;j<4;j++)

Work[j]=iAvailable[j];//将iAvailable的值赋给Work

for(i=0;i<5;i++)//将Finish全部置为False

Finish[i]=false;

while(true)//执行无限循环,满足条件时跳出

{

flag=0;//每次循环开始时将记录本次循环中是否有使有满足条件iAllocation的标志置为0,若为0表示不存在,若不为0表示存在

for(i=0;i<5;i++)//执行循环,看有没有满足条件的iAllocation

{

if(Finish[i]==false&&Work[0]>=iNeed[i][0]&&Work[1]>=iNeed[i][1]&&Work[2]>=iNeed[i][2])

{

for(j=0;j<4;j++)

{

Work[j]+=iAllocation[i][j];//Work[j]+=Work[j]+iAllocation[i][j]

}

Finish[i]=true;//将Finish置true

flag++;//标志加1

num[x++]=cName[i];//将该序列名赋给数组num[]

}

}

if(flag==0)

{

cout<<"无安全序列";//标志为0,证明已无满足条件iAllocation,退出循环,返回false

returnfalse;

}

if(Finish[0]==true&&Finish[1]==true&&Finish[2]==true&&Finish[3]==true&&Finish[4]==true)//若所有Finish置为true,输出安全数列,返回True

{

cout<<"\n";

cout<<"安全序列为:

";

for(x=0;x<5;x++)

cout<

cout<<"\n";

returntrue;

}

}

returntrue;

}

//安全返回true,不安全返回false

boolbanker(intiAllocation[N][M],intiNeed[N][M],intiAvailable[M],charcName[N])

{

intiMax[N][M]={{0,0,1,2},{1,7,5,0},{2,3,5,6},{0,6,5,2},{0,6,5,6}};

intt,i,Request[4],check_1[4];

charx;//定义变量

cout<<"请输入进程名:

";//输入进程名

cin>>x;

if(x=='a')i=0;

if(x=='b')i=1;

if(x=='c')i=2;

if(x=='d')i=3;

if(x=='e')i=4;

cout<<"请输入各资源数量:

";//输入变量名

for(t=0;t<4;t++)

cin>>Request[t];

for(t=0;t<4;t++)//检查数值

{

check_1[t]=Request[t]+iAllocation[i][t];

}

for(t=0;t<4;t++)

{

if((iMax[i][t]-check_1[t])<0)

{

cout<<"\n资源申请超过最大需求量!

\n";

returnfalse;

}

}

for(t=0;t<4;t++)//检查数值

{

if((iAvailable[t]-Request[t])<0)

{

cout<<"\n不能满足进程!

\n";

returnfalse;

}

}

for(t=0;t<4;t++)//将该变量的iAvailable、iAllocation、iNeed重新赋值

{

iAvailable[t]-=Request[t];

iAllocation[i][t]+=Request[t];

iNeed[i][t]-=Request[t];

}

safety(iAllocation,iNeed,iAvailable,cName);//执行安全数列算法

returntrue;

returntrue;

}

4、运行结果以及结论。

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

当前位置:首页 > IT计算机 > 电脑基础知识

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

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