zoukankan      html  css  js  c++  java
  • 银行家算法 C++实现

    操作系统中预防死锁的银行家算法,测试用例来自《计算机操作系统(第四版)》113页例题。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #define Process_Max 100                                         //进程数量最大值
    #define Resource_Max 100                                        //资源种类最大值
    using namespace std;
    int Available[Resource_Max];                                    //系统当前每种资源可分配数
    int Max[Process_Max][Resource_Max];                             //每个进程对每种资源最大需求
    int Allocation[Process_Max][Resource_Max];                      //每个进程已分配资源
    int Need[Process_Max][Resource_Max];                            //每个进程当前需求资源
    int Work[Resource_Max];                                         //工作向量
    int Finish[Process_Max];
    int List[Process_Max];
    int instruct=0;
    int Process_Num=0,Resource_Num=0;
    int List_Num=0;
    void Input_OS()
    {
        cout << "OS" << endl;
        instruct=0;
        while(Resource_Num<1){
            cout << "输入资源种类 Enter Resource_Num:" << endl;
            cin >> Resource_Num;
        }
        cout << "输入系统当前可利用资源数 Enter Available:" << endl;
        for(int i=0;i<Resource_Num;i++)
        {
            cout << "R" << i << ":";
            cin >> Available[i];
        }
    }
    void Input_P()
    {
        instruct=0;
        int a;
        cout << "Process" << endl;
        while(Process_Num<1){
            cout << "输入进程数 Enter Process_Num:" << endl;
            cin >> Process_Num;
        }
        for(int i=0;i<Process_Num;i++)
        {
            cout << "输入进程 P" << i << "的最大资源需求 Max:" << endl;
            for(int j=0;j<Resource_Num;j++)
            {
                cout << "R" << j << ":" ;
                cin >> Max[i][j];
            }
            cout << endl;
            cout << "输入进程 P" << i << "的已分配资源 Allocation:" << endl;
            cout << "输入 -1 设置该进程剩余已分配资源为 0 :" << endl;
            for(int j=0;j<Resource_Num;j++)
            {
                cout << "R" << j << ":" ;
                cin >> a;
                if(a<0){
                    for(;j<Resource_Num;j++)Allocation[i][j]=0;
                    break;
                }
                Allocation[i][j]=a;
            }
            cout << endl;
            for(int j=0;j<Resource_Num;j++)
                Need[i][j]=Max[i][j]-Allocation[i][j];
        }
    }
    void Reset_Finish()
    {
        memset(Finish,0,sizeof(Finish));
        memset(Work,0,sizeof(Work));
        List_Num=0;
    }
    
    int Safe()                                                     //安全性算法
    {
        int flag=0,Count=0;
        cout << "Safe" << endl;
        Reset_Finish();
        cout << "     Work      Need      Allocation      Work+Allocation      Finish"<<endl;
        for(int i=0;i<Resource_Num;i++)Work[i]=Available[i];
        while(List_Num<Process_Num)
        {
            for(int i=0;i<Process_Num;i++)
            {
                if(!Finish[i])
                {
                    flag = 0;
                    for(int j=0;j<Resource_Num;j++)
                    {
                        if(Need[i][j]>Work[j])
                        {
                            flag=1;
                            break;
                        }
                    }
                    if(!flag)
                    {
                        List[List_Num++]=i;
                        cout << "P" << i <<"|";
                        for(int j=0;j<Resource_Num;j++)
                        {
                            printf("%3d",Work[j]);
                            Work[j]+=Allocation[i][j];
                        }
                        cout << "|   ";
                        for(int j=0;j<Resource_Num;j++)printf("%3d",Need[i][j]);cout << "|   ";
                        for(int j=0;j<Resource_Num;j++)printf("%3d",Allocation[i][j]);cout << "|   ";
                        for(int j=0;j<Resource_Num;j++)printf("%3d",Work[j]);cout << "|   ";
                        Finish[i]=1;
                        printf("true
    ");
                    }
                }
            }
            Count++;
            if(Count>=Process_Num)break;
        }
        if(List_Num<Process_Num)
        {
            cout << "No safe List" << endl;
            return 0;
        }
        else {
            cout << "Safe list exist" << endl;
            return 1;
        }
    }
    void Request()                                                  //银行家算法
    {
        int pro,Request_Num[Resource_Max],inst=0;
        int flag=0;
        while(!inst)
        {
            cout << "输入发出请求的进程 Enter Process_Num:" << endl;
            cin>> pro;
            cout << "输入请求向量 Enter Request_Num:" <<endl;
            for(int i=0;i<Resource_Num;i++)
            {
                cout << "R" << i << ":";
                cin>> Request_Num[i];
            }
            flag=0;
            for(int i=0;i<Resource_Num;i++)
            {
                if(Request_Num[i]>Need[pro][i])
                {
                    cout << "Error:Out of range" << endl;
                    return;
                }
            }
            for(int i=0;i<Resource_Num;i++)
            {
                if(Request_Num[i]>Available[i])
                {
                    flag=1;
                    cout <<"没有足够资源 等待..." << endl;
                    cout << "No enough resource wait..." << endl;
                }
            }
            if(!flag)
            {
                for(int i=0;i<Resource_Num;i++)
                {
                    Available[i]-=Request_Num[i];
                    Allocation[pro][i]+=Request_Num[i];
                    Need[pro][i]-=Request_Num[i];
                }
                if(!Safe())
                {
                    for(int i=0;i<Resource_Num;i++)
                    {
                        Available[i]+=Request_Num[i];
                        Allocation[pro][i]-=Request_Num[i];
                        Need[pro][i]+=Request_Num[i];
                    }
                }
            }
            cout << "------------------------------" << endl;
            cout << "请输入指令:" << endl;
            cout << "1.继续输入请求 Request" << endl;
            cout << "2.退出到主界面 Return" << endl;
            cin >> inst;
            if(inst!=1)return;
            else inst=0;
        }
    }
    
    void Banker()                                                   //计算T0时刻安全序列
    {
        instruct=0;
        int flag=0,Count=0,inst=0;
        cout << "Banker" << endl;
        cout << "     Work      Need      Allocation      Work+Allocation      Finish"<<endl;
        for(int i=0;i<Resource_Num;i++)Work[i]=Available[i];
        while(List_Num<Process_Num)                                 //银行家算法及安全性算法
        {
    
            for(int i=0;i<Process_Num;i++)
            {
                if(!Finish[i])
                {
                    flag = 0;
                    for(int j=0;j<Resource_Num;j++)
                    {
                        if(Need[i][j]>Work[j])
                        {
                            flag=1;
                            break;
                        }
                    }
                    if(!flag)
                    {
                        List[List_Num++]=i;
                        cout << "P" << i <<"|";
                        for(int j=0;j<Resource_Num;j++)
                        {
                            printf("%3d",Work[j]);
                            Work[j]+=Allocation[i][j];
                        }
                        cout << "|   ";
                        for(int j=0;j<Resource_Num;j++)printf("%3d",Need[i][j]);cout << "|   ";
                        for(int j=0;j<Resource_Num;j++)printf("%3d",Allocation[i][j]);cout << "|   ";
                        for(int j=0;j<Resource_Num;j++)printf("%3d",Work[j]);cout << "|   ";
                        Finish[i]=1;
                        printf("true
    ");
                    }
                }
            }
            Count++;
            if(Count>=Process_Num)break;
        }
        if(List_Num<Process_Num)
        {
            cout << "No safe List" << endl;
            return;
        }
        else cout << "T0 safe list" << endl;
        Reset_Finish();
        cout << "------------------------------" << endl;
        cout << "请输入指令:" << endl;
        cout << "1.输入请求向量 Request" << endl;
        cout << "2.退出到主页面 Return" << endl;
        cout << "------------------------------" << endl;
        cin >> inst;
        if(inst==1)Request();
        else inst=0;
    }
    
    void Shout()                                                    //输出系统与进程信息
    {
        instruct=0;
        cout << "Shout" << endl;
        cout << "系统信息 OS:" << endl;
        cout << "资源种类 Resource_Num:" << Resource_Num << endl;
        cout << "当前可利用资源 Available:" << endl;
        for(int i=0;i<Resource_Num;i++)
        {
            cout << "R" << i << ":" << Available[i] << " ";
        }
        cout << endl;
        cout << "进程信息 Process:" << endl;
        cout << "最大需求 Max:" <<endl;
        for(int i=0;i<Process_Num;i++)
        {
            cout << "P" << i <<endl;
            for(int j=0;j<Resource_Num;j++)
            {
                cout << "R" << j << ":" << Max[i][j] << " ";
            }
            cout <<endl;
        }
        cout << "已分配资源 Allocation:" << endl;
        for (int i=0;i<Process_Num;i++)
        {
            cout << "p" << i <<endl;
            for(int j=0;j<Resource_Num;j++)
            {
                cout << "R" << j << ":" << Allocation[i][j] << " ";
            }
            cout <<endl;
        }
        cout << "需求矩阵 Need:" << endl;
        for (int i=0;i<Process_Num;i++)
        {
            cout << "p" << i <<endl;
            for(int j=0;j<Resource_Num;j++)
            {
                cout << "R" << j << ":" << Need[i][j] << " ";
            }
            cout <<endl;
        }
        /*cout << "工作向量 Work:" << endl;
        for (int i=0;i<Process_Num;i++)
        {
            cout << "p" << i <<endl;
            for(int j=0;j<Resource_Num;j++)
            {
                cout << "R" << j << ":" << Work[j] << " ";
            }
            cout <<endl;
        }*/
        cout <<endl;
    }
    void Reset()                                                    //重置所有数据
    {
        cout << "Reset" << endl;
        instruct=0;
        Process_Num=0;
        List_Num=0;
        Resource_Num=0;
        memset(Allocation,0,sizeof(Allocation));
        memset(Available,0,sizeof(Available));
        memset(Max,0,sizeof(Max));
        memset(Need,0,sizeof(Need));
        memset(Work,0,sizeof(Work));
        Reset_Finish();
    }
    int main()
    {
    
        Reset();
        do{
        if(instruct==1)Input_OS();
        else if(instruct==2)Input_P();
        else if(instruct==3)Banker();
        else if(instruct==4)Shout();
        else if(instruct==5)Reset();
        else if(!instruct);
        else cout << "Error" << endl;
        cout << "------------------------------" << endl;
        cout << "请输入指令:" << endl;
        cout << "1.输入系统信息 Input OS information" << endl;
        cout << "2.输入进程信息 Input Process information" << endl;
        cout << "3.执行银行家算法 Run Banker's" << endl;
        cout << "4.查看系统与进程信息 Print all information" << endl;
        cout << "5.重置所有信息 Reset" << endl;
        cout << "-1.退出 exit" << endl;
        cout << "------------------------------" << endl;
        }while(scanf("%d",&instruct)!=EOF&&instruct!=-1);
        return 0;
    }
    
    
    
    
    /*
    测试用例:
    1
    3
    3 3 2
    2
    5
    7 5 3
    0 1 0
    3 2 2
    2 0 0
    9 0 2
    3 0 2
    2 2 2
    2 1 1
    4 3 3
    0 0 2
    3
    1
    1
    1 0 2
    1
    4
    3 3 0
    1
    0
    0 2 0
    1
    0
    0 1 0
    
    */

    运行结果:

    Reset
    ------------------------------
    请输入指令:
    1.输入系统信息 Input OS information
    2.输入进程信息 Input Process information
    3.执行银行家算法 Run Banker's
    4.查看系统与进程信息 Print all information
    5.重置所有信息 Reset
    -1.退出 exit
    ------------------------------
    1
    OS
    输入资源种类 Enter Resource_Num:
    3
    输入系统当前可利用资源数 Enter Available:
    R0:3 3 2
    R1:R2:------------------------------
    请输入指令:
    1.输入系统信息 Input OS information
    2.输入进程信息 Input Process information
    3.执行银行家算法 Run Banker's
    4.查看系统与进程信息 Print all information
    5.重置所有信息 Reset
    -1.退出 exit
    ------------------------------
    2
    Process
    输入进程数 Enter Process_Num:
    5
    输入进程 P0的最大资源需求 Max:
    R0:7 5 3
    R1:R2:
    输入进程 P0的已分配资源 Allocation:
    输入 -1 设置该进程剩余已分配资源为 0 :
    R0:0 1 0
    R1:R2:
    输入进程 P1的最大资源需求 Max:
    R0:3 2 2
    R1:R2:
    输入进程 P1的已分配资源 Allocation:
    输入 -1 设置该进程剩余已分配资源为 0 :
    R0:2 0 0
    R1:R2:
    输入进程 P2的最大资源需求 Max:
    R0:9 0 2
    R1:R2:
    输入进程 P2的已分配资源 Allocation:
    输入 -1 设置该进程剩余已分配资源为 0 :
    R0:3 0 2
    R1:R2:
    输入进程 P3的最大资源需求 Max:
    R0:2 2 2
    R1:R2:
    输入进程 P3的已分配资源 Allocation:
    输入 -1 设置该进程剩余已分配资源为 0 :
    R0:2 1 1
    R1:R2:
    输入进程 P4的最大资源需求 Max:
    R0:4 3 3
    R1:R2:
    输入进程 P4的已分配资源 Allocation:
    输入 -1 设置该进程剩余已分配资源为 0 :
    R0:0 0 2
    R1:R2:
    ------------------------------
    请输入指令:
    1.输入系统信息 Input OS information
    2.输入进程信息 Input Process information
    3.执行银行家算法 Run Banker's
    4.查看系统与进程信息 Print all information
    5.重置所有信息 Reset
    -1.退出 exit
    ------------------------------
    3
    Banker
         Work      Need      Allocation      Work+Allocation      Finish
    P1|  3  3  2|     1  2  2|     2  0  0|     5  3  2|   true
    P3|  5  3  2|     0  1  1|     2  1  1|     7  4  3|   true
    P4|  7  4  3|     4  3  1|     0  0  2|     7  4  5|   true
    P0|  7  4  5|     7  4  3|     0  1  0|     7  5  5|   true
    P2|  7  5  5|     6  0  0|     3  0  2|    10  5  7|   true
    T0 safe list
    ------------------------------
    请输入指令:
    1.输入请求向量 Request
    2.退出到主页面 Return
    ------------------------------
    1
    输入发出请求的进程 Enter Process_Num:
    1
    输入请求向量 Enter Request_Num:
    R0:1 0 2
    R1:R2:Safe
         Work      Need      Allocation      Work+Allocation      Finish
    P1|  2  3  0|     0  2  0|     3  0  2|     5  3  2|   true
    P3|  5  3  2|     0  1  1|     2  1  1|     7  4  3|   true
    P4|  7  4  3|     4  3  1|     0  0  2|     7  4  5|   true
    P0|  7  4  5|     7  4  3|     0  1  0|     7  5  5|   true
    P2|  7  5  5|     6  0  0|     3  0  2|    10  5  7|   true
    Safe list exist
    ------------------------------
    请输入指令:
    1.继续输入请求 Request
    2.退出到主界面 Return
    1
    输入发出请求的进程 Enter Process_Num:
    4
    输入请求向量 Enter Request_Num:
    R0:3 3 0
    R1:R2:没有足够资源 等待...
    No enough resource wait...
    ------------------------------
    请输入指令:
    1.继续输入请求 Request
    2.退出到主界面 Return
    1
    输入发出请求的进程 Enter Process_Num:
    0
    输入请求向量 Enter Request_Num:
    R0:0 2 0
    R1:R2:Safe
         Work      Need      Allocation      Work+Allocation      Finish
    No safe List
    ------------------------------
    请输入指令:
    1.继续输入请求 Request
    2.退出到主界面 Return
    1
    输入发出请求的进程 Enter Process_Num:
    0
    输入请求向量 Enter Request_Num:
    R0:0 1 0
    R1:R2:Safe
         Work      Need      Allocation      Work+Allocation      Finish
    P1|  2  2  0|     0  2  0|     3  0  2|     5  2  2|   true
    P3|  5  2  2|     0  1  1|     2  1  1|     7  3  3|   true
    P4|  7  3  3|     4  3  1|     0  0  2|     7  3  5|   true
    P0|  7  3  5|     7  3  3|     0  2  0|     7  5  5|   true
    P2|  7  5  5|     6  0  0|     3  0  2|    10  5  7|   true
    Safe list exist
    ------------------------------

  • 相关阅读:
    POJ3094 UVALive3594 HDU2734 ZOJ2812 Quicksum【进制】
    UVALive5583 UVA562 Dividing coins
    POJ1979 HDU1312 Red and Black【DFS】
    POJ1979 HDU1312 Red and Black【DFS】
    POJ2386 Lake Counting【DFS】
    POJ2386 Lake Counting【DFS】
    HDU4394 Digital Square
    HDU4394 Digital Square
    UVA213 UVALive5152 Message Decoding
    UVA213 UVALive5152 Message Decoding
  • 原文地址:https://www.cnblogs.com/LowBee/p/7096703.html
Copyright © 2011-2022 走看看