OS实验多项资源银行家算法

一、实验名称

多资源银行家算法

二、问题描述

当某一进程提出资源的使用要求后,使得系统中一些进程处于无休止的阻塞状态,在无外力的作用下,这些进程永远也不能继续前进。这种现象称为死锁。为了避免死锁的发生,需要对当前进程的请求进行判断,给出一种最优的资源分配方式,这里提出了一种得到最佳分配方案的方法——银行家算法。

三、实验原理

把系统比作一个银行家,占有有限资金。银行家不可能满足所以借款人(进程)的最大需求量总和,但可以满足一部分借款人的借款要求。待这些人的借款归还后,又可把这笔资金借给他人。这样,当一借款人提出借款要求时,银行家就要进行计算,以决定是否借给他,看他是否会造成银行家的资金被借光而使资金无法运转。
在这里插入图片描述

四、实验内容

  1. 实验代码
#include <iostream>
#include <queue>
#include <algorithm>
#include <cstdio>
#include <cstring>
 
using namespace std;

 struct text
{
	int num;   //项目数量 
	int flag;	//超载 
	int w[4];		//资源总数 
	char r[100][100];	//已获得资源 
	int p[4];		//已用资源数 
	int s[4];		//剩余资源数 
	char q[100][100];	//需要资源数 
}t;

void print()
{
	int i,j;
	cout<<"已用资源"<<endl;
	cout<<"磁带驱动机 \t 绘图仪 \t 打印机 \t 穿孔机" <<endl;
	for(i = 0 ; i < 4 ; i++)
	{
		cout<<t.p[i]<<"\t";
	}
	cout<<endl;
	cout<<"剩余资源"<<endl;
	cout<<"磁带驱动机 \t 绘图仪 \t 打印机 \t 穿孔机" <<endl;
	for(i = 0 ; i < 4 ; i++)
	{
		cout<<t.s[i]<<"\t";
	}
	cout<<endl;
	cout<<"已获得资源"<<endl;
	cout<<"进程 \t 磁带驱动机 \t 绘图仪 \t 打印机 \t 穿孔机" <<endl;
	for(i = 0 ; i < t.num ; i++)
	{
		for(j = 0 ; j < 5 ; j++)
		{
			cout<<t.r[i][j]<<"\t";
		}
		cout<<endl;
	}
	cout<<endl;
	cout<<endl<<"需要资源"<<endl;
	cout<<"进程 \t 磁带驱动机 \t 绘图仪 \t 打印机 \t 穿孔机" <<endl;
	for(i = 0 ; i < t.num ; i++)
	{
		for(j = 0 ; j < 5 ; j++)
		{
			cout<<t.q[i][j]<<"\t";
		}
		
		cout<<endl;
	}  
}

void print1(int n)		//正在进行的项目 
{
	cout<<t.r[n][0]<<"\t";		
} 

void print2()		//打印剩余资源 
{
	int i,j;
	cout<<"已用资源"<<endl;
	cout<<"磁带驱动机 \t 绘图仪 \t 打印机 \t 穿孔机" <<endl;
	for(i = 0 ; i < 4 ; i++)
	{
		cout<<t.p[i]<<"\t";
	}
	cout<<endl;
	cout<<"剩余资源"<<endl;
	cout<<"磁带驱动机 \t 绘图仪 \t 打印机 \t 穿孔机" <<endl;
	for(i = 0 ; i < 4 ; i++)
	{
		cout<<t.s[i]<<"\t";
	}
}

void input()
{
	int i,j;
	int p,s;
	t.flag = 0;
	cout<<"请设置项目数量:"<<endl;
	cin>>t.num;				//项目数量 
	cout<<"input progream R:"<<endl;
	cout<<"进程 \t 磁带驱动机 \t 绘图仪 \t 打印机 \t 穿孔机" <<endl;
	for(i = 0 ; i < t.num ; i++)
	{
		for(j = 0 ; j <= 4 ; j++)
		{
			cin>>t.r[i][j];					//设置项目 
			t.q[i][0] = t.r[i][0];
		}
	}
	for(i = 0 ; i < 4 ; i++)
	{
		p=0;  //p 已用资源 
		for(j = 0 ; j < t.num ; j++)
		{
			p = p + t.r[j][i+1] -48 ;
		}
		t.p[i] = p;							//已用资源数 
		s=t.w[i];							//剩余资源数 
		t.s[i] = s - t.p[i];
	}
	
	cout<<"input progream Q:"<<endl;		//输入需要资源 
	for(i = 0 ; i < t.num ; i++)
	{
		for(j = 0 ; j < 5 ; j++)
		{
			cin>>t.q[i][j];
		}
	}
	print();
}

void work()			 
{
	int i,j,l;
	int r,s,q;
	int progream;
	char q1,r1;
	for(l=0;;l++)			
	{
		for(i = 0; i < t.num; i++)
		{
				for(j = 0 ; j < 4 ; j++)		//可用资源对比 
				{
					q=t.q[i][j+1]-48;    //q需要资源数 
					s=t.s[j];
					if(s >= q)					
					{
						t.flag++;
					}
				}
				if(t.flag == 4)     			//项目可通过,标记项目位置 
				{
					progream = i;
					break;
				}
				t.flag=0;
		}
		
		if(t.flag != 4)					//超载 
		{
			cout<<endl<<"死锁"<<endl; 
			break;
		}
		if(t.flag == 4)					//运行后释放资源 
		{
			print1(progream);
			for(i = 0; i < 4; i++)	
			{
				r=t.r[progream][i+1]-48;
				t.p[i] = t.p[i] - r;
				s=t.w[i];
				t.s[i] = s - t.p[i];
				t.r[progream][i+1] = 0;
				t.q[progream][i+1] = 0;
			}
			
		}
		
		for(i = 1; i < t.num-progream; i++)			//删除项目 
		{
				for(j = 0 ; j < 4 ; j++)
				{
					q = t.q[progream+i][j+1];
					r = t.r[progream+i][j+1];
					t.r[progream+i-1][j+1] = r;
					t.q[progream+i-1][j+1] = q;
				}
		}
		
		for(i = 1; i < t.num-progream; i++)
		{
				for(j = 0 ; j < 4 ; j++)
				{
					q1 = t.q[progream+i][0];
					r1 = t.r[progream+i][0];
					t.r[progream+i-1][0] = r1;
					t.q[progream+i-1][0] = q1;
				}
		}
		t.flag=0;
		t.num--;
		if(t.num==0)
		{
			break;
		}
	}
}

int main()
{
	t.w[0] = 6;									//初始化 
	t.w[1] = 3;
	t.w[2] = 4;
	t.w[3] = 2;
	t.p[0]=0;t.p[1]=0;t.p[2]=0;t.p[3]=0;
	input();
	cout<<"安全序列:"<<endl; 
	work();
}


  1. 运行结果

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Next---YOLO

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值