操作系统实验报告C语言实现银行家算法Word下载.docx

上传人:b****6 文档编号:16309990 上传时间:2022-11-22 格式:DOCX 页数:14 大小:215.90KB
下载 相关 举报
操作系统实验报告C语言实现银行家算法Word下载.docx_第1页
第1页 / 共14页
操作系统实验报告C语言实现银行家算法Word下载.docx_第2页
第2页 / 共14页
操作系统实验报告C语言实现银行家算法Word下载.docx_第3页
第3页 / 共14页
操作系统实验报告C语言实现银行家算法Word下载.docx_第4页
第4页 / 共14页
操作系统实验报告C语言实现银行家算法Word下载.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

操作系统实验报告C语言实现银行家算法Word下载.docx

《操作系统实验报告C语言实现银行家算法Word下载.docx》由会员分享,可在线阅读,更多相关《操作系统实验报告C语言实现银行家算法Word下载.docx(14页珍藏版)》请在冰豆网上搜索。

操作系统实验报告C语言实现银行家算法Word下载.docx

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

实验步骤:

一.银行家算法

进程i发出请求资源申请, 

(1)如果Request[j]<

=need[i,j],转向步骤

(2),否则认为出错,因为他所需要的资源数已经超过它所宣布的最大值。

(2)如果:

Requesti[j]<

=available[i,j],转向步骤(3),否则表示尚无足够资源,进程i需等待。

(3)若以上两个条件都满足,则系统试探着将资源分配给申请的进程,并修改下面数据结构中的数值:

Available[i,j]=Available[i,j]-Request[j];

Allocation[i][j]= Allocation[i][j]+Request [j];

need[i][j]=need[i][j]-Request[j];

(4)试分配后,执行安全性检查,调用check()函数检查此次资源分配后系统是否处于安全状态。

若安全,才正式将资源分配给进程;

否则本次试探分配作废,恢复原来的资源分配状态,让该进程等待。

(5)用do{…}while循环语句实现输入字符y/n判断是否继续进行资源申请。

二.安全性检查算法(check()函数)

(1)设置两个向量:

工作向量Work,它表示系统可提供给进程继续运行所需的各类资源数目,在执行安全性算法开始时,Work=Available。

工作向量Finish,它表示系统是否有足够的资源分配给进程,使之运行完成。

开始时先做Finish[i]=false;

当有足够的资源分配给进程时,再令Finish[i]=true。

(2)在进程中查找符合以下条件的进程:

条件1:

Finish[i]=false;

条件2:

need[i][j]<

=Work[j]

若找到,则执行步骤(3)否则,执行步骤(4)

(3)当进程获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行:

Work[j]=Work[j]+ Allocation[i][j];

Finish[i]=true;

gotostep 

(2);

(4)如果所有的Finish[i]=true都满足,则表示系统处于安全状态,否则,处于不安全状态。

安全性算法流程图

程序源代码:

#include<

stdio.h>

#include<

stdlib.h>

#include<conio.h>

#definem50

 

intno1;

//进程数

int no2;

 //资源数

int r;

intallocation[m][m],need[m][m],available[m],max[m][m];

charname1[m],name2[m];

         //定义全局变量

voidmain()

ﻩvoid check();

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("

请输入资源种类数:

scanf("

%d"

,&

no2);

 printf("

请输入Max矩阵:

\n"

for(i=0;

i<no1;

i++)

for(j=0;

j<no2;

j++)

ﻩﻩscanf("

&

max[i][j]);

 //输入已知进程最大资源需求量

printf("请输入Allocation矩阵:

\n"

ﻩfor(i=0;

i<

no1;

i++)

ﻩﻩfor(j=0;

j<

no2;

j++)

ﻩscanf("%d"

allocation[i][j]);

 //输入已知的进程已分配的资源数

  

for(i=0;

ﻩfor(j=0;

no2;

ﻩﻩﻩneed[i][j]=max[i][j]-allocation[i][j];

//根据输入的两个数组计算出need矩阵的值

 

printf("

请输入Available矩阵\n"

i<no2;

scanf("%d"

available[i]);

  //输入已知的可用资源数

ﻩprint();

  //输出已知条件

check();

//检测T0时刻已知条件的安全状态

ﻩif(r==1)//如果安全则执行以下代码

ﻩ{

ﻩﻩdo{

q=0;

  p=0;

printf("

\n请输入请求资源的进程号(0~4):

ﻩﻩfor(j=0;

=10;

j++)

{

ﻩﻩﻩscanf("

%d",&

i);

ﻩﻩif(i>

=no1)

ﻩ{

ﻩﻩﻩprintf("

输入错误,请重新输入:

ﻩﻩﻩ  continue;

ﻩﻩ}

ﻩﻩﻩﻩelsebreak;

ﻩ}

ﻩprintf("\n请输入该进程所请求的资源数request[j]:

\n");

ﻩfor(j=0;

no2;

j++)

ﻩﻩscanf("

%d"

,&request[j]);

ﻩﻩﻩfor(j=0;

j<no2;

ﻩﻩif(request[j]>

need[i][j]) p=1;

ﻩﻩﻩ//判断请求是否超过该进程所需要的资源数

ﻩﻩﻩif(p)

ﻩﻩﻩﻩprintf("请求资源超过该进程资源需求量,请求失败!

\n"

ﻩﻩelse

ﻩﻩﻩ{

ﻩﻩﻩﻩfor(j=0;

no2;

ﻩﻩif(request[j]>available[j]) q=1;

//判断请求是否超过可用资源数

ﻩﻩif(q)

ﻩﻩﻩprintf("没有做够的资源分配,请求失败!

);

else     //请求满足条件

ﻩﻩ{

ﻩﻩﻩfor(j=0;

j<no2;

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;

ﻩﻩﻩﻩﻩ{

ﻩﻩﻩﻩﻩavailable[j]=available1[j];

 

ﻩﻩﻩ  allocation[i][j]=allocation1[i][j];

ﻩﻩﻩﻩﻩ  need[i][j]=need1[i][j];

   //还原已分配的资源数,仍需要的资源数和可用的资源数

ﻩﻩﻩﻩﻩﻩ}

ﻩﻩﻩﻩprintf("

返回分配前资源数\n"

ﻩﻩprint();

ﻩﻩﻩﻩﻩ}

ﻩﻩ}

ﻩﻩ}printf("

\n你还要继续分配吗?

Y orN?

ﻩﻩﻩ//判断是否继续进行资源分配

ﻩﻩﻩﻩc=getche();

ﻩﻩ}while(c=='

y'

||c=='

Y'

ﻩ}

}

void check() //安全算法函数

{

int k,f,v=0,i,j;

ﻩintwork[m],a[m];

ﻩboolfinish[m];

ﻩr=1;

for(i=0;

i<no1;

ﻩfinish[i]=false;

//初始化进程均没得到足够资源数并完成

for(i=0;

no2;

i++)

work[i]=available[i];

//work[i]表示可提供进程继续运行的各类资源数

ﻩk=no1;

ﻩdo{

ﻩfor(i=0;

no1;

{

ﻩif(finish[i]==false)

ﻩ{

ﻩﻩf=1;

ﻩﻩﻩﻩfor(j=0;

j<

j++)

ﻩﻩﻩif(need[i][j]>

work[j])

ﻩﻩﻩf=0;

ﻩﻩif(f==1)  //找到还没有完成且需求数小于可提供进程继续运行的资源数的进程

ﻩ{

ﻩﻩﻩfinish[i]=true;

ﻩﻩa[v++]=i;

  //记录安全序列号

ﻩﻩﻩﻩﻩfor(j=0;

j<no2;

ﻩﻩﻩﻩwork[j]+=allocation[i][j];

 //释放该进程已分配的资源

ﻩﻩ}

ﻩﻩ}

ﻩ}

ﻩk--;

 //每完成一个进程分配,未完成的进程数就减1

ﻩ}while(k>

0);

ﻩf=1;

for(i=0;

no1;

i++) //判断是否所有的进程都完成

if(finish[i]==false)

ﻩ{

f=0;

ﻩbreak;

}

if(f==0) //若有进程没完成,则为不安全状态

ﻩprintf("

系统处在不安全状态!

");

ﻩr=0;

ﻩelse

ﻩ{

ﻩprintf("\n系统当前为安全状态,安全序列为:

ﻩﻩfor(i=0;

i++)

ﻩprintf("

p%d "

a[i]);

 //输出安全序列

ﻩ}

voidprint()//输出函数

inti,j;

printf("

printf("*************此时刻资源分配情况*********************\n"

ﻩprintf("进程名/号| Max  |Allocation |   Need |\n"

for (i=0;

i <

no1;

 i++)

ﻩprintf("

  p%d/%d "

,i,i);

   ﻩfor(j=0;

j<

no2;

j++)

     {printf("

%d"

max[i][j]);

ﻩfor(j=0;

j<no2;

 j++)

ﻩﻩ{printf("

 %d  "

allocation[i][j]);

ﻩfor(j =0;

 no2;

 j++)

ﻩﻩ{printf("

%d ",need[i][j]);

ﻩﻩprintf("\n");

ﻩﻩ}

printf("

ﻩﻩprintf("

各类资源可利用的资源数为:

"

ﻩﻩfor(j=0;

no2;

j++)

ﻩ {printf("

%d"

available[j]);

ﻩprintf("

程序运行调试结果:

1、程序初始化

2、检测系统资源分配是否安全结果

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

当前位置:首页 > 职业教育 > 职高对口

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1