银行家算法 c++ 简要 演示

来源:岁月联盟 编辑:exp 时间:2012-08-07
 T0时刻系统状态表:
最大资源需求量
已分配资源数量
A    B    C
 A    B    C
P1
 5    5    9
 2    1    2
P2
 5    3    6
 4    0    2
P3
 4    0    11
 4    0    5
P4
 4    2    5
 2    0    4
P5
 4    2    4
 3    1    4
资源总量:A 17 B 5 C 20
安全性检测的原则是:
1 进程申请资源可分布申请,但总量不应超过其最大需求量
2 每次申请的资源量必须小于系统可供使用的资源量
3 分配完成后,系统是安全的,即仍存在一个序列,可以运行完当前所有进程,这是关键
笔者写了一个程序可以完整演示整个测试流程,看一下运行结果即可理解银行家算法,代码在vc6下测试完美通过。
附上完整代码与注释:
[cpp]
#include<iostream> 
using namespace std; 
 
#define M 5//进程数 
#define N 3//资源数 
 
int R[N]={17,5,20};//资源总数 
int Maxall[N]={0};//被占用的资源数 
int V[N]={0};//可用资源总数 
 
int Max[M][N]={{5,5,9},{5,3,6},{4,0,11},{4,2,5},{4,2,4}};//各进程最大需求量 
int Alloc[M][N]={{2,1,2},{4,0,2},{4,0,5},{2,0,4},{3,1,4}};//各进程已经分配的资源量 
int Need[M][N]={0};//各进程还需要的资源量 
int Appli[M][N]={0};//一次为某个进程申请的资源量 
 
int i,j,n;//程序中用 
 
 
 
int main() 

    void init(); 
    void show(); 
    int applicate(int,int,int,int); 
    void update(int,int,int,int); 
    void release(int,int,int,int); 
    int safecheck(); 
    init(); 
    show(); 
    safecheck();//这里安排显示了按安全序列执行完毕前后的系统状态 
    show(); 
    return 0; 

 
void init()//初始化状态 

/*  cout<<"请依次输入各进程对资源最大需求量:"<<endl;
    for(i=0;i<M;i++)
        for(j=0;j<N;j++)
        {
            cout<<i<<"进程"<<j<<"资源:"<<endl;
            cin>>Max[i][j];
        }
    cout<<"请依次输入各进程已分配资源:"<<endl;
    for(i=0;i<M;i++)
        for(j=0;j<N;j++)
        {
            cout<<i<<"进程"<<j<<"资源:"<<endl;
            cin>>Alloc[i][j];
        }
    cout<<"请依次输入各资源总数:"<<endl;
    for(j=0;j<N;j++)
    {
        cout<<j<<"资源:"<<endl;
        cin>>R[j];
    }
*/ 
//本可以自行输入的,此处为避免大量输入,在程序中初始化 
    for(i=0;i<M;i++) 
        for(j=0;j<N;j++) 
            Need[i][j]=Max[i][j]-Alloc[i][j]; 
 
    for(j=0;j<N;j++) 
        for(i=0;i<M;i++) 
            Maxall[j]+=Alloc[i][j]; 
 
    for(j=0;j<N;j++) 
        V[j]=R[j]-Maxall[j]; 

 
void show()//显示系统状态 

    cout<<"Max:"<<endl; 
    for(i=0;i<M;i++) 
    { 
        for(j=0;j<N;j++) 
            cout<<Max[i][j]<<" "; 
        cout<<endl; 
    } 
    cout<<endl; 
    cout<<"Alloc:"<<endl; 
    for(i=0;i<M;i++) 
    { 
        for(j=0;j<N;j++) 
            cout<<Alloc[i][j]<<" "; 
        cout<<endl; 
    } 
    cout<<endl; 
    cout<<"Need:"<<endl; 
    for(i=0;i<M;i++) 
    { 
        for(j=0;j<N;j++) 
            cout<<Need[i][j]<<" "; 
        cout<<endl; 
    } 
    cout<<endl; 
    cout<<"系统总资源:"<<endl; 
    for(n=0;n<N;n++) 
        cout<<R[n]<<" "; 
    cout<<endl; 
    cout<<"系统剩下的资源"<<endl; 
    for(j=0;j<N;j++) 
    { 
        cout<<V[j]<<" "; 
    } 
    cout<<endl; 

 
int applicate(int i,int r1,int r2,int r3)//资源申请 

    Appli[i][0]=r1; 
    Appli[i][1]=r2; 
    Appli[i][2]=r3; 
    if((Appli[i][0]<=Need[i][0] && Appli[i][1]<=Need[i][1] && Appli[i][2]<=Need[i][2]) && (Appli[i][0]<=V[0] && Appli[i][1]<=V[1] && Appli[i][2]<=V[2])) 
    { 
//      cout<<"申请成功,但还未进行安全性检测..."<<endl; 
        return 1; 
    } 
    else 
    { 
//      cout<<"申请失败..."<<endl; 
        return 0; 
    } 

 
void update(int i,int r1,int r2,int r3)//分配资源,注意保证数据的一致性 

    Alloc[i][0]+=r1; Alloc[i][1]+=r2; Alloc[i][2]+=r3; 
    Need[i][0]-=r1;  Need[i][1]-=r2;  Need[i][2]-=r3; 
    V[0]-=r1;        V[1]-=r2;        V[2]-=r3; 

 
void release(int i,int r1,int r2,int r3)//释放资源,注意保证数据的一致性 

    Alloc[i][0]-=r1; Alloc[i][1]-=r2; Alloc[i][2]-=r3; 
    Need[i][0]+=r1;  Need[i][1]+=r2;  Need[i][2]+=r3; 
    V[0]+=r1;        V[1]+=r2;        V[2]+=r3; 

 
int safecheck()//检测安全性,反复M次寻找一个可执行的进程,执行完后释放资源,再往复下一步 

    int count=0; 
    cout<<endl<<endl; 
    cout<<"开始安全性测试:(此测试将改动数据,即执行完整个进程,正式的检测应有备份数据,此处只演示检测过程,为节省篇幅省略)"<<endl; 
    while(count<5) 
    { 
        for(int m=0;m<M;m++) 
        { 
            if(applicate(m,Need[m][0],Need[m][1],Need[m][2]) ) 
            { 
                if(((Alloc[m][0]==0)&&(Alloc[m][1]==0)&&(Alloc[m][2]==0))) 
                    continue; 
                update(m,Need[m][0],Need[m][1],Need[m][2]); 
                release(m,Alloc[m][0],Alloc[m][1],Alloc[m][2]); 
                cout<<"进程"<<m<<"顺利结束"<<endl; 
                count++; 
                show();//这样你可以观察到每一个细致的变化 
                break; 
            } 
        } 
    } 
    cout<<"至此队列执行结束!"<<endl<<endl<<endl; 
    return 1; 

作者:goodcat12