1:输出随机数版本:
实验8——银行家算法
一.算法说明 先对用户提出的请求进行合法性检查,再进行预分配,利用安全性检查算法进行安全性检查。 1.进程一开始向系统提出最大资源需求量; 2.进程每次提出新的资源请求都统计是否超出它事先提出的最大需求量; 3.若正常,则判断该进程所需剩余资源量(包括本次申请)是否超出系统所掌握的剩余资源量,若不超出,则分配,否则等待。 二. 实验要求 1.修改程序的输出,提高其结果可读性; 2.在已有算法的基础上,试输出所有可能的安全序列; 3.修改MAX[M][N]的值为随机生成时,查看对安全序列的影响。
2:代码实现
#include<string.h>
#include<stdlib.h>
#include<stdio.h>
#include<math.h>
#include<time.h>
# define M 5
# define N 3
# define FALSE 0
# define TRUE 1
int MAX[M][N];
int AVAILABLE[N] = { 10,5,7 };
int ALLOCATION[M][N] = { {0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0} };
int NEED[M][N];
int Request[N] = { 0,0,0 };
void main()
{
srand(time(0));
for (int i = 0; i < M; i++)
{
for (int j = 0; j < N; j++)
{
int a;
a = rand() % 5;
MAX[i][j] = a;
NEED[i][j] = a;
}
}
int i = 0, j = 0;
char flag;
void showdata();
void changdata(int);
void rstordata(int);
int chkerr();
showdata();
enter:
{
printf("请输入需申请资源的进程号(从0到");
printf("%d", M - 1);
printf("):");
scanf("%d", &i);
}
if (i < 0 || i >= M)
{
printf("输入的进程号不存在,重新输入!\n");
goto enter;
}
err:
{
printf("请输入进程");
printf("%d", i);
printf("申请的资源数\n");
printf("类别:ABC\n");
printf("");
for (j = 0; j < N; j++)
{
scanf("%d", &Request[j]);
if (Request[j] > NEED[i][j])
{
printf("%d号进程", i);
printf("申请的资源数>进程");
printf("%d", i);
printf("还需要%d类资源的资源量!申请不合理,出错!请重新选择!\n", j);
goto err;
}
else
{
if (Request[j] > AVAILABLE[j])
{
printf("进程");
printf("%d", i);
printf("申请的资源数大于系统可用");
printf("%d", j);
printf("类资源的资源量!申请不合理,出错!请重新选择!\n");
goto err;
}
}
}
}
changdata(i);
if (chkerr())
{
rstordata(i);
showdata();
}
else
showdata();
printf("\n");
printf("按'y'或'Y'键继续,否则退出\n");
flag = getchar();
if (flag == 'y' || flag == 'Y')
{
goto enter;
}
else
{
exit(0);
}
}
void showdata()
{
int i, j;
printf("系统可用资源向量:\n");
printf("***Available***\n");
printf("资源类别:ABC\n");
printf("资源数目:");
for (j = 0; j < N; j++)
{
printf("%d", AVAILABLE[j]);
}
printf("\n");
printf("\n");
printf("各进程还需要的资源量:\n");
printf("******Need******\n");
printf("资源类别:ABC\n");
for (i = 0; i < M; i++)
{
printf("");
printf("%d", i);
printf("号进程:");
for (j = 0; j < N; j++)
{
printf("%d", NEED[i][j]);
}
printf("\n");
}
printf("\n");
printf("各进程已经得到的资源量:\n");
printf("***Allocation***\n");
printf("资源类别:ABC\n");
for (i = 0; i < M; i++)
{
printf("");
printf("%d", i);
printf("号进程:");
for (j = 0; j < N; j++)
{
printf("%d", ALLOCATION[i][j]);
}
printf("\n");
}
printf("\n");
}
void changdata(int k)
{
int j;
for (j = 0; j < N; j++)
{
AVAILABLE[j] = AVAILABLE[j] - Request[j];
ALLOCATION[k][j] = ALLOCATION[k][j] + Request[j];
NEED[k][j] = NEED[k][j] - Request[j];
}
}
void rstordata(int k)
{
int j;
for (j = 0; j < N; j++)
{
AVAILABLE[j] = AVAILABLE[j] + Request[j];
ALLOCATION[k][j] = ALLOCATION[k][j] - Request[j];
NEED[k][j] = NEED[k][j] + Request[j];
}
}
int chkerr()
{
int WORK[N], FINISH[M], temp[M];
int i, j, m, k = 0, count;
for (i = 0; i < M; i++)
FINISH[i] = FALSE;
for (j = 0; j < N; j++)
WORK[j] = AVAILABLE[j];
for (i = 0; i < M; i++)
{
count = 0;
for (j = 0; j < N; j++)
if (FINISH[i] == FALSE && NEED[i][j] <= WORK[j])
count++;
if (count == N)
{
for (m = 0; m < N; m++)
WORK[m] = WORK[m] + ALLOCATION[i][m];
FINISH[i] = TRUE;
temp[k] = i;
k++;
i = -1;
}
}
for (i = 0; i < M; i++)
if (FINISH[i] == FALSE)
{
printf("系统不安全!!!本次资源申请不成功!!!\n");
return 1;
}
printf("\n");
printf("经安全性检查,系统安全,本次分配成功。\n");
printf("\n");
printf("本次安全序列:");
for (i = 0; i < M; i++)
{
printf("进程");
printf("%d", temp[i]);
if (i < M - 1)
printf("->");
}
printf("\n");
return 0;
}
|