银行家算法Banker‘s Algorithm(c++简单实现)

死锁问题的避免——银行家算法

银行家算法的数据结构

  • 可利用资源向量Available
  • 最大需求矩阵Max
  • 已分配矩阵Allocation
  • 仍然需求矩阵Need

银行家算法

设Requesti 是进程Pi的请求量,如果Requesti[j]=k,表示进程Pi需要K个Rj类型的资源。当Pi发出资源请求后,系统按下述步骤进行检查。

a) 如果Requesti[j] <=Need[I,j],便转向步骤(b);否则认为出错,因为他所需要的资源数已经超过它所宣布的最大值。

b) 如果Requesi[j] <=Available[j],便转向步骤(c);否则,表示尚无足够的资源,Pi须等待。

c) 系统试探着把资源分配给进程Pi,并修改下面的数据结构中的数值:

Available[j] := Available[j] – Request i[j];

Allocation[i, j] :=Allocation[i, j] + Request i[j];

Need[i, j] := Need[i, j] – Request i[j];

d) 系统执行安全性算法,检查此次资源分配后系统是否处于安全状态。若安全,才正式将资源分配给进程Pi,已完成本次资源的分配;否则,将本次的试探分配作废,恢复原来的资源分配状态,让进程Pi等待。

安全算法

(1) 设置两个向量:

① 工作向量Work,它表示系统可提供给进程继续运行所需的各类资源数目,它含有m个元素,在执行安全算法开始时,Work :=Available。

② Finish,他表示系统是否有足够的资源分配给进程,使之运行完成。开始时先做Finish := false;当有足够资源分配给进程时,再令Finish[i] :=true。

(2) 从进程集合中找到一个满足下述条件的进程:

① Finish[i] := false;

② Need[i, j] <= Work[j]; 若找到,执行步骤(3),否则,执行步骤(4)。

(3) 当进程Pi获得资源后,可顺利执行,直至完成,并释放出分配给他的资源,故应执行:

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

Finish[i] :=true;

Go to step2;

(4) 如果所有进程的Finish[i] = true 都满足,则表示系统处于安全状态;否则,系统处于不安全状态。

#include<bits/stdc++.h>
using namespace std;
#define maxsize 10

char Res[maxsize]={0};                  //资源名
int Available[maxsize]={0};             //可利用资源
int Max[maxsize][maxsize]={0};          //最大需求矩阵
int Allocation[maxsize][maxsize]={0};   //已分配矩阵
int Need[maxsize][maxsize]={0};         //需求矩阵

int Work;                               //资源数

bool Finish[maxsize]={false};           

int main(){
    cout<<"请按顺序输入:资源种类,数目(q to quit)(max<=10)"<<endl;
    char ch;
    int Resnum=0;
    while(cin>>ch&&ch!='q'){
        Res[Resnum]=ch;
        cin>>Available[Resnum++];
    }
    cout<<"当前资源目录:"<<endl;
    cout<<"资源类型     资源数目"<<endl;
    for(int i=0;i<Resnum;++i){
        cout<<"   "<<Res[i]<<"            "<<Available[i]<<endl;
        Work+=Available[i];
    }
    int n;
    cout<<"请输入进程个数(max<=10)"<<endl;
    cin>>n;
    for(int i=0;i<n;++i){
        cout<<"请按顺序输入第"<<i+1<<"个进程所需的资源类型、资源数目";
        int ch1;
        int num;
        cin>>ch1>>num;
        Need[i][ch1]=num;
        if(Need[i][ch1]<=Available[ch1-1]){           //Need[i][ch1]表示第i个进程所需ch1资源的个数
            Available[ch1-1]-=Need[i][ch1];
            Finish[i]=true;
        }
    }
    int flag=0;
    for(int i=0;i<n;++i){
        if(!Finish[i])
            flag=1;
    }
    if(flag)
        cout<<"不安全";
    else
        cout<<"安全";


}

银行家算法Banker‘s Algorithm(c++简单实现)
银行家算法Banker‘s Algorithm(c++简单实现)

上一篇:c++ 队列算法


下一篇:java实现队列