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

📄 2.cpp

📁 一个关于资源分配的原代码!保证无错!希望大家多多支持
💻 CPP
字号:
#include "iostream"
using namespace std;
#define false 0 
#define true 1 
#define w 10 //最大进程数
#define r 20 //最大资源数
int m ; //总进程数
int n ; //资源种类 
int all_resource[r]={10,5,7};//系统中各种资源的数目总和
int max[w][r]=
{
	{7,5,3},
	{3,2,2},
	{9,0,2},
	{2,2,2},
	{4,3,3}
}; //m个进程对n类资源最大资源需求量
int available[r]; //系统可用资源数
int allocation[w][r]=
{
	{0,1,0},
	{2,0,0},
	{3,0,2},
	{2,1,1},
	{0,0,2}
}; //m个进程已经得到n类资源的资源量
int need[w][r]; //m个进程还需要n类资源的资源量
int request[r]; //请求资源个数
int num;//申请资源的进程号
int sort[w];//记录安全序列数组
//函数print,输出资源分配情况
void print()
{
	int i,j;
    cout<<"各种资源的总数量(all):";  
    for(j=0;j<n;j++)cout<<j<<"类资源--"<<all_resource[j]<<"  "; 
    cout<<endl;
    cout<<"系统目前各种资源可用的数为(available):"; 
    cout<<" "; 
    for(j=0;j<n;j++)cout<<j<<"类资源--"<<available[j]<<"  "; 
    cout<<endl<<endl;
    cout<<"当前的资源分配表如下:"<<endl;
	cout<<"      Max              Allocaition      Need"<<endl;
	for(i=0;i<m;i++)
	{
		cout<<"P"<<i;
		cout<<"    ";
		//输出进程i对各类资源的最大需求量
		for(j=0;j<n;j++)
			cout<<max[i][j]<<" ";
		cout<<"           ";
		//输出进程i已占有的各类资源的数目
		for(j=0;j<n;j++)
			cout<<allocation[i][j]<<" ";
		cout<<"           ";
		//输出进程i还需的各类进程的数目
		for(j=0;j<n;j++)
			cout<<need[i][j]<<" ";
		cout<<endl;
	}
}

//函数changdata,改变进程k可用资源和已经拿到资源和还需要的资源的值
void changdata(int k) 
{ 
    int j; 
    for(j=0;j<n;j++) 
	{ 
        available[j]=available[j]-request[j];//修改可用资源数 
        allocation[k][j]=allocation[k][j]+request[j];//修改已占资源数
        need[k][j]=need[k][j]-request[j];//修改还需要资源数
	} 
}

//函数rstordata,恢复进程k可用资源和已经拿到资源和还需要的资源的值
void rstordata(int k) 
{ 
    int j; 
    for(j=0;j<n;j++) 
	{ 
        available[j]=available[j]+request[j]; 
        allocation[k][j]=allocation[k][j]-request[j]; 
        need[k][j]=need[k][j]+request[j]; 
	} 
}

//函数test,试探是否存在安全序列
bool test()
{
	cout<<"测试安全序列:\n";
	int finish[w];//标记向量,
	int work[r];//系统可提供进程继续运行所需要的各类资源数目
	int i,j;
	int s;//记录可完成的进程数
	for(i=0;i<m;i++)
		finish[i]=false;//检查前,对所有的进全标记为false
	for(i=0;i<n;i++)
		work[i]=available[i];//给work向量初始化
	i=0;//从P0开始检查
	s=0;
    while(i<m)  //测试安全序列
	{
		if(finish[i]==false)
		{
			//i进程需要的j类资源数目应小于当前j类资源可以分配出的资源数目work[j]
			for(j=0;(j<n)&&(need[i][j]<=work[j]);j++)
				if(j==(n-1))  //j==(n-1)表示所有可分配的资源都符合进程i的需求
				{
					finish[i]=true; //表明i进程执行完
					cout<<"process P"<<i<<" can  be completed"<<endl;
					for(j=0;j<n;j++) //i进程释放资源
						work[j]+=allocation[i][j];
					sort[s]=i; //记录i进程
					s++;
					i=-1; //再从头检查哪一个进程可完成
				}
		}
		i++;
	}
	if(s!=m)  return false;//(s!=m)表示有进程不能执行完成,找不到一个安全序列,返回false
	cout<<"存在安全序列:"<<endl;
	for(i=0;i<m;i++)//打印该安全序列
		cout<<"P"<<sort[i]<<"   ";
	return true;//找到一个安全序列返回true
}

//函数exam,检查是否可以将进程num所申请的资源分配给它
void exam()
{
	cout<<"\nExamming Process:"<<num<<endl;
	int i;
	for(i=0;i<n;i++)//对j类资源的请求数目应不大于系统可分配出来的数目
		if(request[i]>available[i])
		{
			cout<<"Resouces are not enough!"<<endl;
			return;
		}
	//request满足条件,试探性的把资源分配给进程num,修改相应数据的值
	changdata(num);  
	print();  //打印此时的资源分配表
	if(test())//若test()的值为true,就正式把进程num申请的资源分配给它
		cout<<"\nThe request resource is allocated to P"<<num<<endl;
    //若test()的值为false,就不能将资源分配给进程num,并恢复相应数据的值,让等待其
	else
	{
        rstordata(num);
		cout<<"不存在安全序列.       P"<<num<<" must wait!"<<endl<<endl;
		print();
	}
}

//申请资源
void newrequest()
{
    int j;   
    do 
	{ 
        cout<<",请输入需申请资源的进程号(从P0到P"<<m-1<<",否则重输入!):"; 
        cout<<"P";
	    cin>>num; 
        if(num<0||num>=m)cout<<"输入的进程号不存在,重新输入!"<<endl; 
	}while(num<0||num>=m);//输入提出资源申请的进程号
    cout<<"请输入进程P"<<num<<"申请的资源数:"<<endl; 
    for(j=0;j<n;j++) //输入进程num所请求的各类资源的数目
	{ 
        cout<<j<<"类资源--";
        cin>>request[j]; 
		if(request[j]>need[num][j])//若输入的请求量大于该进程的需求量,重新输入
        {
			cout<<"申请的"<<j<<"类资源数目大于该进程的需求数目,请重新输入!"<<endl;
			j--;
		}
	}	
}

//银行家算法
void bank()   
{
	newrequest();
	exam();
}

//初始化资源分配情况
void input()
{
    int i=0,j=0,p; 
    cout<<"输入总进程数--";
    cin>>m;
    cout<<"输入总资源种类--";
    cin>>n;
	//为在运行时减少数据的输入量,已经用实验的测试数据对all_resource、max、
	//allocation进行了初始化,因此将194行至231行代码注释掉了;
    //若要测试其他数据,只需去掉注释符,再编译连接运行
    /*cout<<"请输入总资源数(all_resource):"<<endl;
    for(i=0;i<n;i++)
	{
		cout<<i<<"类资源--";
		cin>>all_resource[i];
	}
    cout<<endl;
    cout<<"依次输入各进程所需要的最大资源数量(max):"<<endl;
    for(i=0;i<m;i++)
	{
		cout<<"P"<<i<<"需要的最大资源数量:"<<endl;
        for(j=0;j<n;j++)
		{
			cout<<j<<"类资源--";
            do
			{
                cin>>max[i][j];
                if(max[i][j]>all_resource[j])
                cout<<endl<<"占有资源超过了声明的该资源总数,请重新输入"<<endl;
            }while(max[i][j]>all_resource[j]);
		}
	}
    cout<<"\n依次输入各进程已经占有的资源数量(allocation):"<<endl;
    for(i=0;i<m;i++)
	{
		cout<<"P"<<i<<"已占有的资源数量:"<<endl;
        for(j=0;j<n;j++)
		{
			cout<<j<<"类资源--";
            do
			{
                cin>>allocation[i][j];
                if(allocation[i][j]>max[i][j])
                cout<<endl<<"占有资源超过了声明的最大资源,请重新输入"<<endl;
			}while (allocation[i][j]>max[i][j]);
		}
	}*/
    //初始化系统可用资源数量
    for(i=0;i<n;i++)
    { 
		p=all_resource[i];
        for(j=0;j<m;j++)
        {
            p-=allocation[j][i];//减去已经被占据的资源
            available[i]=p;
            if(available[i]<0)
                available[i]=0;
         }
    }
	//初始化各进程还需各类资源数量
    for(i=0;i<m;i++)
        for(j=0;j<n;j++)
            need[i][j]=max[i][j]-allocation[i][j];
}

//主函数
void main() 
{
	char j='0';
    input();
    print();
	do 
	{
        cout<<endl<<"开始演示银行家算法";
        bank();
		cout<<"\n☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆\n";
		cout<<endl<<"0--继续演示   其他退出------- ";
		cin>>j;
	}while(j=='0');
}







 

⌨️ 快捷键说明

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