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

📄 xx.cpp

📁 操作系统
💻 CPP
字号:
#include <iostream>
using namespace std;
int available[3]={3,3,2};
int max[5][3]={7,5,3,3,2,2,9,0,2,2,2,2,4,3,3};
int allocation[5][3]={0,1,0,2,0,0,3,0,2,2,1,1,0,0,2};
int need[5][3];
int request[5];
int safeArry[5];

//判断是否可以申请
bool isAvailable () 
{
	if (request[1]<=need[request[0]][0]) 
	{
		if (request[2]<=need[request[0]][1]) 
		{
			if(request[3]<=need[request[0]][2]) 
			{
				return true;
			}
		}
	}
	return false;
};
//判断是否安全
bool isSafe () 
{
	if (isAvailable()==true) 
	{
		//用来对Available,allocation,need数组做一个备份
		int newAvailable[3];
		for (int number1=0;number1<3;number1++) 
		{
			newAvailable[number1]=available[number1];
		}
		int newAllocation[5][3];
		for (int number2=0;number2<5;number2++) 
		{
			for(int number3=0;number3<3;number3++)
			{
				newAllocation[number2][number3]=allocation[number2][number3];
			}
		}

		int newNeed[5][3];
		for (int number4=0;number4<5;number4++) 
		{
			for(int number5=0;number5<3;number5++)
			{
				newNeed[number4][number5]=need[number4][number5];
			}
		}
		int finish[5]={0,0,0,0,0}; //用来标记所对应的进程是否已经完成
		//假设可以分配资源,改变申请成功后个数组的值
		for (int tempNumber1=0;tempNumber1<3;tempNumber1++) 
		{
			newAvailable[tempNumber1]=newAvailable[tempNumber1]-request[tempNumber1+1];
			newAllocation[request[0]][tempNumber1]=newAllocation[request[0]][tempNumber1]+request[tempNumber1+1];
			newNeed[request[0]][tempNumber1]=newNeed[request[0]][tempNumber1]-request[tempNumber1+1];
		}
		
		//模拟分配资源
		for(int tempNumber=0;tempNumber<5;tempNumber++)
		{
		//遍历数组,查看是否有可以释放的资源
			for(int number=0;number<5;number++)
			{
				if (!finish[number]) 
				{
					//判断第1个资源是否够 
					if (newNeed[number][0]<=newAvailable[0]) 
					{
						//判断第2个资源是否够 
						if (newNeed[number][1]<=newAvailable[1]) 
						{
							//判断第3个资源是否够 
							if (newNeed[number][2]<=newAvailable[2]) 
							{
								//如果资源够,则释放该进程的资源
								finish[number]=1;
								safeArry[tempNumber]=number;
								for (int tempNumber=0;tempNumber<3;tempNumber++) 
									{
										newAvailable[tempNumber] +=newAllocation[number][tempNumber];
										//加到安全序列中
									}
								break;
							}
						}
					}
				}
			}
		}
		
		//判断是否存在安全序列
		for (int number=0;number<5;number++) 
		{
			if (!finish[number]) 
			{
				return false;
			}
			
		}
		return true;
	}
};

void main() 
{
	//初始化need数组
	for (int number=0;number<5;number++) 
	{
		for (int stypeNumber=0;stypeNumber<3;stypeNumber++) 
		{
			need[number][stypeNumber]=max[number][stypeNumber]-allocation[number][stypeNumber];
		}

	}
	while (true) 
	{
		cout<<"请输入:"<<endl;
		cin>>request[0]>>request[1]>>request[2]>>request[3];
		//输出各进程所需的资源
		cout<<"各进程还需要的资源NEED"<<endl;
			for (int k1=0;k1<5;k1++ )
			{
				cout<<k1<<":";
				for(int k3=0;k3<3;k3++) 
				{
					cout<<need[k1][k3]<<" ";
				}
				cout<<endl;
			}
		//输出剩余的资源
		cout<<"Available:";
		for (int k4=0;k4<3;k4++) 
		{
			cout<<available[k4]-request[k4+1]<<" ";
		}
		cout<<endl;

		if (isAvailable()) 
		{
			if (isSafe()) 
			{
				for (int k4=0;k4<3;k4++) 
				{
					available[k4]-=request[k4+1];
				}

				cout<<"这样的配置是安全的!";
				for (int k2=0;k2<5;k2++) 
				{
					cout<<"->"<<safeArry[k2];
				}
			} else 
			{
				cout<<"不安全!!!";
			}
		} else 
		{
			cout<<"资源不够";
		}
		cout<<endl;
		cout<<"有进程发出request请求向量吗?(y/n)";
		char a;
		cin >>a;
		if (a=='n') 
		{
			break;
		}
	}
}

⌨️ 快捷键说明

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