银行家问题2

#include <iostream.h>
//////////////////////////////////////////////////////////////////////////
//全局变量定义
int Available[100]; //可利用资源数组
int Max[50][100];   //最大需求矩阵
int Allocation[50][100];  //分配矩阵
int Need[50][100];        //需求矩阵
int Request[50][100];     //M个进程还需要N类资源的资源量
int Finish[50];
int p[50];
int m,n;   //M个进程,N类资源
/////////////////////////////////////////////////////////////////////////
//安全性算法
int Safe()                      
{
    int i,j,l=0;
    int Work[100]; //可利用资源数组
    for (i=0;i<n;i++)
        Work[i]=Available[i];
    for (i=0;i<m;i++)
        Finish[i]=0;
    for (i=0;i<m;i++)
    {
        if (Finish[i]==1)
        continue;
        else
        {
            for (j=0;j<n;j++)
            {
                if (Need[i][j]>Work[j])
                    break;
            }
            if (j==n)
            {
                Finish[i]=1;
                for(int k=0;k<n;k++)
                    Work[k]+=Allocation[i][k];
                p[l++]=i;
                i=-1;
            }
            else continue;
        }
        if (l==m)
        {
            cout<<"系统是安全的"<<'\n';
            cout<<"系统安全序列是:\n";
            for (i=0;i<l;i++)
            {
                cout<<p[i];
                if (i!=l-1)
                    cout<<"-->";
            }
            cout<<'\n';
            return 1;
        }
    }
}
/////////////////////////////////////////////////////////////////////////////////
//银行家算法
int main()
{
    int i,j,mi;
    cout<<"输入进程的数目:";
    cin>>m;
    cout<<"\n输入资源的种类:";
    cin>>n;
    cout<<"\n输入每个进程最多所需的各类资源数,按照"<<m<<"x"<<n<<"矩阵输入\n";
    for (i=0;i<m;i++)
        for(j=0;j<n;j++)
            cin>>Max[i][j];
    cout<<"输入每个进程已经分配的各类资源数,按照"<<m<<"x"<<n<<"矩阵输入\n";
    for (i=0;i<m;i++)
    {
        for(j=0;j<n;j++)
        {
            cin>>Allocation[i][j];
            Need[i][j]=Max[i][j]-Allocation[i][j];
            if (Need[i][j]<0)
            {
                cout<<"你输入的第"<<i+1<<"个进程所拥有的第"<<j+1<<"个资源错误,请重新输入:\n";
                j--;
                continue;
            }
        }
    }
    cout<<"请输入各个资源现有的数目:\n";
    for (i=0;i<n;i++)
    cin>>Available[i];
    Safe();
    while (1)
    {
        cout<<"输入要申请的资源的进程号:(第一个进程号为0,第二个进程号为1,依此类推)\n";
        cin>>mi;
        cout<<"输入进程所请求的各个资源的数量\n";
        for (i=0;i<n;i++)
        cin>>Request[mi][i];
        for (i=0;i<n;i++)
        {

            if (Request[mi][i]>Need[mi][i])
            {
                cout<<"所请求资源数超过进程的需求量!\n";
                return 0;
            }
            if (Request[mi][i]>Available[i])
            {
                cout<<"所请求资源数超过系统所有的资源数!\n";
                return 0;
            }
        }
        for (i=0;i<n;i++)
        {
            Available[i]-=Request[mi][i];
            Allocation[mi][i]+=Request[mi][i];
            Need[mi][i]-=Request[mi][i];
        }
        if (Safe())
            cout<<"同意分配请求\n";
        else
        {
            cout<<"SORRY╮(╯▽╰)╭……你的请求被拒绝…\n";
            for (i=0;i<n;i++)
            {
                Available[i]+=Request[mi][i];
                Allocation[mi][i]-=Request[mi][i];
                Need[mi][i]+=Request[mi][i];
            }
        }
        for (i=0;i<m;i++) 
            Finish[i]=0;
        char Flag;       //标志位
        cout<<"是否再次请求分配?是请按Y/y,否请按N/n\n";
        while (1)
        {
            cin>>Flag;
            if (Flag=='Y'||Flag=='y'||Flag=='N'||Flag=='n')
            break;
            else
            {
                cout<<"请按要求重新输入:\n";
                continue;
            }
        }
        if (Flag=='Y'||Flag=='y')
        continue;
        else break;
    }
}


/**

输入进程的数目:5

输入资源的种类:4

输入每个进程最多所需的各类资源数,按照5x4矩阵输入
0 0 1 2
1 7 5 0
2 3 5 6
0 6 5 2
0 6 5 6
输入每个进程已经分配的各类资源数,按照5x4矩阵输入
0 0 1 2
1 0 0 0
1 3 5 4
0 6 3 2
0 0 1 4
请输入各个资源现有的数目:
1 5 2 0
系统是安全的
系统安全序列是:
0-->2-->1-->3-->4
输入要申请的资源的进程号:(第一个进程号为0,第二个进程号为1,依此类推)
1
输入进程所请求的各个资源的数量
0 4 2 0
系统是安全的
系统安全序列是:
0-->2-->1-->3-->4
同意分配请求
是否再次请求分配?是请按Y/y,否请按N/n

*/

  

猜你喜欢

转载自www.cnblogs.com/zili/p/9900517.html
今日推荐