2024年最全银行家算法——C语言实现_银行家算法c语言实现(1),2024最新C C++笔经

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

	{
		stillNeeds[i][j] = maxNeeds[i][j] - allocation[i][j];
	}
}

}

void solveAvailable()
{
for (int i = 0; i < RESOURCE_NUM; i++)
{
available[i] = maxResource[i];
}
for (int j = 0; j < RESOURCE_NUM; j++) //j表示列
{
for (int i = 0; i < PROCESS_NUM; i++) //i表示行
{
available[j] -= allocation[i][j];
}
}
}

void initialize()
{
//初始化系统中各个资源的数量
printf(“请输入系统中各种资源的数量:\n”);
for (int i = 0; i < RESOURCE_NUM; i++)
{
scanf(“%d”, &maxResource[i]);
}

//初始化各个进程对系统中各个资源的最大需求量
for (int i = 0; i < PROCESS_NUM; i++)
{
	printf("请输入进程%d对系统中各种资源的最大需求量:\n", i);
	for (int j = 0; j < RESOURCE_NUM; j++)
	{
		scanf("%d", &maxNeeds[i][j]);
	}
}


//初始化allocation矩阵
for (int i = 0; i < PROCESS_NUM; i++)
{
	printf("系统已经分配给进程%d的各种资源的数量:\n", i);
	for (int j = 0; j < RESOURCE_NUM; j++)
	{
		scanf("%d", &allocation[i][j]);
	}
}


//初始化需求矩阵
solveNeeds();


//初始化available数组
solveAvailable();


//初始化work数组
for (int i = 0; i < RESOURCE_NUM; i++)
{
	work[i] = available[i];
}


//初始化isEnough数组
for (int i = 0; i < PROCESS_NUM; i++)
{
	isEnough[i] = false;
}


printf("请输入当前是哪一个进程在向系统申请资源\n");
scanf("%d", &requestProcess);


printf("请输入进程%d向系统申请的各个资源的数目\n", requestProcess);
for (int i = 0; i < RESOURCE_NUM; i++)
{
	scanf("%d", &request[i]);
}

}

void outAllocation()
{
printf(“**************************************************************************************************\n”);
printf(“当前系统的资源分配情况如下:\n”);
printf(“\t\tmaxNeeds\t\tallocation\t\tstillNeeds\t\tavailable\n”);
printf(“资源名称\t”);

for (int i = 0; i < 4; i++)
{
	
	if (i == 3)
	{
		for (int j = 0; j < RESOURCE_NUM; j++)
		{
			printf("%d ", available[j]);
		}
	}
	else
	{
		printf("A B C");
		printf("\t\t\t");
	}

}

printf("\n");

for (int j = 0; j < PROCESS_NUM; j++)
{
	printf("P%d\t\t",j);
	for (int k = 0; k < RESOURCE_NUM; k++)
	{
		printf("%d ", maxNeeds[j][k]);
	}
	printf("\t\t\t");

	for (int k = 0; k < RESOURCE_NUM; k++)
	{
		printf("%d ", allocation[j][k]);
	}
	printf("\t\t\t");

	for (int k = 0; k < RESOURCE_NUM; k++)
	{
		printf("%d ", stillNeeds[j][k]);
	}

	printf("\n");
}

printf("**************************************************************************************************\n");

}

void print()
{
for (int i = 0; i < PROCESS_NUM; i++)
{
if (i == PROCESS_NUM - 1)
printf(“%d”, securitySequence[i]);
else
printf(“%d->”, securitySequence[i]);
}
printf(“\n”);
}

int securityTest()
{
int count = 0; //用于记录安全序列中已经添加了多少个进程

for (int i = 0; i < PROCESS_NUM; i++)
{
	int flag = 1;  //用于标记是否使用break语句跳出了内层循环
	for (int j = 0; j < RESOURCE_NUM; j++)
	{
		if (work[j] < stillNeeds[i][j])
		{
			flag = 0;
			break;
		}
	}


	//若isEnough[i]=0表示此时的进程i还没有被加入到安全序列中,那么便可以将其加入到安全序列中
	if (flag == 1 && isEnough[i] == false)
	{
		//将进程i添加到安全序列中
		securitySequence[count] = i;
		count++;


		//修改isEnough[i]的值为true,有两层含义,第一层含义是代表此时进程i已经进入安全序列了,下一次循环检测时若检测到进程i便可以不用重复将其加入到安全序列中
		//第二层含义,是最后用于判定系统是否安全的依据,只有isEnough数组中全部的元素的值都是1才代表着此系统是安全的否则系就处于不安全的状态
		isEnough[i] = true;


		//当安全序列中新增进程之后,需要改变available数组的值
		for (int k = 0; k < RESOURCE_NUM; k++)
		{
			work[k] += allocation[i][k];
		}

		i = -1;
		//保证可以从头开始遍历所有的进程
		//注意此条语句的位置必须位于此,因为只有安全序列中添加了新元素之后,available数组的值才会改变,此时才需要重新扫描所有进程看如今系统中剩余的资源是否可以满足以前不能满足的进程
	}
}


//检查系统此时是否处于安全状态
for (int i = 0; i < PROCESS_NUM; i++)
{
	if (isEnough[i] == false) {
		return false;
	}
}
return true;

}

int dispense()
{
//尝试将资源分配给请求进程的时候,发生改变的数组有,allocation,stillNeeds,available,work;
for (int i = 0; i < RESOURCE_NUM; i++)
{
allocation[requestProcess][i] += request[i];
stillNeeds[requestProcess][i] -= request[i];
available[i] -= request[i];
work[i] -= request[i];
}
}

int restore()
{
for (int i = 0; i < RESOURCE_NUM; i++)
{
allocation[requestProcess][i] -= request[i];
stillNeeds[requestProcess][i] += request[i];
available[i] += request[i];
work[i] += request[i];
}
}

void banker()
{
//第一步检查进程所申请的资源数目是否超过其一开始声明的最大值
for (int i = 0; i < RESOURCE_NUM; i++)
{
if (request[i] > stillNeeds[requestProcess][i])
{
printf(“进程%d所申请的资源已经超过了其一开始定义的最大值,不予分配\n”);
return;
}
}

//第二检查系统中剩余的资源是满足进程的请求
for (int i = 0; i < RESOURCE_NUM; i++)
{
	if (request[i] > available[i])
	{
		printf("系统资源不足,分配失败,请进程阻塞等待\n");
		return;
	}
}


//尝试分配资源
dispense();


//分配完资源之后判断系统是否处于安全状态,若处于安全状态则就真正的将资源分配给请求的进程,否则就将刚才预分配的资源恢复
if (securityTest())
{
	printf("此次分配不会导致系统进入不安全状态,分配成功!\n");
	//输出此时的安全序列
	printf("此时系统的其中一个安全序列为:\n");
	print();
	return;

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

存中…(img-BghsQT06-1715619199482)]
[外链图片转存中…(img-ttAkDeR2-1715619199483)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

  • 12
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值