银行家算法

来源:互联网 发布:ios 淘宝下拉刷新 编辑:程序博客网 时间:2024/06/05 20:11

银行家算法(Banker’s Algorithm)是一个避免死锁(Deadlock)的著名算法,是由艾兹格·迪杰斯特拉在1965年为T.H.E系统设计的一种避免死锁产生的算法。它以银行借贷系统的分配策略为基础,判断并保证系统的安全运行。

算法原理

我们可以把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。
为保证资金的安全,银行家规定:
(1) 当一个顾客对资金的最大需求量不超过银行家现有的资金时就可接纳该顾客;
(2) 顾客可以分期贷款,但贷款的总数不能超过最大需求量;
(3) 当银行家现有的资金不能满足顾客尚需的贷款数额时,对顾客的贷款可推迟支付,但总能使顾客在有限的时间里得到贷款;
(4) 当顾客得到所需的全部资金后,一定能在有限的时间里归还所有的资金.
操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。当进程在执行中继续申请资源时,先测试该进程本次申请的资源数是否超过了该资源所剩余的总量。若超过则拒绝分配资源,若能满足则按当前的申请量分配资源,否则也要推迟分配。

数据结构

1)可利用资源向量Available
是个含有m个元素的数组,其中的每一个元素代表一类可利用的资源数目。如果Available[j]=K,则表示系统中现有Rj类资源K个。
2)最大需求矩阵Max
这是一个n×m的矩阵,它定义了系统中n个进程中的每一个进程对m类资源的最大需求。如果Max[i,j]=K,则表示进程i需要Rj类资源的最大数目为K。
3)分配矩阵Allocation
这也是一个n×m的矩阵,它定义了系统中每一类资源当前已分配给每一进程的资源数。如果Allocation[i,j]=K,则表示进程i当前已分得Rj类资源的 数目为K。
4)需求矩阵Need。
这也是一个n×m的矩阵,用以表示每一个进程尚需的各类资源数。如果Need[i,j]=K,则表示进程i还需要Rj类资源K个,方能完成其任务。
Need[i,j]=Max[i,j]-Allocation[i,j]

算法实现

初始化
由用户输入数据,分别对可利用资源向量矩阵AVAILABLE、最大需求矩阵MAX、分配矩阵ALLOCATION、需求矩阵NEED赋值。

银行家算法
在避免死锁的方法中,所施加的限制条件较弱,有可能获得令人满意的系统性能。在该方法中把系统的状态分为安全状态和不安全状态,只要能使系统始终都处于安全状态,便可以避免发生死锁。
银行家算法的基本思想是分配资源之前,判断系统是否是安全的;若是,才分配。它是最具有代表性的避免死锁的算法。
设进程cusneed提出请求REQUEST [i],则银行家算法按如下规则进行判断。
(1)如果REQUEST [cusneed] [i]<= NEED[cusneed][i],则转(2);否则,出错。
(2)如果REQUEST [cusneed] [i]<= AVAILABLE[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=Work+ALLOCATION;
Finish=true;
GOTO 2
(4)如所有的进程Finish= true,则表示安全;否则系统不安全。

银行家算法初始化流程图

这里写图片描述

代码实现

#include"iostream"#include"string.h"using namespace std; struct node{    int allocation[100],claim[100],need[100],work[100];};int Jnum,Znum;int Xt[100];node Jc[100];bool sign=false;bool biaoji[100];int xulie[100];void output(){    cout<<"系统目前情况如下:"<<endl;    cout<<"      Clain     Allocation   Need"<<endl;    for(int i=0;i<Jnum;i++)    {        cout<<"P"<<i<<"     ";        for(int j=0;j<Znum;j++)        {            cout<<Jc[i].claim[j]<<" ";        }        cout<<"   ";        for(int j=0;j<Znum;j++)        {            cout<<Jc[i].allocation[j]<<" ";        }        cout<<"   ";        for(int j=0;j<Znum;j++)        {            Jc[i].need[j]=Jc[i].claim[j]-Jc[i].allocation[j];            cout<<Jc[i].need[j]<<" ";        }        cout<<endl;    }    cout<<"Available: ";    for(int i=0;i<Znum;i++)    {        cout<<Xt[i]<<" ";    }    cout<<endl;}void Safecheck(int cur){    if(sign)        return;    if(cur==Jnum)    {        sign=true;        return ;    }    for(int i=0;i<Jnum;i++)    {        bool can=true;        for(int j=0;j<Znum;j++)        {            Jc[i].work[j]=Xt[j];            if(Jc[i].need[j]>Xt[j])            {                can=false;            }        }        if(can&&!biaoji[i])        {            xulie[cur]=i;            biaoji[i]=true;            cout<<"P"<<i<<"     ";            for(int j=0;j<Znum;j++)            {                cout<<Jc[i].work[j]<<" ";            }            cout<<"   ";            for(int j=0;j<Znum;j++)            {                cout<<Jc[i].need[j]<<" ";            }            cout<<"   ";            for(int j=0;j<Znum;j++)            {                cout<<Jc[i].allocation[j]<<" ";            }            cout<<"       ";            for(int j=0;j<Znum;j++)            {                cout<<Jc[i].work[j]+Jc[i].allocation[j]<<" ";            }            cout<<"        ";            cout<<biaoji[i]<<endl;            for(int j=0;j<Znum;j++)            {                Xt[j]+=Jc[i].allocation[j];            }            Safecheck(cur+1);            for(int j=0;j<Znum;j++)            {                Xt[j]-=Jc[i].allocation[j];            }        }    }}int main(){    memset(biaoji,false,sizeof(biaoji));    cout<<"                      银行家算法"<<endl;    cout<<"输入进程个数:";    cin>>Jnum;    cout<<"输入各类资源总数:";    cin>>Znum;    cout<<"输入各类资源总数:";    for(int i=0;i<Znum;i++)    {        cin>>Xt[i];    }    cout<<"输入对资源的最大需求量Clain<A B C>:"<<endl;    for(int i=0;i<Jnum;i++)    {        cout<<"进程"<<i<<":";        for(int j=0;j<Znum;j++)        {            cin>>Jc[i].claim[j];        }    }    cout<<"输入已分配资源Allocation<A B C>:"<<endl;    for(int i=0;i<Jnum;i++)    {        cout<<"进程"<<i<<":";        for(int j=0;j<Znum;j++)        {            cin>>Jc[i].allocation[j];            Xt[j]-=Jc[i].allocation[j];        }    }    output();    cout<<"安全性检查:"<<endl;    cout<<"      Work     Need      Allocation   Work+Allocation   possible"<<endl;    Safecheck(0);    if(sign)    {        cout<<"存在安全序列:";        for(int i=0;i<Jnum-1;i++)            cout<<"P"<<xulie[i]<<"->";        cout<<"P"<<xulie[Jnum-1]<<endl;        cout<<"系统安全....."<<endl<<endl;    }    else    {        cout<<"不存在安全序列   系统不安全.....";        return 0;    }    while(cout<<"输入申请的进程号:")    {        int num;        cin>>num;        cout<<"输入进程请求资源数量Request<a,b,c>:";        int req[100];        for(int i=0;i<Znum;i++)        {            cin>>req[i];        }        bool check=true;        for(int i=0;i<Znum;i++)        {            if(req[i]>Jc[num].need[i])                check=false;        }        if(check)            cout<<"进程申请量不超其需求量"<<endl;        else            cout<<"进程申请量超过其需求量"<<endl;        bool check1=true;        for(int i=0;i<Znum;i++)        {            if(req[i]>Xt[i])                check1=false;        }        if(check1)            cout<<"进程申请量不超当前系统拥有资源量"<<endl;        else            cout<<"进程申请量超过当前系统拥有资源量"<<endl;        if(check&&check1)        {            for(int i=0;i<Znum;i++)            {                Jc[num].allocation[i]+=req[i];                Xt[i]-=req[i];                Jc[num].need[i]-=req[i];            }            output();            sign=false;            memset(biaoji,false,sizeof(biaoji));            cout<<"安全性检查:"<<endl;            cout<<"      Work     Need      Allocation   Work+Allocation   possible"<<endl;            Safecheck(0);            if(sign)            {                cout<<"存在安全序列:";                for(int i=0;i<Jnum-1;i++)                cout<<"P"<<xulie[i]<<"->";                cout<<"P"<<xulie[Jnum-1]<<endl;                cout<<"系统安全....."<<endl<<endl;            }            else            {                cout<<"不存在安全序列   返回系统资源";                 for(int i=0;i<Znum;i++)                {                    Jc[num].allocation[i]-=req[i];                    Xt[i]+=req[i];                    Jc[num].need[i]+=req[i];                }            }        }        else            cout<<"分配内存失败!"<<endl;    }}
1 0