银行家算法以及流程图



2013-05-20 17:15 
夏洛克·福尔摩斯 
阅读(12833
评论(0
编辑 
收藏 
举报

银行家算法及流程图

算法的实现

一、初始化

由用户输入数据,分别对可利用资源向量矩阵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;

GOTO 2

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

各算法流程图

初始化算法流程图:

 

 

 

银行家算法流程图:

 

 

 

安全性算法流程图:

 

 

 

源程序清单

 

#include <iostream>
using
namespace std;
#define
MAXPROCESS
50                       
/*最大进程数*/
#define
MAXRESOURCE
100                       
/*最大资源数*/
int
AVAILABLE[MAXRESOURCE];                   
/*可用资源数组*/
int
MAX[MAXPROCESS][MAXRESOURCE];           
/*最大需求矩阵*/
int
ALLOCATION[MAXPROCESS][MAXRESOURCE];    /*分配矩阵*/
int
NEED[MAXPROCESS][MAXRESOURCE];           
/*需求矩阵*/
int
REQUEST[MAXPROCESS][MAXRESOURCE];       
/*进程需要资源数*/
bool
FINISH[MAXPROCESS];                       
/*系统是否有足够的资源分配*/
int
p[MAXPROCESS];                            
/*记录序列*/
int
m,n;                                   
/*m个进程,n个资源*/

void
Init();
bool
Safe();
void
Bank();
int
main()
{
   
Init();
   
Safe();
   
Bank();
}

void
Init()               
/*初始化算法*/
{
   
int i,j;
   
cout<<“请输入进程的数目:”;
   
cin>>m;
   
cout<<“请输入资源的种类:”;
   
cin>>n;
   
cout<<“请输入每个进程最多所需的各资源数,按照”<<m<<“x”<<n<<“矩阵输入”<<endl;
   
for(i=0;i<m;i++)
   
for(j=0;j<n;j++)
   
cin>>MAX[i][j];
   
cout<<“请输入每个进程已分配的各资源数,也按照”<<m<<“x”<<n<<“矩阵输入”<<endl;
   
for(i=0;i<m;i++)
   
{
       
for(j=0;j<n;j++)
       
{
           
cin>>ALLOCATION[i][j];
           
NEED[i][j]=MAX[i][j]-ALLOCATION[i][j];
           
if(NEED[i][j]<0)
           
{
               
cout<<“您输入的第”<<i+1<<“个进程所拥有的第”<<j+1<<“个资源数错误,请重新输入:”<<endl;
               
j–;
               
continue;
           
}
       
}
   
}
   
cout<<“请输入各个资源现有的数目:”<<endl;
   
for(i=0;i<n;i++)
   
{
       
cin>>AVAILABLE[i];
   
}
}

void
Bank()               
/*银行家算法*/
{
   
int i,cusneed;
   
char again;
   
while(1)
   
{
       
cout<<“请输入要申请资源的进程号(注:第1个进程号为0,依次类推)”<<endl;
       
cin>>cusneed;
       
cout<<“请输入进程所请求的各资源的数量”<<endl;
       
for(i=0;i<n;i++)
       
{
           
cin>>REQUEST[cusneed][i];
       
}
       
for(i=0;i<n;i++)
       
{
           
if(REQUEST[cusneed][i]>NEED[cusneed][i])
           
{
               
cout<<“您输入的请求数超过进程的需求量!请重新输入!”<<endl;
               
continue;
           
}
           
if(REQUEST[cusneed][i]>AVAILABLE[i])
           
{
               
cout<<“您输入的请求数超过系统有的资源数!请重新输入!”<<endl;
               
continue;
           
}
       
}
       
for(i=0;i<n;i++)
       
{
           
AVAILABLE[i]-=REQUEST[cusneed][i];
           
ALLOCATION[cusneed][i]+=REQUEST[cusneed][i];
           
NEED[cusneed][i]-=REQUEST[cusneed][i];
       
}
       
if(Safe())
       
{
           
cout<<“同意分配请求!”<<endl;
       
}
       
else
       
{
           
cout<<“您的请求被拒绝!”<<endl;
           
for(i=0;i<n;i++)
           
{
               
AVAILABLE[i]+=REQUEST[cusneed][i];
               
ALLOCATION[cusneed][i]-=REQUEST[cusneed][i];
               
NEED[cusneed][i]+=REQUEST[cusneed][i];
           
}
       
}
       
for(i=0;i<m;i++)
       
{
           
FINISH[i]=false;
       
}
       
cout<<“您还想再次请求分配吗?是请按y/Y,否请按其它键”<<endl;
       
cin>>again;
       
if(again==\’y\’||again==\’Y\’)
       
{
           
continue;
       
}
       
break;
       
}
}

bool
Safe()                                   
/*安全性算法*/
{
   
int i,j,k,l=0;
   
int
Work[MAXRESOURCE];                   
/*工作数组*/
   
for(i=0;i<n;i++)
   
Work[i]=AVAILABLE[i];
   
for(i=0;i<m;i++)
   
{
       
FINISH[i]=false;
   
}
   
for(i=0;i<m;i++)
   
{   
       
if(FINISH[i]==true)
       
{
           
continue;
       
}
       
else
       
{
           
for(j=0;j<n;j++)
           
{
               
if(NEED[i][j]>Work[j])
               
{
                   
break;
               
}
           
}
           
if(j==n)
           
{
               
FINISH[i]=true;
               
for(k=0;k<n;k++)
               
{
                   
Work[k]+=ALLOCATION[i][k];
               
}
               
p[l++]=i;
               
i=-1;
           
}
           
else
           
{
               
continue;
           
}
       
}
       
if(l==m)
       
{
           
cout<<“系统是安全的”<<endl;
           
cout<<“安全序列:”<<endl;
           
for(i=0;i<l;i++)
           
{
               
cout<<p[i];
               
if(i!=l-1)
               
{
                   
cout<<“–>”;
               
}
           
}
           
cout<<“”<<endl;
           
return true;
       
}
   
}
   
cout<<“系统是不安全的”<<endl;
   
return false;

 

 

 

 

版权声明:本文为sherlockhomles原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/sherlockhomles/archive/2013/05/20/3088942.html