zuizhong.txt

来自「详细的银行家算法」· 文本 代码 · 共 258 行

TXT
258
字号
#include <iostream>
using namespace std;

int AVAILABLE[5];          /*可用资源数组*/
int MAX[10][5];            /*最大需求矩阵*/
int ALLOCATION[10][5];     /*分配矩阵*/
int NEED[10][5];           /*进程需求矩阵*/
int need1[10][5] ;          //手工输入需求矩阵
int REQUEST[10][5];        /*进程需要资源数*/
int total[5];
int totalAllocation[5];
bool FINISH[10];           /*系统是否有足够的资源分配*/
int p[10];                 /*记录序列*/
int m,n;                   /*m个进程,n个资源*/

void Init();
bool IsSafe();
void Bank();


void Init()                /*初始化算法*/
{
    int i,j;
    cout<<"请输入进程的数目:";
    cin>>m;
    cout<<"请输入资源的种类:";
    cin>>n;
    cout<<"请输入每个进程最多所需的各资源数,按照"<<m<<"x"<<n<<"矩阵输入"<<endl;
    for(i=0;i<m;i++)
	{ cout<<"p"<<i<<" ";
      for(j=0;j<n;j++)
       
	  cin>>MAX[i][j];}
    cout<<"请输入每个进程已分配的各资源数,也按照"<<m<<"x"<<n<<"矩阵输入"<<endl;
    for(i=0;i<m;i++)
    {   cout<<"p"<<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<<"个资源数错误,请重新输入:"<<endl;
                j--;
                continue;
            }
        }
    }
loop: cout<<"请输入need1矩阵"<<endl;
      for(i=0;i<m;i++){
          for(j=0;j<n;j++)
          {
             cin>>need1[i][j];
            
           }
       }
      for(i=0;i<m;i++){
          for(j=0;j<n;j++)
          {
        if(need1[i][j]>NEED[i][j])
		{ cout<<"输入有错,请重新输入:"<<endl;    
		    goto  loop ;
		}
                                                  //	continue;
              }
       }




    cout<<"请输入各个资源共有的数目:"<<endl;
    for(j=0;j<n;j++)
    {
        cin>>total[j];
    }

   for(j=0;j<n;j++){
        for(i=0;i<m;i++)
     {totalAllocation[j]+=ALLOCATION[i][j];}
    AVAILABLE[j]=total[j]-totalAllocation[j];   

   }
   cout<<"系统可利用资源";
   for(j=0;j<n;j++)

   {
	   cout<<" "<<AVAILABLE[j];
	   
   }

    cout<<endl;

   }

void Bank()                /*银行家算法*/
{
    int i,num,q;         
    char again;

    while(1)
    {
loop1:  cout<<"请输入要申请资源的进程号(从0开始)"<<endl;
        cin>>num;
        cout<<"请输入进程所请求的各资源的数量"<<endl;
        for(i=0;i<n;i++)               
        {
            cin>>REQUEST[num][i];
        }
   



        for(i=0;i<n;i++)
        {
            if(REQUEST[num][i]>NEED[num][i])
            {
                cout<<"您输入的请求数超过进程的需求量!请重新输入!"<<endl;
               goto loop1;
            }
            if(REQUEST[num][i]>AVAILABLE[i])
            {
                cout<<"您输入的请求数超过系统有的资源数!请重新输入!"<<endl;
                goto loop1;
            }
    	else
            cout<<"Request"<<num<<"(";
		    for(i=0;i<n;i++)
				cout<<REQUEST[num][i]<<",";
			cout<<")<=Need"<<num<<"(";
			for(i=0;i<n;i++)
				cout<<NEED[num][i]<<",";
			cout<<")"<<endl;
            cout<<"Request"<<num<<"(";
		    for(i=0;i<n;i++)
				cout<<REQUEST[num][i]<<",";
			cout<<")<=AVAILABLE"<<"(";
			for(i=0;i<n;i++)
				cout<<AVAILABLE[i]<<",";
			cout<<")";

        }
        for(i=0;i<n;i++)
        {
            AVAILABLE[i]-=REQUEST[num][i];
            ALLOCATION[num][i]+=REQUEST[num][i];
            NEED[num][i]-=REQUEST[num][i];
        }
        if(IsSafe())
        {
            cout<<"同意分配请求!"<<endl;
             for(i=0;i<m;i++)
			 {
                FINISH[i]=false;
			 }
			 cout<<"当前可利用资源";
            for(i=0;i<n;i++)
		   cout<<AVAILABLE[i]<<" ";
			cout<<endl;
             cout<<"当前各进程需要资源:"<<endl;
       for(i=0;i<m;i++)
	   { for(q=0;q<n;q++)
	   {cout<<NEED[i][q];}
         cout<<endl;
	   }
            cout<<"您还想再次请求分配吗?是请按y/n,否请按其它键"<<endl;
            cin>>again;
          
        if(again=='y'||again=='Y')
        {   
		  	 
            continue;      //跳到while继续执行银行家算法
        }
        break;
        }
        else
        {
            cout<<"您的请求被拒绝!"<<endl;
            for(i=0;i<n;i++)
            {
                AVAILABLE[i]+=REQUEST[num][i];
                ALLOCATION[num][i]-=REQUEST[num][i];
                NEED[num][i]+=REQUEST[num][i];
            }
        }
        for(i=0;i<m;i++)
        {
            FINISH[i]=false;
        }

     }
}

bool IsSafe()                        //安全性检查算法
{
    int i,j,k,l=0;
    int Work[5];                    /*可利用资源数*/
    for(i=0;i<n;i++)
    Work[i]=AVAILABLE[i];
    for(i=0;i<m;i++)               //先初始化均为false
    {
        FINISH[i]=false;
    }
    for(i=0;i<m;i++)
	{    
        if(FINISH[i]==true)
        {
            continue;
        }
        else
        {
            for(j=0;j<n;j++)
            {
                if(NEED[i][j]>Work[j])  //需要资源大于可利用资源
                {
                    break;
                }
            }
            if(j==n)
            { 
                FINISH[i]=true;
                for(k=0;k<n;k++)
                {
                    Work[k]+=ALLOCATION[i][k];     //可利用资源相加
                }
                p[l++]=i;
                i=-1;     //重新从进程0开始循环,已加入的则跳过
            }
            else
            {
                continue; 
            }
        }
        if(l==m)
        {
            cout<<"系统是安全的"<<endl;
            cout<<"安全序列:"<<endl;
            for(i=0;i<l;i++)
            {
                cout<<p[i];
                if(i!=l-1)
                {
                    cout<<"-->";
                }
            }
            cout<<""<<endl;
            return true;
        }
    }
    cout<<"系统是不安全的"<<endl;
    return false;
} 

int main()
{
    Init();
    IsSafe();
    Bank();
}

⌨️ 快捷键说明

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