操作系统之银行家算法

#include<iostream>
#include<assert.h>
#include<graphics.h>
#include<time.h>
#include<conio.h>
using namespace std;
const int MAXPROCESS=100;
const int MAXRESOURCE=100; 
 
int Available[MAXRESOURCE];         //可用资源向量  
int Max[MAXPROCESS][MAXRESOURCE];   //最大需求矩阵  
int Allocation[MAXPROCESS][MAXRESOURCE];  //分配矩阵  
int Need[MAXPROCESS][MAXRESOURCE];        //需求矩阵  
 
int Request[MAXRESOURCE];      //请求向量  
 
int Work[MAXRESOURCE];         //工作向量  
bool Finish[MAXPROCESS]; 
int SafeSeries[MAXPROCESS];    //安全序列  
 
int n;   //进程数  
int m;   //资源数  
 
void Init()   //初始化模块
{ 
	rectangle(100, 50, 680, 100);  //输入进程数
	outtextxy(110, 60, "请输入进程总数:");
	char a[20],num[20];
	int i,g,j;
	int c;
	for(i=0;i<20;i++)
	{
		if((c=getchar())!='\n') 
			a[i]=c; 
		else 
		{
			a[i]=0;
			break;
		}
	}
	n=atoi(a);
	sprintf(num,"%d",n);
	outtextxy(400,60,num);

	rectangle(100, 100, 680, 150);  //输入资源种类数
	outtextxy(110, 110, "请输入资源种类数:");
	for(i=0;i<20;i++)
	{
		if((c=getchar())!='\n') 
			a[i]=c; 
		else 
		{
			a[i]=0;
			break;
		}
	}
	m=atoi(a);
	sprintf(num,"%d",m);
	outtextxy(400,110,num);
  
	rectangle(100, 150, 680, 200);   //输入资源数目
	outtextxy(110, 160, "请输入可利用资源数目:");
	int f=420;
	for( j = 0; j < m; ++j )  
	{  
		for(i=0;i<20;i++)
		{
			if((c=getchar())!='\n') 
				a[i]=c; 
			else 
			{
				a[i]=0;
				break;
			}
		}
		Available[j]=atoi(a);
		sprintf(num,"%d",Available[j]);
		outtextxy(f=f+30,160,num);
	}  

	rectangle(100, 200, 680,260+n*30);  //最大矩阵输入
	outtextxy(110, 210, "最大需求矩阵输入:");
	int b=250,w=450,d=650,q=110;
	for( i = 0; i < n; ++i )  
	{  
		for( j = 0; j < m; ++j )  
		{ 
			for(int k=0;k<20;k++)
			{
				if((c=getchar())!='\n') 
					a[k]=c; 
				else 
				{
					a[k]=0;
					break;
				}
			}
			Max[i][j]=atoi(a);
			sprintf(num,"%d",Max[i][j]);
			outtextxy(q=q+30,b,num); 
		}
		b=b+30;
		q=110;
	} 

	rectangle(100, 400, 680,460+n*30);  //最大矩阵输入
	outtextxy(110, 410, "分配矩阵输入:");
	q=110;
	for( i= 0; i < n; ++i )  
	{  
		for( j = 0; j < m; ++j )  
		{  
			for(int k=0;k<20;k++)
			{
				if((c=getchar())!='\n') 
					a[k]=c; 
				else 
				{
					a[k]=0;
					break;
				}
			}
			Allocation[i][j]=atoi(a);
			sprintf(num,"%d",Allocation[i][j]);
			outtextxy(q=q+30,w,num); 
		}
		w=w+30; 
		q=110;
	}  

	rectangle(100, 600, 680,660+n*30);  //最大矩阵输入
	outtextxy(110,610, "需求矩阵输入:");
	q=110;
	for( i = 0; i < n; ++i )  
	{  
		for( j = 0; j < m; ++j )  
		{  
			for(int k=0;k<20;k++)
			{
				if((c=getchar())!='\n') 
					a[k]=c; 
				else 
				{
					a[k]=0;
					break;
				}
			}
			Need[i][j]=atoi(a);
			sprintf(num,"%d",Need[i][j]);
			outtextxy(q=q+30,d,num); 
		}
		d=d+30; 
		q=110;
	}  
}  

 
bool IsSafe()   //判断安全性算法
{  
	int i=0;
	for (i=0;i<n;++i)
	{
		if(Finish[i] == true)
			continue;
		else
			break;
	}
	if(i == n)
		return true;    //安全
	else
		return false;   //不安全
}   
 
bool Select(int &tmp,int tmpNeed[][MAXRESOURCE])  //选则模块
{  
	//选择一个Finish[i]=false,Need[i]<=Work[i] 
	int j=0; 
	for (int i=0;i<n;++i)
	{
		if(Finish[i])
			continue;
		for (j=0;j<m;++j)
		{
			if(tmpNeed[i][j] > Work[j])
				break;
		}
		if(j == m)
		{
			tmp=i;
			return true;
		}
	}
	return false;
}  
 
bool Safe(int *tmpAvail,int tmpAlloc[][MAXRESOURCE],int tmpNeed[][MAXRESOURCE])  //输出安全序列模块
{  
	for(int i = 0; i < n; ++i)  
	{  
		Finish[i] = false;  
	}  
	for (int j = 0; j < m; ++j)  
	{  
		Work[j] = tmpAvail[j];  
	}  
	int tmp=0;  
	int index = 0;  
	while(Select(tmp,tmpNeed))  
	{  
		Finish[tmp] = true;  
		for (int k = 0; k < m; ++k)  
		{  
			Work[k] += tmpAlloc[tmp][k];  
		}  
		SafeSeries[index++] = tmp;
	}  
	if(IsSafe())  
		return true;    //安全
	else
		return false;   //不安全
}   
 
void Display()  //显示模块
{
	int i=0;
	int j=0,a=110,b=250,c=450,d=650;
	char num[20];
	rectangle(100, 100, 500, 200);
	outtextxy(110,110,"当前可利用的资源数目:");
	for(i = 0; i < m; ++i)  
	{  
		sprintf(num,"%d",Available[i]);
		outtextxy(a=a+20,150,num);
	}  
	rectangle(100, 200, 500, 260+n*30);
	outtextxy(110,210,"最大需求矩阵:");
	a=110;
	for(i = 0; i < n; ++i )  
	{  
		for( j = 0; j < m; ++j)  
		{  
			sprintf(num,"%d",Max[i][j]);
		    outtextxy(a=a+20,b,num);
		}
		b=b+30;
		a=110;
	} 
	rectangle(100, 400, 500, 460+n*30);
	outtextxy(110,410,"分配矩阵:");
	a=110;
	for( i = 0; i < n; ++i )  
	{  
		for( j = 0; j < m; ++j )  
		{  
			sprintf(num,"%d",Allocation[i][j]);
		    outtextxy(a=a+20,c,num);
		}  
		c=c+30;
		a=110;
	}
	rectangle(100, 600, 500, 660+n*30);
	outtextxy(110,610,"需求矩阵:");
	a=110;
	for( i = 0; i < n; ++i )  
	{  
		for( j = 0; j < m; ++j )  
		{ 
			sprintf(num,"%d",Need[i][j]);
		    outtextxy(a=a+20,d,num);;
		}  
		d=d+30;
		a=110;
	} 
}
 
void BankA()  //银行家算法
{
	int i=0;
	int index=0;
	rectangle(100, 50, 680, 100);  //输入进程数
	outtextxy(110, 60, "请输入请求资源的进程下标:");
	char a[20],num[20];
	int j;
	char c;
	for(i=0;i<20;i++)
	{
		if((c=getchar())!='\n') 
			a[i]=c; 
		else 
		{
			a[i]=0;
			break;
		}
	}
	index=atoi(a);
	sprintf(num,"%d",index);
	outtextxy(650,60,num);

	assert(index < n && index >= 0);
	rectangle(100, 100, 680, 150);  //输入进程数
	outtextxy(110, 110, "请输入当前的请求资源:");
	int b=500;
	for (j=0;j<m;++j)
	{
		for(i=0;i<20;i++)
		{
			if((c=getchar())!='\n') 
				a[i]=c; 
			else 
			{
				a[i]=0;
				break;
			}
		}
		Request[j]=atoi(a);
		sprintf(num,"%d",Request[j]);
		outtextxy(b=b+30,110,num);
	}

	for (i=0;i<m;++i)
	{
		if(Request[i] <= Need[index][i])
		{
			continue;
		}
		else
		{
			rectangle(300, 550, 650, 600);
			outtextxy(310, 560, "第一次试分配失败");
			break;
		}
	}
	if(i < 3)   //如果第一次试分配失败则不执行后面的语句
	{
		return ;
	}
	for(i=0;i<m;++i)
	{
		if(Request[i] <= Available[i])
		{
			continue;
		}
		else
		{
			rectangle(300, 550, 650, 600);
			outtextxy(310, 560, "第二次试分配失败");
			break;
		}
	}
	if(i <3)     //如果第二次试分配失败则不同执行后面的语句
	{
		return ;
	}
	//开始试分配
	int tmpAvail[MAXRESOURCE]={0};
	int tmpAlloc[MAXPROCESS][MAXRESOURCE]={0};
	int tmpNeed[MAXPROCESS][MAXRESOURCE]={0};
	memmove(tmpAvail,Available,sizeof(int)*MAXRESOURCE);
	memmove(tmpAlloc,Allocation,sizeof(int)*MAXPROCESS*MAXRESOURCE);
	memmove(tmpNeed,Need,sizeof(int)*MAXPROCESS*MAXRESOURCE);
	for (int i=0;i<m;++i)
	{
		tmpAvail[i] -= Request[i];
		tmpAlloc[index][i] += Request[i];
		tmpNeed[index][i] -= Request[i];
	}
	bool ret=Safe(tmpAvail,tmpAlloc,tmpNeed);
	if(ret == true)
	{
		memmove(Available,tmpAvail,sizeof(int)*MAXRESOURCE);
		memmove(Allocation,tmpAlloc,sizeof(int)*MAXPROCESS*MAXRESOURCE);
		memmove(Need,tmpNeed,sizeof(int)*MAXPROCESS*MAXRESOURCE);
		cout<<"进程p"<<index<<"请求资源允许"<<endl;
	}
	else
	{
		for(int i = 0; i < n; ++i)  
		{  
			Finish[i] = false;  
		}
		rectangle(300, 550, 650, 600);
		outtextxy(310, 560, "第三次试分配失败");
	}
}
 
void Menu() //界面函数
{
	initgraph(880, 880);
	setbkcolor(LIGHTGRAY);
	cleardevice();
	setlinecolor(BLACK);
	rectangle(80 , 50 , 800, 200);
	rectangle(300, 300, 580, 350);
	rectangle(300, 400, 580, 450);
	rectangle(300, 500, 580, 550);
	rectangle(300, 600, 580, 650);
	rectangle(300, 700, 580, 750);
	settextcolor(BLACK);
	settextstyle(100,0,0);
	outtextxy(200,70,"银行家算法");
	settextstyle(30, 0, 0);
	outtextxy(320, 310, "测试安全性代码");
	outtextxy(320, 410, "测试银行家算法");
	outtextxy(320, 510, "初始化");
	outtextxy(320, 610, "打印矩阵");
	outtextxy(320, 710, "退出");
}

int main()  //主函数
{
	int index=0;
	int flag=1;
	MOUSEMSG m;
	Menu();
	while (flag)   //功能函数调用
	{
		m = GetMouseMsg();
		if (m.mkLButton&&m.x > 300 && m.x < 580 && m.y>300 && m.y < 350)
		{
			cleardevice();
			Safe(Available,Allocation,Need);
			if(IsSafe())  
			{  
				rectangle(100, 200, 500, 300);
				outtextxy(110,210,"安全序列为:"); 
				int a=110;
				char num[20];
				for (int i = 0; i < n ; ++i)  
				{ 
					sprintf(num,"%d",SafeSeries[i]);
					outtextxy(a=a+30,250,"P");
					outtextxy(a=a+20,250,num);
				}  
				for(int i = 0; i < n; ++i)  
				{  
					Finish[i] = false;  
				}
			}   
			else  
			{ 
				rectangle(100, 400, 500, 500);
				outtextxy(110,410,"该时刻是不安全的!"); 
			} 
		    rectangle(700, 50, 870, 100);
			outtextxy(710, 60, "返回主界面");
			int t=1;
			MOUSEMSG m1;
			while(t)
			{
				m1= GetMouseMsg();
				if(m1.mkLButton&&m1.x > 700 &&m1.x < 870 &&m1.y>50 && m1.y < 100)
				{
					Menu();
					t=0;
				}
			}
		}
		else if (m.mkLButton&&m.x > 300 && m.x < 580 && m.y>400 && m.y < 450)
		{
			cleardevice();
			BankA();
			char c=getchar();
			while(c)
			{
			if(IsSafe())  
			{   
				rectangle(100, 200, 500, 300);
				outtextxy(110,210,"安全序列为:"); 
				int a=110;
				char num[20];
				for (int i = 0; i < n ; ++i)  
				{ 
					sprintf(num,"%d",SafeSeries[i]);
					outtextxy(a=a+30,250,"P");
					outtextxy(a=a+20,250,num);
				}  
				for(int i = 0; i < n; ++i)  
				{  
					Finish[i] = false;  
				} 
			}
			else
			{
				rectangle(100, 400, 500, 500);
				outtextxy(110,410,"该时刻是不安全的!"); 
			}
			
			c=0;
			}
			rectangle(700, 50, 870, 100);
			outtextxy(710, 60, "返回主界面");
			int t=1;
			MOUSEMSG m2;
			while(t)
			{
				m2= GetMouseMsg();
				if(m2.mkLButton&&m2.x > 700 &&m2.x < 870 &&m2.y>50 && m2.y < 100)
				{
					Menu();
					t=0;
				}
			}
		}
		else if (m.mkLButton&&m.x > 300 && m.x < 580 && m.y>500 && m.y < 550)
		{
			cleardevice();
			Init();
			rectangle(700, 50, 870, 100);
			outtextxy(710, 60, "返回主界面");
			int t=1;
			MOUSEMSG m3;
			while(t)
			{
				m3= GetMouseMsg();
				if(m3.mkLButton&&m3.x > 700 &&m3.x < 870 &&m3.y>50 && m3.y < 100)
				{
					Menu();
					t=0;
				}
			}
		}
		else if (m.mkLButton&&m.x > 300 && m.x < 580 && m.y>600 && m.y < 650)
		{
			cleardevice();
			Display();
			rectangle(700, 50, 870, 100);
			outtextxy(710, 60, "返回主界面");
			int t=1;
			MOUSEMSG m4;
			while(t)
			{
				m4= GetMouseMsg();
				if(m4.mkLButton&&m4.x > 700 &&m4.x < 870 &&m4.y>50 && m4.y < 100)
				{
					Menu();
					t=0;
				}
			}
		}
		else if (m.mkLButton&&m.x > 300 && m.x < 580 && m.y>700 && m.y < 750)
			flag=0;
	}
}

使用easyx画了界面!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
银行家算法是避免死锁的一种重要方法,本程序用java编程语言对其进行了实现。 当用户申请一组资源时,系统必须做出判断,如果把这些资源分出去,系统是否还处于安全状态。 若是,就可以分出这些资源;否则,该申请暂不予满足。 1.数据结构 假设有M个进程N类资源,则有如下数据结构: MAX[M*N] M个进程对N类资源的最大需求量 AVAILABLE[N] 系统可用资源数 ALLOCATION[M*N] M个进程已经得到N类资源的资源量 NEED[M*N] M个进程还需要N类资源的资源量 2.银行家算法 设进程I提出请求Request[N],则银行家算法按如下规则进行判断。 (1)如果Request[N]<=NEED[I,N],则转(2);否则,出错。 (2)如果Request[N]<=AVAILABLE,则转(3);否则,出错。 (3)系统试探分配资源,修改相关数据: AVAILABLE=AVAILABLE-REQUEST ALLOCATION=ALLOCATION+REQUEST NEED=NEED-REQUEST (4)系统执行安全性检查,如安全,则分配成立;否则试探险性分配作废,系统恢复原状,进程等待。 3.安全性检查 (1)设置两个工作向量WORK=AVAILABLE;FINISH[M]=FALSE (2)从进程集合中找到一个满足下述条件的进程, FINISH[i]=FALSE NEED<=WORK 如找到,执行(3);否则,执行(4) (3)设进程获得资源,可顺利执行,直至完成,从而释放资源。 WORK=WORK+ALLOCATION FINISH=TRUE GO TO 2 (4)如所有的进程Finish[M]=true,则表示安全;否则系统不安全。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

likesile

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

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

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

打赏作者

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

抵扣说明:

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

余额充值