銀行家算法以及流程圖


銀行家算法及流程圖

算法的實現

一、初始化

由用戶輸入數據,分別對可利用資源向量矩陣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;

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM