[オペレーティングシステム]銀行家のアルゴリズム

銀行家のアルゴリズム

ブログのアドレス:https://www.iamzlt.com/?p=87

(A)目的及び要件

バンカーは、デッドロックのアルゴリズムは、ダイクストラ最も代表的な設計により、アルゴリズムであることは避けてください。本研究では、シミュレーションアルゴリズムは、高レベル言語で銀行家を準備するように要求しました。私たちは、この実験により、デッドロック防止と銀行家のアルゴリズムのより深い理解を有することができます。

(B)実験内容

1 、データ構造内

ベクターを含むリソース(Availiable)、最大需要マトリックス(最大)、割当て行列(割り当て)、要求マトリックス(必要性)

2 、アルゴリズム設計のセキュリティ

設定作業は、システム提供のベクトル作業プロセスは、完了には、システムがプロセスに割り当てられた十分なリソースを持っているかどうかを示すを利用可能なリソースの数を実行し続けていることを示しています

(C)実験環境

  1. パーソナルコンピュータ
  2. VC ++
[ファイル名を指定して実行]コード
#include<iostream>

#include<bits/stdc++.h>

#define MAXN 100

#define NAME_MAX

using namespace std;

const int PNumber=5;

const int SNumber=3;

char Source[PNumber];

int Request[SNumber];

int Available[SNumber]={3,3,2};

int MAX[PNumber][SNumber]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}};

int Allocation[PNumber][SNumber]={{0,1,0},{2,0,0},{3,0,2},{2,1,1},{0,0,2}};

int Need[PNumber][SNumber]={{7,4,3},{1,2,2},{6,0,0},{0,1,1},{4,3,1}};

int OP[PNumber][SNumber];

//int Over[PNumber];




bool judgement(int n){

    int flag=0;

    for(int j=0; j<SNumber; j++)

        if(Need[n][j]==0) flag++;

    if(flag==SNumber)return false;

    return true;

}




void initialize(){

    int i;

    for(i=0; i<PNumber; i++)

        if(!judgement(i)){

            for(int j=0; j<SNumber; j++) Available[j]+=MAX[i][j];

            cout<<"进程P"<<i+1<<"所需的资源全部满足,此进程运行完毕!"<<endl;

        }

    cout<<"此刻进程中存在的进程:"<<endl;

    for(i=0; i<PNumber; i++)

        if(judgement(i))    cout<<"P"<<i+1<<'\t';







    cout<<endl<<"此刻系统可利用的资源(单位:个):"<<endl;

    for(i=0; i<SNumber; i++)

        printf("%c\t",'A'+i);

    cout<<endl;

    for(i=0; i<SNumber; i++)

        cout<<Available[i]<<'\t';

    cout<<endl<<"此刻各进程已占有资源如下(单位:个):"<<endl;

    for(i=0; i<SNumber; i++)

        printf("\t%c",'A'+i);

    cout<<endl;

    for(i=0; i<PNumber; i++)

        if(judgement(i)){

            cout<<"P"<<i+1<<'\t';

            for(int j=0; j<SNumber; j++)

                cout<<MAX[i][j]-Need[i][j]<<'\t';

            cout<<endl;

        }

    cout<<"各进程运行完毕还需各资源如下(单位:个):"<<endl;

    for(i=0; i<SNumber; i++)

        printf("\t%c",'A'+i);

    cout<<endl;

    for(i=0; i<PNumber; i++)

        if(judgement(i)){

            cout<<"P"<<i+1<<'\t';

            for(int j=0; j<SNumber; j++)

                cout<<Need[i][j]<<'\t';

            cout<<endl;

        }

}

void systemstatus(){




}

int security(int n){

    int Work[SNumber],i;

    bool Finish[PNumber];

    for(i=0; i<PNumber; i++)

        Finish[i]=false;

    for(i=0; i<SNumber; i++)

        Work[i]=Available[i];

    for(i=0; i<PNumber; i++){

        int flag=1;

        for(int j=0; j<SNumber; j++)

            if(!(Need[i][j]<=Work[j])) flag=0;

        if(!Finish[i]&&flag){

            for(int j=0; j<SNumber; j++)

                Work[j]+=Allocation[i][j];

            Finish[i]=true;

            //cout<<i<<endl;

            i=-1;

            continue;

        }

    }

    int flag=1;

    for(i=0; i<PNumber; i++)

        if(!Finish[i]) flag=0;

    if(flag==1){

            //

    }else{

        cout<<"不能满足申请,此进程挂起,原因为:"<<endl;

        cout<<"若满足申请,系统将进入不安全状态,可能导致死锁!"<<endl;

        return 0;

    }

    return 1;

}




void banker(int n){

    for(int i=0; i<SNumber; i++)

        if(!(Request[i]<=Need[n][i])){

            cout<<"不能满足申请,此进程挂起,原因为:"<<endl;

            cout<<"申请的资源中某种资源大于其声明的需求量!"<<endl;

            return;

        }

    for(int i=0; i<SNumber; i++)

        if(!(Request[i]<=Available[i])){

            cout<<"不能满足申请,此进程挂起,原因为:"<<endl;

            cout<<"申请的资源大于系统可提供的资源量,P"<<n+1<<"需等待"<<endl;

            return;

        }

    for(int i=0; i<SNumber; i++){

        Available[i]-=Request[i];

        Allocation[n][i]+=Request[i];

        Need[n][i]-=Request[i];

    }

    if(security(n)==1){

        cout<<"可以满足申请,";

        initialize();

    }else{

        for(int i=0; i<SNumber; i++){

            Available[i]+=Request[i];

            Allocation[n][i]-=Request[i];

            Need[n][i]+=Request[i];

        }

    }

}




int main(){

    initialize();

    int n,i;

    while(1){

        cout<<"输入发出请求的进程(输入‘0’退出系统):";

        cin>>n;

        if(n==0) break;

        cout<<"此进程申请个资源数目:"<<endl;

        for(i=0; i<SNumber; i++){

            printf("%c",'A'+i);

            cout<<"资源:";

            cin>>Request[i];

        }

        banker(n-1);

    }

}

[結果]実行

結果分析]

まず:銀行家のアルゴリズムを検査するP4リソース要求、P4の要求ベクトル(0,1,0)、

  1. 要求(0,1,0)<=必要があります(0,1,1、)
  2. 要求(0,1,0)<= Availabele(3,2,2)
  3. P4システムは、第一リソースを割り当て、値を変更すると仮定しました
  4. このシステムは安全であるかどうかを使用するセキュリティアルゴリズムをチェック
 

同様に第二の、第三のを決定することができます。

最後に、リソース要求P2、P4の要求ベクトル(1,2,2)では、アプリケーションおよびP2のすべてを満たすために必要なリソースを満たすために、完成したランニングは、システムリソースは、現時点で利用可能な、リソースのシェアをリリースする予定{5,2,2}。

公開された24元の記事 ウォン称賛7 ビュー1895

おすすめ

転載: blog.csdn.net/weixin_43426647/article/details/105328092