程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 銀行家算法 c++ 簡要 演示

銀行家算法 c++ 簡要 演示

編輯:C++入門知識

 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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved