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

📄 yinhangjia.cpp

📁 实现死锁避免算法——银行家算法 1、程序运行开始时
💻 CPP
字号:
#include<stdio.h>

//全局变量
int max[5][10],allocation[5][10],need[5][10],available[10];//定义变量
int request[5][10];//进程需求
int k=5;//序列临时变量
int jincheng=0;//当前进程

//初始化数据
int available0[10]={3,8,5,6,3,4,5,4,3,8};//可用资源
int anquanxulie[5]={1,4,3,0,2};

int 	max0[5][10]={
		{7,5,3,2,3,1,4,6,7,3}, 
		{3,2,2,2,3,4,5,6,1,6}, 
		{9,0,2,4,0,4,8,2,4,7}, 
		{2,2,2,3,6,7,2,4,2,5}, 
		{4,3,3,4,7,3,7,2,4,6} 
};//最大需求
int 	allocation0[5][10]={ 
		{0,1,0,1,2,1,0,2,3,0}, 
		{2,0,0,2,2,0,1,2,0,1}, 
		{3,0,2,1,0,2,2,0,2,1}, 
		{2,1,1,0,2,0,0,1,0,0}, 
		{0,0,2,0,1,3,2,1,2,0} 
};//已分配
int		need0[5][10]={ 
	    {7,4,3,1,4,0,4,4,4,3}, 
	    {1,2,2,0,3,4,1,4,1,5}, 
	    {6,0,0,3,2,4,1,2,2,6}, 
	    {0,1,1,3,2,7,3,3,2,5}, 
	    {4,3,1,4,4,0,1,1,2,6} 
};//需求


int check()//安全算法
{
	int work[10];
	int finish[5];
	int i,j,n;
	for(j=0;j<10;j++)
		work[j]=available[j];
	for(i=0;i<5;i++)
		finish[i]=0;
	k=0;
loop:
    for(i=0;i<5;i++)
		if(finish[i]==0)    
		{
			n=1;
			for(j=0;j<10;j++)
				if(need[i][j]>work[j])
					{n=0;break;}

				if(!n)					
					continue;

				else
				{
					for(j=0;j<10;j++)
						work[j]+=allocation[i][j];
					finish[i]=1;
					n=0;
					for(j=0;j<10;j++)
						n+=need[i][j];
					if(n)
						anquanxulie[k++]=i;
					goto  loop;
				}
		}

		for(j=0;j<5;j++)
			if(finish[j]==0){printf("\n不安全需求\n");
				return 0;}
			return 1;

}

void yinhangjia()//银行家算法
{
	int allocation1[10],available1[10],need1[10];
	int n;
	int j;
	int k1=k;
	for(j=0;j<10;j++)//写入临时变量
	{
		available1[j]=available[j];
		allocation1[j]=allocation[jincheng][j];
		need1[j]=need[jincheng][j];
	}
	for(j=0;j<10;j++)
    {
        available[j]-=request[jincheng][j];
		need[jincheng][j]-=request[jincheng][j];
		allocation[jincheng][j]+=request[jincheng][j];
	}
    if(check())//判断是否安全
	{
		n=0;
		for(j=0;j<10;j++)
			n+=need[jincheng][j];
		if(!n)
            for(j=0;j<10;j++)
			{
				available[j]+=allocation[jincheng][j];//如果安全则释放资源
				allocation[jincheng][j]=0;
				max[jincheng][j]=0;
			}
    }
	else
	{
		k=k1;
        for(j=0;j<10;j++)//否则写回全局变量
		{
			allocation[jincheng][j]=allocation1[j];
			need[jincheng][j]=need1[j];
			available[j]=available1[j];
		}                 
	}
}

void main()//主函数
{ 	
	int i,j,a,b,c,n;
			 for(i=0;i<5;i++)
			 for(j=0;j<10;j++)
					max[i][j]=max0[i][j];
			 for(i=0;i<5;i++)
			 for(j=0;j<10;j++)
					allocation[i][j]=allocation0[i][j];
			 for(i=0;i<5;i++)
			 for(j=0;j<10;j++)
					need[i][j]=need0[i][j];
			 for(j=0;j<10;j++)
					available[j]=available0[j];//写入基本数值

	do{  
		do{
			a=0;b=0;
			printf("\n安全序列:\n");
			for(i=0;i<k;i++)
			{
				printf("p%d  ",anquanxulie[i]);
			}
			printf("\n");
			printf("\n         已分配资源               最大需求资源              需求资源\n");
			for(i=0;i<5;i++)
			{   
				printf("p%d  ",i);
				printf(" ");
				for(j=0;j<10;j++)
					printf("%2d",allocation[i][j]);
				printf("     ");                                                                 
				for(j=0;j<10;j++)
					printf("%2d",max[i][j]);
				printf("     ");
				for(j=0;j<10;j++)
					printf("%2d",need[i][j]);
				printf("  \n");		
			}
			printf("可利用资源:");
			for(j=0;j<10;j++)
				printf("%3d",available[j]);//以上为页面输出

				printf("\n输入请求进程号:\n");
				scanf("%d",&jincheng);
				if (jincheng<0 ||jincheng>=5)
				{printf("\n\n没当前进程\n\n");//判断有否此进程
				b=1;
				continue;}

				n=0;
				for(j=0;j<10;j++)n+=need[jincheng][j];
				if (!n) {
                    printf("\n\np%d进程处于完成状态\n\n",jincheng);//判断进程是否处于完成态
                    a=1;
					continue;
				}
				printf("p%d进程对各资源的需求:\n",jincheng);
				for(j=0;j<10;j++)
					scanf("%d",&request[jincheng][j]);
				printf("\n");
				for(j=0;j<10;j++){
					if(request[jincheng][j]>need[jincheng][j])
					{
                        printf("\n\n进程所请求的资源超过其需求资源!\n\n");//判断是否超过其需求资源并标记
                        a=1;
						break;
					}
				}
				for(j=0;j<10;j++){
					if(request[jincheng][j]>available[j])
					{
						printf("\n\n进程所请求的资源超过可利用资源!\n\n");//判断是否超过可利用资源并标记
						b=1;
						break;
					}
				}
			}while((a==1)||(b==1));
			yinhangjia();
			
			c=0;
			for(i=0;i<5;i++)//判断进程是否全部完成
			{ 
				for(j=0;j<10;j++)
				{					
					if(need[i][j]!=0)
						c=1;
				}
			}

	}while(c);
	printf("\n进程全部完成\n\n银行家算法 the end  \n\n");	
}

⌨️ 快捷键说明

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