银行家算法

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>

#define ProNum 100
#define ResNum 100

int sum;//实际进程个数
int res_sum;//实际资源个数
int is_safe = 0;//判断是否安全标志位,0为不安全,1为安全
int allocation[ProNum][ResNum];//每个进程已分配资源个数
int max[ProNum][ResNum];//每个进程最大需求
int need[ProNum][ResNum];//每个进程尚需多少资源
int Available[ResNum];//可用资源的个数
int MaxRes[ResNum];//所有资源的所有个数
bool finish[ProNum];
bool res = false;//资源是否初始化
bool pro = false;//进程是否初始化

int _allocation[ProNum][ResNum];//每个进程已分配资源个数
int _need[ProNum][ResNum];//每个进程尚需多少资源
int _Available[ResNum];//可用资源的个数
bool _finish[ProNum];

void init() {
int i, j;
for (i = 0; i < ProNum; i++)
for (j = 0; j < ResNum; j++)
allocation[i][j] = 0;
for (i = 0; i < ProNum; i++)
for (j = 0; j < ResNum; j++)
max[i][j] = 0;
for (j = 0; j < ResNum; j++)
Available[j] = 0;
for (j = 0; j < ResNum; j++)
MaxRes[j] = 0;
}

void backupinit() {
int i, j;
for (i = 0; i < sum; i++)
for (j = 0; j < res_sum; j++) {
_allocation[i][j] = allocation[i][j];//每个进程已分配的资源个数
_need[i][j] = need[i][j]; //每个进程尚需的资源个数
_Available[j] = Available[j]; //每个进程可用的资源个数
}
}

void release() {
int i, j;
for (i = 0; i < ProNum; i++)
for (j = 0; j < ResNum; j++) {
allocation[i][j] = _allocation[i][j];
need[i][j] = _need[i][j];
Available[j] = _Available[j];
finish[j] = false;
}
is_safe = 0;
}

void initRes() {//初始化资源个数
printf(“请输入资源种数:”);
scanf("%d", &res_sum);
for (int i = 0; i < res_sum; i++) {
printf(“请输入第%d类资源总数:”, i + 1);
scanf("%d", &MaxRes[i]);
printf("\n");
}
res = true;//资源已经初始化完成
}

void initPro() {//初始化进程信息
if (res == false) {
printf(“请初始化资源信息\n”);
}
else if (res == true) {
printf(“请输入进程个数:”);
scanf("%d", &sum);
for (int i = 0; i < sum; i++) {
for (int j = 0; j < res_sum; j++) {
printf("\n请输入第%d个进程对第%d个资源的最大需求量:", i + 1, j + 1);
scanf("%d", &max[i][j]);
}
}

	for (int i = 0; i < sum; i++) {
		for (int j = 0; j < res_sum; j++) {
			printf("\n请输入第%d个进程对第%d个资源的占有量:", i + 1, j + 1);
			scanf("%d", &allocation[i][j]);
		}
	}
	for (int i = 0; i < sum; i++)
	for (int j = 0; j < res_sum; j++)
		need[i][j] = max[i][j] - allocation[i][j];
	int allsum[ResNum];
	for (int i = 0; i < res_sum; i++)
		allsum[i] = 0;
	for (int i = 0; i < sum; i++)
	for (int j = 0; j < res_sum; j++)
		allsum[j] = allsum[j] + allocation[i][j];
	for (int j = 0; j < res_sum; j++)
		Available[j] = MaxRes[j] - allsum[j];
	for (int i = 0; i < sum; i++) {
		finish[i] = false;
		_finish[i] = finish[i];
	}
	backupinit();
}
pro = true;//进程已经初始化完成

}

void display() {//输出所有信息
if (pro == true && res == true) {
printf(“所有资源总数为:\n”);
for (int i = 0; i < res_sum; i++)
printf("\t第%d类资源", i + 1);
printf("\n");

	for (int i = 0; i < res_sum; i++)
		printf("\t\t%d", MaxRes[i]);
	printf("\n");

	printf("可用资源总数为:\n");
	for (int i = 0; i < res_sum; i++)
		printf("\t第%d类资源", i + 1);
	printf("\n");

	for (int i = 0; i < res_sum; i++)
		printf("\t\t%d", Available[i]);
	printf("\n");

	printf("进程需求总数为(max):\n");
	for (int i = 0; i < res_sum; i++)
		printf("\t第%d类资源", i + 1);
	printf("\n");

	for (int i = 0; i < sum; i++) {
		for (int j = 0; j < res_sum; j++)
			printf("\t\t%d", max[i][j]);
		printf("\n");
	}

	printf("进程占有总数为(allocation):\n");
	for (int i = 0; i < res_sum; i++)
		printf("\t第%d类资源", i + 1);
	printf("\n");

	for (int i = 0; i < sum; i++) {
		for (int j = 0; j < res_sum; j++)
			printf("\t\t%d", allocation[i][j]);
		printf("\n");
	}

	printf("进程尚需总数为(need):\n");
	for (int i = 0; i < res_sum; i++)
		printf("\t第%d类资源", i + 1);
	printf("\n");

	for (int i = 0; i < sum; i++) {
		for (int j = 0; j < res_sum; j++)
			printf("\t\t%d", need[i][j]);
		printf("\n");
	}
}
else {
	printf("请先初始化进程信息\n");
}

}

void banker() {//银行家算法检测安全性
if (res == true && pro == true) {
int name[ProNum];
//int j = 0;
int i = 0;
int t = 0;
int a = 0;
for (int s = 0; s < sum; s++) {
for (int i = 0; i < sum; i++) {
if (finish[i] == false) {
for (int j = 0; j < res_sum; j++) {
if (need[i][j] <= Available[j]) {
if (j + 1 == res_sum) {
finish[i] = true;
name[a] = i + 1;
a++;
for (int m = 0; m < res_sum; m++) {
Available[m] = Available[m] + allocation[i][m];
}
}
else {
continue;
}
}
else {
break;
}
}
}
else {
continue;
}
}
}
if (a == sum) {
printf(“安全序列为:”);
for (int j = 0; j < sum; j++)
printf(“P%d “, name[j]);
printf(”\n”);
is_safe = 1;
}
else {
printf(“该状态不安全\n”);
}
}
else {
printf(“请先初始化信息\n”);
}
}

void distribute() {
if (res == true && pro == true) {
int j = 0;
int i = 0;
int k = 0;
int num;
int tmp = 1;//是否能满足预分配
int dis[ResNum];
banker();
int t = j;
if (is_safe == 1) {
printf(“状态安全,为第几个进程预分配(从一开始):”);
scanf("%d", &num);
printf(“请输入申请资源个数:\n”);
for (int i = 0; i < res_sum; i++) {
printf("\t第%d类资源", i + 1);
}
printf("\n");

		for (int j = 0; j < res_sum; j++)
			scanf("\t\t%d", &dis[j]);
		printf("\n");
		for (int i = 0; i < res_sum; i++) {
			allocation[num - 1][i] = allocation[num - 1][i] + dis[i];
			need[num - 1][i] = need[num - 1][i] - dis[i];
			Available[i] = Available[i] - dis[i];
			if (Available[i] < 0) {
				tmp = 0;//不能满足预分配
			}
		}
		for (int i = 0; i < res_sum; i++)
		if (need[num - 1][i] == 0)
			k++;

		if (k + 1 == res_sum) {
			for (int i = 0; i < res_sum; i++) {
				need[num - 1][i] = 0;
				Available[i] = Available[i] + allocation[num - 1][i];
				allocation[num - 1][i] = 0;
			}
			finish[i] = true;
		}
		if (tmp == 0) {
			printf("请求不合法\n");
			for (int i = 0; i < res_sum; i++) {
				allocation[num - 1][i] = allocation[num - 1][i] - dis[i];
				need[num - 1][i] = need[num - 1][i] + dis[i];
				Available[i] = Available[i] + dis[i];
			}
		}
		else {
			banker();
		}
	}
	else {
		printf("该状态不安全,无法预分配\n");
	}
}
else {
	printf("请先初始化信息\n");
}

}

void main() {
init();
int option;
printf(“银行家算法\n”);
printf(“1:请输入资源总数\n”);
printf(“2:编辑进程信息\n”);
printf(“3:查看资源信息\n”);
printf(“4:检查当前状态安全性\n”);
printf(“5:进程申请预分配\n”);
printf(“请输入数字选择操作\n”);
printf(“银行家算法\n”);
while (1) {
scanf("%d", &option);
printf("\n");
switch (option) {
case 1: initRes(); break;
case 2: initPro(); break;
case 3: display(); break;
case 4: banker(); release(); break;//判断完后恢复原状态
case 5: distribute(); break;
}
printf(“请继续选择操作:”);
}
system(“pause”);
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值