实验四银行家算法的实现.docx

上传人:b****6 文档编号:7726783 上传时间:2023-01-26 格式:DOCX 页数:8 大小:74.09KB
下载 相关 举报
实验四银行家算法的实现.docx_第1页
第1页 / 共8页
实验四银行家算法的实现.docx_第2页
第2页 / 共8页
实验四银行家算法的实现.docx_第3页
第3页 / 共8页
实验四银行家算法的实现.docx_第4页
第4页 / 共8页
实验四银行家算法的实现.docx_第5页
第5页 / 共8页
点击查看更多>>
下载资源
资源描述

实验四银行家算法的实现.docx

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

实验四银行家算法的实现.docx

实验四银行家算法的实现

银行家算法的实现

一、初始化

由用户输入数据,分别对可利用资源向量矩阵AVAILABLE、最大需求矩阵MAX、分配矩阵ALLOCATION、需求矩阵NEED赋值。

 

二、银行家算法

在避免死锁的方法中,所施加的限制条件较弱,有可能获得令人满意的系统性能。

在该方法中把系统的状态分为安全状态和不安全状态,只要能使系统始终都处于安全状态,便可以避免发生死锁。

银行家算法的基本思想是分配资源之前,判断系统是否是安全的;若是,才分配。

它是最具有代表性的避免死锁的算法。

设进程cusneed提出请求REQUEST[i],则银行家算法按如下规则进行判断。

(1)如果REQUEST[cusneed][i]<=NEED[cusneed][i],则转

(2);否则,出错。

(2)如果REQUEST[cusneed][i]<=AVAILABLE[cusneed][i],则转(3);否则,出错。

(3)系统试探分配资源,修改相关数据:

AVAILABLE[i]-=REQUEST[cusneed][i];

ALLOCATION[cusneed][i]+=REQUEST[cusneed][i];

NEED[cusneed][i]-=REQUEST[cusneed][i];

(4)系统执行安全性检查,如安全,则分配成立;否则试探险性分配作废,系统恢复原状,进程等待。

三、安全性检查算法

(1)设置两个工作向量Work=AVAILABLE;FINISH

(2)从进程集合中找到一个满足下述条件的进程,

FINISH==false;

NEED<=Work;

如找到,执行(3);否则,执行(4)

(3)设进程获得资源,可顺利执行,直至完成,从而释放资源。

Work+=ALLOCATION;

Finish=true;

GOTO2

(4)如所有的进程Finish=true,则表示安全;否则系统不安全。

 各算法流程图

初始化算法流程图:

银行家算法流程图:

安全性算法流程图:

源程序清单

#include

usingnamespacestd;

#defineMAXPROCESS50                       /*最大进程数*/

#defineMAXRESOURCE100                       /*最大资源数*/

intAVAILABLE[MAXRESOURCE];                   /*可用资源数组*/

intMAX[MAXPROCESS][MAXRESOURCE];           /*最大需求矩阵*/

intALLOCATION[MAXPROCESS][MAXRESOURCE];   /*分配矩阵*/

intNEED[MAXPROCESS][MAXRESOURCE];           /*需求矩阵*/

intREQUEST[MAXPROCESS][MAXRESOURCE];       /*进程需要资源数*/

boolFINISH[MAXPROCESS];                       /*系统是否有足够的资源分配*/

intp[MAXPROCESS];                            /*记录序列*/

intm,n;                                   /*m个进程,n个资源*/

voidInit();

boolSafe();

voidBank();

intmain()

{

   Init();

   Safe();

   Bank();

}

voidInit()               /*初始化算法*/

{

   inti,j;

   cout<<"请输入进程的数目:

";

   cin>>m;

   cout<<"请输入资源的种类:

";

   cin>>n;

   cout<<"请输入每个进程最多所需的各资源数,按照"<

   for(i=0;i

   for(j=0;j

   cin>>MAX[i][j];

   cout<<"请输入每个进程已分配的各资源数,也按照"<

   for(i=0;i

   {

       for(j=0;j

       {

           cin>>ALLOCATION[i][j];

           NEED[i][j]=MAX[i][j]-ALLOCATION[i][j];

           if(NEED[i][j]<0)

           {

               cout<<"您输入的第"<

"<

               j--;

               continue;

           }

       }

   }

   cout<<"请输入各个资源现有的数目:

"<

   for(i=0;i

   {

       cin>>AVAILABLE[i];

   }

}

voidBank()               /*银行家算法*/

{

   inti,cusneed;

   charagain;

   while

(1)

   {

       cout<<"请输入要申请资源的进程号(注:

第1个进程号为0,依次类推)"<

       cin>>cusneed;

       cout<<"请输入进程所请求的各资源的数量"<

       for(i=0;i

       {

           cin>>REQUEST[cusneed][i];

       }

       for(i=0;i

       {

           if(REQUEST[cusneed][i]>NEED[cusneed][i])

           {

               cout<<"您输入的请求数超过进程的需求量!

请重新输入!

"<

               continue;

           }

           if(REQUEST[cusneed][i]>AVAILABLE[i])

           {

               cout<<"您输入的请求数超过系统有的资源数!

请重新输入!

"<

               continue;

           }

       }

       for(i=0;i

       {

           AVAILABLE[i]-=REQUEST[cusneed][i];

           ALLOCATION[cusneed][i]+=REQUEST[cusneed][i];

           NEED[cusneed][i]-=REQUEST[cusneed][i];

       }

       if(Safe())

       {

           cout<<"同意分配请求!

"<

       }

       else

       {

           cout<<"您的请求被拒绝!

"<

           for(i=0;i

           {

               AVAILABLE[i]+=REQUEST[cusneed][i];

               ALLOCATION[cusneed][i]-=REQUEST[cusneed][i];

               NEED[cusneed][i]+=REQUEST[cusneed][i];

           }

       }

       for(i=0;i

       {

           FINISH[i]=false;

       }

       cout<<"您还想再次请求分配吗?

是请按y/Y,否请按其它键"<

       cin>>again;

       if(again=='y'||again=='Y')

       {

           continue;

       }

       break;

       }

}

boolSafe()                                   /*安全性算法*/

{

   inti,j,k,l=0;

   intWork[MAXRESOURCE];                   /*工作数组*/

   for(i=0;i

   Work[i]=AVAILABLE[i];

   for(i=0;i

   {

       FINISH[i]=false;

   }

   for(i=0;i

   {   

       if(FINISH[i]==true)

       {

           continue;

       }

       else

       {

           for(j=0;j

           {

               if(NEED[i][j]>Work[j])

               {

                   break;

               }

           }

           if(j==n)

           {

               FINISH[i]=true;

               for(k=0;k

               {

                   Work[k]+=ALLOCATION[i][k];

               }

               p[l++]=i;

               i=-1;

           }

           else

           {

               continue;

           }

       }

       if(l==m)

       {

           cout<<"系统是安全的"<

           cout<<"安全序列:

"<

           for(i=0;i

           {

               cout<

               if(i!

=l-1)

               {

                   cout<<"-->";

               }

           }

           cout<<""<

           returntrue;

       }

   }

   cout<<"系统是不安全的"<

   returnfalse;

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

当前位置:首页 > 外语学习 > 英语考试

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

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