C语言银行家算法

简单银行家算法

最近在学操作系统,学习了银行家算法,要写一个简单的银行家算法程序:
银行家算法无非两个部分,一是安全性算法,另一个是银行家算法
此次的银行家算法基于这个要求:
分析T0时刻的代码(即安全性算法)
boolean JudgeSafe() { //判断是否安全
	int i = 0,j=0;
	for ( i = 0; i < 5; i++)
	{
		Finish[i] = false;
		WorkSign[i].A = 0;
		WorkSign[i].B = 0;
		WorkSign[i].C = 0;
	}
	int step[5];
	Work = Available;
	for (i = 0; i<5; i++) {
		if (Finish[i] == false) {
			if (Work.A >= Need[i].A&&Work.B >= Need[i].B&&Work.C >= Need[i].C) {
				WA[i].A = Work.A + Allocation[i].A;
				WA[i].B = Work.B + Allocation[i].B;
				WA[i].C = Work.C + Allocation[i].C;
				WorkSign[j].A = Work.A;
				WorkSign[j].B = Work.B;
				WorkSign[j].C = Work.C;
				step[j] = i;
				j++;
				Work.A = WA[i].A;
				Work.B = WA[i].B;
				Work.C = WA[i].C;
				Finish[i] = true;
				i = -1;
			}
		}
	}
	
	if (Finish[0]==true && Finish[1]==true && Finish[2] == true && Finish[3] == true && Finish[4] == true)
	{
	printf("Finish为0代表False,Finish为1代表True\n");
	printf("     Work          Need        Allocation       Work+Allocation       Finish\n");
	printf("     A  B  C      A  B  C       A  B  C            A  B  C\n");
	for (i = 0; i < 5; i++)
	{
		printf("P%d  %2d %2d %2d     %2d %2d %2d      %2d %2d %2d           %2d %2d %2d          %5d\n", step[i], WorkSign[i].A, WorkSign[i].B, WorkSign[i].C,
			Need[step[i]].A, Need[step[i]].B, Need[step[i]].C, Allocation[step[i]].A, Allocation[step[i]].B, Allocation[step[i]].C,
			WA[step[i]].A, WA[step[i]].B, WA[step[i]].C, Finish[step[i]]);
	}
	printf("此时安全,序列为:");
		for ( i = 0; i < 5; i++)
		{
			printf("P%d ",step[i]);
		}
		printf("\n");
		return true;
	}
	else return false;
}

输入P1请求后的算法(即银行家算法)

void Bank() { //银行家算法线程请求
	int a, b, c, d;
	printf("请输入请求线程号P");
	scanf("%d", &a);
	printf("请输入request请求:\n");
	scanf("%d %d %d", &b, &c, &d);
	Change(a, { b,c,d });
	if (JudgeSafe()) {

	}
	else {
		printf("此时系统不安全!\n");
	}
}
void Change(int i,Resource Request) { //更改请求线程信息
	int j = 0;
	for ( j = 0; j < 5; j++)
	{
		Finish[j] = false;
	}
	Available.A = Available.A - Request.A;
	Available.B = Available.B - Request.B;
	Available.C = Available.C - Request.C;

	Allocation[i].A = Allocation[i].A + Request.A;
	Allocation[i].B = Allocation[i].B + Request.B;
	Allocation[i].C = Allocation[i].C + Request.C;

	Need[i].A = Need[i].A - Request.A;
	Need[i].B = Need[i].B - Request.B;
	Need[i].C = Need[i].C - Request.C;
}

这些大概就是整个算法最核心的代码,有了这些就可实现此实验简单的银行家算法,代码的算法其实还不够完美,欢迎大家指正批评。
第一次写博客,有点慌乱,还请大家多多支持!
完整源码请注明来意,发邮件到1300527579@qq.com获取。


  • 1
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值