#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
int Available[10];
int Max[10][10];
int Allocation[10][10] = { 0 };
int Need[10][10] = { 0 };
int Work[10];
int Finish[10];
int Request[10][10];
int Pause[10];
int arr[] = { 0 };
int List[10];
int i, j;
int n;
int m;
int a;
int l, e;
int b = 0, c = 0, f = 0, g;
int z = 0;
int securitycheck()
{
printf("\n\n");
printf("\t\t\t※ 安全性检测 ※\n\n");
if (n == 3)
{
printf(" 工作向量 尚需求量 已分配 工作向量+已分配\n进程 ");
for (c = 1; c <= 4; c++)
{
for (j = 1; j <= n; j++)
{
printf(" %d类", j);
}
}
}
if (n == 2)
{
printf(" 工作向量 尚需求量 已分配 工作向量+已分配\n进程 ");
for (c = 1; c <= 4; c++)
{
for (j = 1; j <= n; j++)
{
printf(" %d类", j);
}
}
}
for (i = 1; i <= m; i++)
{
Pause[i] = Available[i];
Finish[i] = false;
}
for (g = 1; g <= m; g++)
{
for (i = 1; i <= m; i++)
{
b = 0;
Finish[i] == false;
for (j = 1; j <= n; j++)
{
if (Need[i][j] <= Pause[j])
{
b = b + 1;
}
if (Finish[i] == false && b == n)
{
Finish[i] = true;
printf("\nP[%d] ", i);
for (l = 1; l <= n; l++)
{
printf(" %2d ", Pause[l]);
}
for (j = 1; j <= n; j++)
{
printf(" %2d ", Need[i][j]);
}
for (j = 1; j <= n; j++)
{
printf(" %2d ", Allocation[i][j]);
}
for (j = 1; j <= n; j++)
{
printf(" %2d ", Pause[j] + Allocation[i][j]);
}
for (l = 1; l <= n; l++)
{
Pause[l] = Pause[l] + Allocation[i][l];
}
}
}
}
}
printf("\n\n");
for (i = 1; i <= m; i++)
{
if (Finish[i] == true) f = f + 1;
}
if (f == m)
{
printf("safe state");
printf("\n\n系统剩余资源量: ");
for (i = 1; i <= n; i++)
{
printf(" %d ", Available[i]);
}
f = 0;
return 1;
}
else
{
printf("unsafe state ");
for (i = 1; i <= n; i++)
{
Available[i] = Available[i] + Request[a][i];
Allocation[a][i] = Allocation[a][i] - Request[a][i];
Need[a][i] = Need[a][i] + Request[a][i];
}
return 0;
}
}
void initialize()
{
printf("请输入系统的资源种类数:");
scanf("%d", &n);
for (i = 1; i <= n; i++)
{
printf("第%d类资源总数:", i);
scanf("%d", &arr[i]);
}
printf("请输入进程总数:");
scanf("%d", &m);
for (i = 1; i <= m; i++)
{
for (j = 1; j <= n; j++)
{
printf("进程P[%d]对第%d类资源的最大需求量:", i, j);
scanf("%d", &Max[i][j]);
}
}
for (i = 1; i <= m; i++)
{
for (j = 1; j <= n; j++)
{
printf("进程P[%d]对第%d类资源已分配数:", i, j);
scanf("%d", &Allocation[i][j]);
Need[i][j] = Max[i][j] - Allocation[i][j];
}
}
for (i = 1; i <= n; i++)
{
for (j = 1; j <= m; j++)
{
arr[i] -= Allocation[j][i];
}
}
for (i = 1; i <= n; i++)
Available[i] = arr[i];
securitycheck();
}
void mainrequest()
{
printf("请输入申请资源的进程:");
scanf("%d", &a);
for (i = 1; i <= n; i++)
{
printf("请输入进程P[%d]对%d类资源的申请量:", a, i);
scanf("%d", &Request[a][i]);
if (Request[a][i] > Need[a][i])
{
printf("\n出错!进程申请的资源数多于它自己申报的最大需求量\n");
return;
}
if (Request[a][i] > Available[i])
{
printf("\nP[%d]请求的资源数大于可用资源数,必须等待\n", a);
return;
}
}
for (i = 1; i <= n; i++)
{
Available[i] = Available[i] - Request[a][i];
Allocation[a][i] = Allocation[a][i] + Request[a][i];
Need[a][i] = Need[a][i] - Request[a][i];
}
int ret=securitycheck();
if (ret == 1)
{
int key = 0;
for (j = 1; j <= n; j++)
{
if (Need[a][j] == 0)
{
key++;
}
}
if (key == n)
{
for (j = 1; j <= n; j++)
{
Available[j] += Allocation[a][j];
Allocation[a][j] = 0;
}
}
}
}
void mainshow()
{
printf("\n\n");
if (n == 3)
{
printf(" 已分配 最大需求量 尚需要量 \n进程");
}
if (n == 2)
{
printf(" 已分配 最大需求 尚需要量 \n进程");
}
for (i = 1; i <= 3; i++)
{
for (j = 1; j <= n; j++)
{
printf(" %d类", j);
}
}
for (i = 1; i <= m; i++)
{
printf("\nP[%d]", i);
for (j = 1; j <= n; j++)
{
printf(" %2d ", Allocation[i][j]);
}
for (j = 1; j <= n; j++)
{
printf(" %2d ", Max[i][j]);
}
for (j = 1; j <= n; j++)
{
printf(" %2d ", Need[i][j]);
}
}
printf("\n\n系统剩余资源量: ");
for (i = 1; i <= n; i++)
{
printf(" %d ", Available[i]);
}
printf("\n");
}
void menu()
{
printf("\n\n\t\t卐卍※§ 银行家算法 §※卐卍\n");
printf("\n\n\t\t\t1:初始化");
printf("\n \t\t\t2:进程进行资源申请");
printf("\n \t\t\t3:资源分配状态");
printf("\n \t\t\t4:退出程序");
printf("\n\n\t\t\t\t\t 请输入你的选择: ");
}
int main()
{
int key = 0;
printf("\n\n");
while (1)
{
menu();
scanf("%d", &key);
printf("\n\n");
switch (key)
{
case 1:
initialize();
break;
case 2:
mainrequest();
break;
case 3:
mainshow();
break;
case 4:
printf("\n\n\t\t\t谢谢使用 \n");
printf("\n\t\t\tSee you next time !\n\n\n");
system("pause");
return 0;
}
}
system("pause");
return 0;
}