银行家算法C++实现

来源:互联网 发布:网络黑钱提现 编辑:程序博客网 时间:2024/06/05 18:34
#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\n");                }            }        }        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\n");                }            }        }        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;}/*测试用例:133 3 2257 5 30 1 03 2 22 0 09 0 23 0 22 2 22 1 14 3 30 0 23111 0 2143 3 0100 2 0100 1 0*/

原创粉丝点击