⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 222.c

📁 模拟实现银行家算法
💻 C
字号:
#include<iostream>   

using namespace std;

#define False 0

#define True 1


int    Allocation[5][3]={{0,1,0},{2,0,0},{3,0,2},{2,1,1},{0,0,2}};
int    Max[5][3]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}};
int    Need[5][3]={{7,4,3},{1,2,2},{6,0,0},{0,1,1},{4,3,1}};
int    Available[3]={3,3,2};

bool safe=true;//全局safe变量来观察整个变化过程中系统的安全性

int request[3]={0,0,0};
int Rp=0;//某时刻发出请求的进程号
int safeArray[5]={0};

int work[3]={0};



void getRequest(){
    cout<<"请输入进程号和请求资源的数目"<<endl;
    cout<<"如:进程号 资源数A B C"<<endl;
    cout<<"        0          2 0 2"<<endl;

    cin>>Rp;
    cin>>request[0];
    cin>>request[1];
    cin>>request[2];

    cout<<"进程号"<<Rp<<endl;
    cout<<"请求资源为"
        <<request[0]
        <<" "
        <<request[1]
        <<" "
        <<request[2]
        <<endl;        
}


//back函数用来进行回滚,当检查到请求会造成系统不安全时对改变的所有资源的值进行回滚
void back(){
    int i=0;
    do{
        Need[Rp][i]+=request[i];
        Available[i]+=request[i];
        Allocation[Rp][i]-=request[i];
            i++;
    }while(i<3);
}

void Getneed(){

    for(int i=0;i<2;i++){
        Need[Rp][i]-=request[i];
        Available[i]-=request[i];
        Allocation[Rp][i]+=request[i];
    }
    
    cout<<"各进程还需要的资源为:"<<endl;

    for(int t=0;t<5;t++){
        cout<<t<<":"
            <<Need[t][0]<<" "
            <<Need[t][1]<<" "
            <<Need[t][2]<<endl;
    }

    cout<<"Available:"
        <<Available[0]
        <<" "
        <<Available[1]
        <<" "
        <<Available[2]
        <<endl;
    
}

//安全算法

void IsSafe(int a1,int a2,int a3){
    
    int work[3]={0};
    work[0]=a1;
    work[1]=a2;
    work[2]=a3;

    int finish[5]={False};

    int sa=0,m=0;

    do{
            for(int z=0;z<5;z++){

                if((finish[z]==False)
                    &&(Need[z][0]<=work[0])
                    &&(Need[z][1]<=work[1])
                    &&(Need[z][2]<=work[2])){

                    safeArray[sa]=z;

                    for(int o=0;o<3;o++){
                        work[o]+=Allocation[z][o];
                    }
                    finish[z]=1;
                    z=5;
                }    
            }
        sa++;
    }while(sa<5);

    if((finish[0]==1)
        &&(finish[1]==1)
        &&(finish[2]==1)
        &&(finish[3]==1)
        &&(finish[4]==1)){

        safe=true;
    }
    else{
        safe=false;
    }
}

void RequestIsSafe(){
    
    if((request[0]<=Need[Rp][0])
        &&(request[1]<=Need[Rp][1])
        &&(request[2]<=Need[Rp][2])
        &&(request[0]<=Available[0])
        &&(request[1]<=Available[1])
        &&(request[2]<=Available[2])){
        safe=true;

    }else
        safe=false;        

}


//判断资源被请求后整个系统是不是能够到达安全状态
void isAllSafe(){

    RequestIsSafe();

    Getneed();

    if(safe==true){
        IsSafe(Available[0],Available[1],Available[2]);
    }

    if(safe==true){
        cout<<"这样配置资源是安全的!"<<endl;
        cout<<"安全序列是:";
        for(int i=0;i<5;i++){
            cout<<"--->"
                <<safeArray[i];
        }
        cout<<endl;
    }
    else
    {
        back();
        cout<<"不安全!!"<<endl;
    }
}



void main(){

    do{
        char yes='y';

        getRequest();

        isAllSafe();
        
        if(safe==false)
            break;

        cout<<"有进程发出Request请求吗?<ENTER y or n>";
            cin>>yes;
        if(yes=='n')
            break;
    }while(true);
   
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -