实验三 银行家调度算法.docx

上传人:b****8 文档编号:23713540 上传时间:2023-05-20 格式:DOCX 页数:13 大小:21.55KB
下载 相关 举报
实验三 银行家调度算法.docx_第1页
第1页 / 共13页
实验三 银行家调度算法.docx_第2页
第2页 / 共13页
实验三 银行家调度算法.docx_第3页
第3页 / 共13页
实验三 银行家调度算法.docx_第4页
第4页 / 共13页
实验三 银行家调度算法.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

实验三 银行家调度算法.docx

《实验三 银行家调度算法.docx》由会员分享,可在线阅读,更多相关《实验三 银行家调度算法.docx(13页珍藏版)》请在冰豆网上搜索。

实验三 银行家调度算法.docx

实验三银行家调度算法

实验三银行家调度算法

1.实验目的

(1)使学生加深对死锁的理解,理解预防死锁的思想和方法,使学生明确系统安全状态的概念。

(2)使学生能利用银行家调度算法实现避免死锁。

2.实验预备内容

阅读死锁的基本概念,产生死锁的原因、产生死锁的必要条件以及处理死锁的基本方法,重点阅读关于死锁避免的章节。

3.实验环境

(1)一台运行Windows2000professional操作系统的计算机。

(2)选用turboc、visualc++、delphi、c++builder或visualbasic等任何一种语言,建议用c++。

4.实验时间:

4个机时。

5.实验内容

(1)设置银行家算法中的数据结构

(a)可利用资源向量Available

它是一个含有m个元素的数组,其中的每一个元素代表一类可利用资源的数目,其初始值是系统中所配置该类全部可用资源数目。

其数值随该类资源的分配和回收而动态地改变。

如果Available[j]=k表示系统中现有

类资源k个。

(b)最大需求矩阵Max

这是一个

的矩阵,它定义了系统中n个进程中的每一个进程对m类资源的最大需求。

如果Max(i,j)=k,表示进程i需要

类资源的最大数目为k。

(c)分配矩阵Allocation

这是一个

的矩阵,它定义了系统中每一类资源当前已分配该每一进程的资源数。

如果Allocation(i,j)=k,表示进程i当前已分得

类资源的数目为k。

(d)分配矩阵Need

这是一个

的矩阵,用以表示每一个进程尚需的各类资源数。

如果Need(i,j)=k表示进程i还需要

类资源k个,方能完成其任务。

上述三个矩阵存在如下关系:

Need(i,j)=Max(i,j)-Allocation(i,j)

(2)银行家算法

是进程

的请求向量。

如果

[j]=k,表示进程

需要k个

类的资源。

发出资源请求后,系统按下述步骤进行检查:

①如果

则转向步骤②;否则,认为出错,因为它所需要的资源数已超过它所宣布的最大值。

②如果

,则转向步骤③;否则,表示系统中尚无足够的的资源,

必须等待。

③系统试探把要求的资源分配给进程

,并修改下面数据结构中的数值:

Available

Available-

④系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态。

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

,以完成本次分配;否则,将试探分配作废,恢复原来的资源分配状态,让进程

等待。

(3)安全性算法

系统所执行的安全性算法描述如下:

①设置两个向量

(a)工作向量Work。

它表示系统可提供给进程继续运行所需要的各类资源数目,它含有m个元素,执行安全算法开始时,Work:

=Available。

(b)Finish。

它表示系统是否有足够的资源分配给进程,使之运行完成,开始时先做Finish[i]:

=false;当有足够资源分配给进程时,令Finish[i]:

=true。

②从进程集合中找到一个能满足下列条件的进程:

(a)Finish[i]:

=false

(b)

如找到,执行步骤③;否则执行步骤④。

③当进程

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

Work:

=Work+Allocationi;

Finish[i]:

=true;

gotostep

(2)

④如果所有进程的Finish[i]:

=true,则表示系统处于安全状态;否则,系统处于不安全状态。

6.参考算法

#include

#include

#include

#include"windows.h"

#defineMAX_PROCESS32             //最大进程数

#defineMAX_COURCE64             //最大资源类别

intMAX_FACT_PROCESS;             //实际总进程数

intMAX_FACT_COURCE;              //实际资源类别数

intAvailable[MAX_COURCE];                //可利用资源向量

intMax[MAX_PROCESS][MAX_COURCE];         //最大需求矩阵

intAllocation[MAX_PROCESS][MAX_COURCE];  //分配矩阵

intNeed[MAX_PROCESS][MAX_COURCE];        //需求矩阵

intRequest_PROCESS;                      //发出请求的进程

intRequest_COURCE;                       //被请求资源类别

intRequest_COURCE_NEMBER;                //请求资源数

structCOMP{

intvalue;

intnum;

intnext;

};

intflag=0;

voidRead_Initiate(void){                            //读入初始化文档

ifstreaminfile("Initiate.txt");

  if(!

infile){

cout<<"不能打开输入文件:

"<<"Initiate.txt"<<'\n';

exit

(1);

}

cout<<"开始读入初始化文档"<<'\n';

intch;

intArray[MAX_PROCESS*MAX_COURCE*2];

intnum=0;

while(infile>>ch)

   Array[num++]=ch;

num=0;

  MAX_FACT_COURCE=Array[num++];

  for(intj=0;j

Available[j]=Array[num++];

  MAX_FACT_PROCESS=Array[num++];

for(inti=0;i

for(intj=0;j

Max[i][j]=Array[num++];

}

infile.close();

}

voidWrite_Initiate(void){                                 //写入初始化文档(分配资源

ofstreamoutfile("Initiate.txt");

if(!

outfile){

cout<<"不能打开初始化文档:

"<<'\n';

exit

(1);

}

intArray[MAX_PROCESS*MAX_COURCE*2];

intnum=0;

Array[num++]=MAX_FACT_COURCE;

  for(inti=0;i

Array[num++]=Available[i];

Array[num++]=MAX_FACT_PROCESS;

for(i=0;i

for(intj=0;j

Array[num++]=Max[i][j];

num=0;

outfile<

for(i=0;i

outfile<

outfile<<'\n'<

for(i=0;i

for(intj=0;j

outfile<

outfile<

}

DWORDm_delay=3000;

Sleep(m_delay);

outfile.close();

cout<<"修改初始化文档成功!

"<

}

voidAllocated_list(void){                        //读入已分配资源列表

ifstreaminfile("Allocated_list.txt");

  if(!

infile){

cout<<"不能打开输入文件:

"<<"Allocated_list.txt"<<'\n';

exit

(1);

}

cout<<"开始读入已分配资源列表"<<'\n';

intch,num=0;

intArray[MAX_PROCESS*MAX_COURCE];

while(infile>>ch)

Array[num++]=ch;

num=0;

for(inti=0;i

for(intj=0;j

Allocation[i][j]=Array[num++];

infile.close();

}

voidSet_Need(void){                       //设置需求矩阵

cout<<"设置需求矩阵"<<'\n';

for(inti=0;i

for(intj=0;j

Need[i][j]=Max[i][j]-Allocation[i][j];

}

voidRead_Request(void){                          //读入请求向量

ifstreaminfile("Request_list.txt");

  if(!

infile){

cout<<"不能打开输入文件:

"<<"Request_list.txt"<<'\n';

exit

(1);

}

  cout<<"开始读入请求向量"<<'\n';

intArray[3];

intnum=0,ch;

while(infile>>ch)

   Array[num++]=ch;

  Request_PROCESS=Array[0];

  Request_COURCE=Array[1];

  Request_COURCE_NEMBER=Array[2];

infile.close();

}

voidWrite_Allocation(void){                        //修改资源分配列表(资源分配)

ofstreamoutfile("Allocated_list.txt");

if(!

outfile){

cout<<"不能打开资源分配列表:

"<<'\n';

exit

(1);

}

for(inti=0;i

for(intj=0;j

outfile<

outfile<

}

  DWORDm_delay=3000;

Sleep(m_delay);

cout<<"修改资源分配列表成功!

"<

outfile.close();

}

voidAllocate_Source(void){                      //开始分配(已通过扫描和安全性检测)

cout<<'\n'<<"开始给第"<

<<"类资源"<

Write_Initiate();

Write_Allocation();

DWORDm_delay=3000;

Sleep(m_delay);

cout<<'\n'<<"祝贺您,资源分配已成功!

"<

}

voidTest_Safty(){                        //安全性检测

cout<<'\n'<<"进入安全性检测!

"<

  intWork[MAX_COURCE];

for(inti=0;i

Work[i]=Available[i];

}

  boolFinish[MAX_PROCESS][MAX_COURCE];

for(i=0;i

for(intj=0;j

Finish[i][j]=false;

COMPArray[32];

for(i=0;i

{

Array[i].value=Need[i][Request_COURCE-1];

      Array[i].num=i;

}

for(i=0;i

for(intj=i+1;j

if(Array[i].value>=Array[j].value){

intt;

t=Array[j].value;

              Array[j].value=Array[i].value;

Array[i].value=t;

t=Array[j].num;

              Array[j].num=Array[i].num;

              Array[i].num=t;

}

elsecontinue;

}

DWORDm_delay=3000;

Sleep(m_delay);

/*for(i=0;i

for(intj=0;j

cout<

cout<

}

*/

if(Finish[Request_PROCESS-1][Request_COURCE-1]==false&&Need[Request_PROCESS-1][Request_COURCE-1]<=Work[Request_COURCE-1])

{

Work[Request_COURCE-1]=Work[Request_COURCE-1]+Allocation[Request_PROCESS-1][Request_COURCE-1];

      Finish[Request_PROCESS-1][Request_COURCE-1]=true;

}

else

{

cout<<"未通过安全性测试,不与以分配"<

exit(0);

}

  for(i=0;i

if(Array[i].num==Request_PROCESS-1)

continue;

if(Array[i].num!

=Request_PROCESS-1&&Finish[Array[i].num][Request_COURCE-1]==false&&Need[Array[i].num][Request_COURCE-1]<=Work[Request_COURCE-1]){

Work[Request_COURCE-1]=Work[Request_COURCE-1]+Allocation[Array[i].num][Request_COURCE-1];

              Finish[Array[i].num][Request_COURCE-1]=true;

}

}

  for(i=0;i

{

if(Finish[i][Request_COURCE-1]==true)

continue;

else

{

cout<<"未通过安全性测试,不与以分配"<

  exit(0);

}

}

cout<<'\n'<<"找到一个安全序列:

"<<"P"<";

  for(i=0;i

if(Array[i].num==Request_PROCESS)

continue;

else

cout<<"P"<";

}

cout<<'\n'<<"已通过安全性测试!

"<

Allocate_Source();

}

voidRUN(void){                                       //执行银行家算法

  cout<<"*************************************************"<<'\n'<<"点击1执行!

"

<<'\n'<<"点击2退出!

"

<<'\n'<<"*************************************************"<

cin>>flag;

if(flag==2)

exit(0);

if(flag==1)

{

cout<<"开始扫描请求信息!

"<

DWORDm_delay=3000;

Sleep(m_delay);

if(Request_COURCE_NEMBER>Need[Request_PROCESS-1][Request_COURCE-1])

{

cout<<'\n'<<"第"<

      cout<<"可是已超出该进程尚需的该类资源的最大数量,所以不予以分配!

!

"<

exit(0);

}

if(Request_COURCE_NEMBER>Available[Request_COURCE-1])

{

cout<<'\n'<<"第"<

      cout<<"可是系统中尚无足够的资源,所以进入等待队列!

!

"<

exit(0);

}

  else{

Available[Request_COURCE-1]=Available[Request_COURCE-1]-Request_COURCE_NEMBER;

      Allocation[Request_PROCESS-1][Request_COURCE-1]=Allocation[Request_PROCESS-1][Request_COURCE-1]+Request_COURCE_NEMBER;

      Need[Request_PROCESS-1][Request_COURCE-1]=Need[Request_PROCESS-1][Request_COURCE-1]-Request_COURCE_NEMBER;

cout<<"扫描通过"<

Sleep(m_delay);

Test_Safty();

}

}

else{

cout<<"输入错误,请重新输入!

"<<'\n';

RUN();

}

}

 

voidmain(void){

  Read_Initiate();

cout<

for(inti=0;i

cout<

cout<

for(i=0;i

for(intj=0;j

cout<

cout<

}

DWORDm_delay=3000;

Sleep(m_delay);

cout<<"读入成功"<<'\n';

Allocated_list();

for(i=0;i

for(intj=0;j

cout<

cout<

}

Sleep(m_delay);

cout<<"读入成功"<<'\n';

Set_Need();

  for(i=0;i

for(intj=0;j

cout<

cout<

}

  Sleep(m_delay);

cout<<"设置成功"<<'\n';

  Read_Request();

cout<<'\n'<<"第"<

cout<<'\n'<<"读入成功"<<'\n';

RUN();

}

注:

数组Array[I]表示第I+1个实际意义量需要创建三个txt文本。

1.Initiate.txt文本

3332     //共有3类资源,Available[0]=3;Available[1]=3;Available[2]=2

5            //当前系统中有个进程

753        //Max[0][0]=7

322         //Max[1][1]=3

902

222

433

2.Allocated_list.txt文本

010        //Allocation[0][1]=1

200

302

211

002

3.Request_list.txt文本

211      //第2个进程请求第1类资源1个Request[1][0]=1

本程序假设当前时刻只有一个进程请求某一类资源n个.

若要满足某个进程当前时刻同时请求不止一类资源,则需要为最大需求矩阵Max,分配矩阵Allocation和需求矩阵Need增加维数,当然代码量也将大大增加,但是算法逻辑本身并无变化.

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

当前位置:首页 > 高等教育 > 法学

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

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