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

📄 银行家算法.cpp

📁 模拟银行家算法
💻 CPP
字号:
#include<iostream.h>

/***********************************************************************
                        数据定义与函数原型说明
***********************************************************************/
#define m 5     //总进程数
#define n 4     //总资源数

struct bank               //定义结构体
{
    int Available[n];     //可利用资源向量
    int Max[m][n];        //最大需求矩阵
    int Allocation[m][n]; //分配矩阵
    int Need[m][n];       //需求矩阵
};
void Initilize(bank &);   //初始化
int Safe_test(bank);      //检查安全性
void Resoure_allocate(bank &); //系统对进程资源申请的处理

/***********************************************************************
                            主函数
***********************************************************************/
void main(void)
{
	bank current;                  //定义变量
    Initilize(current);            //初始化
    Safe_test(current);           //检查安全性
	while(1)      //循环执行进程申请资源和系统对申请的处理
	{
      Resoure_allocate(current);
    }
}
/***********************************************************************
                             初始化
***********************************************************************/
void Initilize(bank &x)            
{
	int i,j;
    cout<<"初始化过程,输入相关数据:\n"; 
    cout<<"输入最大需求矩阵Max:"<<'\n';  
	for(i=0;i<m;i++)             //设置最大需求矩阵
	{
		for(j=0;j<n;j++)
		{
			cin>>x.Max[i][j];
		}
	}
	cout<<"输入分配矩阵Allocation:"<<'\n';
    for(i=0;i<m;i++)              //设置分配矩阵
	{
		for(j=0;j<n;j++)
		{
			cin>>x.Allocation[i][j];
		}
	}
	for(i=0;i<m;i++)              //设置需求矩阵
	{
		for(j=0;j<n;j++)
		{
			x.Need[i][j]=x.Max[i][j]-x.Allocation[i][j];
		}
	}
    cout<<"输入可利用资源向量:"<<'\n';
	for(i=0;i<n;i++)             //设置可利用资源向量
	{
		cin>>x.Available[i];
	}
}
/***********************************************************************
                             检查安全性
***********************************************************************/
int Safe_test(bank x)
{
	int i,j;
	int safeprocess[m]; //安全序列向量
	int work[n];        //空闲资源矩阵
	int Finish[m];      //进程完成标志矩阵
	for(i=0;i<n;i++)    //开始时可利用资源向量就是空闲资源矩阵
	    work[i]=x.Available[i];  
    for(i=0;i<m;i++)    //初始化标志矩阵为false
	    Finish[i]=false;
      
    int k=0;    //安全序列排列号
	for(i=0;i<m;i++)       //每次都从第一个进程开始做循环
	{
	      if(Finish[i]==false)
		  {
				for(j=0;j<n;j++)
				{
					if(x.Need[i][j]>work[j]) //判断当前进程需求矩阵能否得到满足
						break;               //不满足则跳出
				}  
				if(j==n)      //第i个进程满足执行条件
				{
                    safeprocess[k++]=i;   //将进程号存入安全序列向量
					for(int q=0;q<n;q++)  //修改空闲资源矩阵				
					   work[q]+=x.Allocation[i][q];
			        Finish[i]=true;       //标志该进程可完成
					i=-1;     //下次检查从第一个进程重新查起
				}
		  }
	}
    for(i=0;i<m;i++)    //检查标志数组,若有一个为false则找不到安全序列
	   if(!Finish[i])
	   { 
		   cout<<"找不到安全序列,系统处于不安全状态!\n";
		   return 0;
	   }
	cout<<"找到安全序列:";    //找到安全序列并显示该序列
	for(i=0;i<m;i++)cout<<"进程"<<safeprocess[i]+1<<" ";
	cout<<"\n系统处于安全状态.\n";
	return 1;
}
/***********************************************************************
                         系统对进程资源申请的处理
***********************************************************************/ 
void Resoure_allocate(bank &x)
{
	bank temp=x;         //临时变量存储x的初值
	int Request[n];      //请求向量
    int number;          //进程号    
	int i;
	cout<<"请输入要申请资源的进程序号:\n";
	cin>>number;         
	cout<<"请输入请求向量:\n";
    for(i=0;i<n;i++) cin>>Request[i]; //输入请求向量
    for(i=0;i<n;i++)
	{
		if(Request[i]>x.Need[number-1][i])   //所需资源数大于需求量
		{
			cout<<"进程所需要的资源数已超过它所宣布的最大值,系统不予分配资源!\n";
			return ;
		}
		if(Request[i]>x.Available[i])        //所需资源数大于可利用资源
		{
            cout<<"系统中无足够的资源满足进程的申请,系统不予分配资源!\n";
			return ;
		}
	}
    for(i=0;i<n;i++)      //假设系统将申请资源数分配给该进程,对数据进行相关修改
	{
         x.Available[i]            -= Request[i];
		 x.Need[number-1][i]       -= Request[i];
         x.Allocation[number-1][i] += Request[i];
	}
    if(Safe_test(x))    //安全性检查结果为安全
	{
		cout<<"系统可以为该进程分配资源.\n";
		return ;
	}
    else                //安全性检查结果为不安全
	{
		cout<<"系统不为该进程分配资源\n";
		x=temp;      //将相关矩阵修改过来,表示资源不分配资源
		return ;
	}
}        
/***********************************************************************/
                         

⌨️ 快捷键说明

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