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

📄 银行家.cpp

📁 这是我做的操作系统里面的银行家算法的源程序
💻 CPP
字号:
#include<iostream.h>

#define W 10
#define R 20

int m,n; //m个进程,n个资源
int Available[R];  //系统可用资源数
int Max[W][R];  //M个进程对N类资源最大资源需求量
int Allocation[W][R]; //M个进程已经得到N类资源的资源量
int Need[W][R];   //M个进程还需要N类资源的资源量
int Request[W][R];//每一个进程请求的各种资源
int Finish[W]; 
int p[W];  //存放安全序列

void Input(); //用户输入题目要求的资源数目
int IsSafe(); //安全性检查 
int IsOut();  //判断是否满足进程的请求
/////////////////////////////////////////////////////////////////////////////////////////////////////
int main()             //银行家算法
{
 Input();
 IsSafe();
 IsOut();
 return 0;

}
/////////////////////////////////////////////////////////////////////////////////
void Input() //用户输入题目要求的资源数目
{
int i,j;
 cout<<"输入进程的数目:\n";
 cin>>m;
 cout<<"输入资源的种类:\n";
 cin>>n;
 cout<<"输入每个进程最多所需的各资源数,按照"<<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];
}

int IsSafe()  //安全性检查 
{
 int i,j,l=0;
 int Work[R]; //可利用资源数组
 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]; //把进程i的资源释放
              p[l++]=i;   //安全序列
              i=-1;  //从0开始再一次遍历查找
		   }
           else continue; //跳过当前的不符合的,查找下一个
	   }   
 }
    if(l==m)//m是从1开始的,l是从0开始的
	{
         cout<<"系统是安全的"<<'\n';
         cout<<"安全序列是:\n";
         for(i=0;i<l;i++)
			{
                cout<<p[i];
                if(i!=l-1) 
					cout<<"-->"; 
			}
         cout<<'\n';
         return 1;
	}
	else
		return 0;
}

int IsOut()  //判断是否满足进程的请求
{
 int i,j,mi;
 while(1)
 {
   cout<<"输入要申请资源的进程号(注:第1个进程号为0,依次类推)\n";
   cin>>mi;
   cout<<"输入进程所请求的各资源的数量\n";
   for(i=0;i<n;i++)
   cin>>Request[mi][i];//进程mi需要的各类资源
   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(IsSafe()) cout<<"同意分配请求!\n";
   else
   {
     cout<<"你的请求被拒绝!\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 YesOrNo;
   cout<<"你还想再次请求分配吗?是请按y/Y,否按n/N,再确定\n";
   while(1)
   {
     cin>>YesOrNo;
     if(YesOrNo=='y'||YesOrNo=='Y'||YesOrNo=='n'||YesOrNo=='N') //判断大小写
		 break;
     else
     {
       cout<<"请按要求输入!\n";
       continue;
     }

   }
   if(YesOrNo=='y'||YesOrNo=='Y') continue;
   else break;
 }

}

⌨️ 快捷键说明

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