#define M 50
#include “stdio.h”
int max[M][M], allocation[M][M], need[M][M], available[M]; /*定义全局变量 */
int i, j, n, m, r, t;
void main()
{
void check();
void print();
int p, q;
int req[M], allocation1[M][M], need1[M][M], available1[M];
printf(“Please input the processes sum:”);
scanf(“%d”, &n); /*输入进程总数 */
printf(“Please input the kinds sum :”);
scanf(“%d”, &m); /*输入资源种类总数 */
printf(“please input the max resources :”);
for (i = 0; i < n; i++)
for (j = 0; j < m; j++) {
scanf(“%2d”, &max[i][j]);
} /*输入最大矩阵 */
printf(“please input the allocation resources :”);
for (i = 0; i < n; i++)
for (j = 0; j < m; j++)
scanf(“%d”, &allocation[i][j]); /*输入已分配资源数 */
printf(“please input the need resources :”);
for (i = 0; i < n; i++)
for (j = 0; j < m; j++) {
need[i][j] = max[i][j] – allocation[i][j];
printf(“%2d”, need[i][j]);
} /*输出还需要的资源数 */
printf(“\nplease input the available number :”);
for (i = 0; i < m; i++)
scanf(“%d”, &available[i]); /*输入可用资源数 */
check(); /*检测已知的状态是否安全 */
if (r == 1) { /*如果已知的状态安全则执行以下代码 */
do {
t = 1;
p = 0, q = 0;
printf(“\nplease input the NO. of process: “);
scanf(“%d”, &i); /*输入请求资源的进程号 */
printf(“please input the resources of request:”);
for (j = 0; j < m; j++)
scanf(“%d”, &req[j]); /*输入该进程所需的资源数 */
for (j = 0; j < m; j++)
if (req[j] > need[i][j])
p = 1; /*判断请求是否超过最大资源数 */
if (p)
printf(“The resources of request have been beyond the max number needed!”);
else {
for (j = 0; j < m; j++)
if (req[j] > available[j])
q = 1; /*判断请求是否超过可用资源数 */
if (q)
printf(“There are not enough available resources!”);
else {
for (j = 0; j < m; j++) { /*请求满足条件 */
available1[j] = available[j]; /* 保存原已分配的资源数,需要的资源数,和可用的资源数 */
allocation1[i][j] = allocation[i][j];
need1[i][j] = need[i][j];
available[j] = available[j] – req[j]; /* 系统尝试把资源分配给请求的进程 */
allocation[i][j] = allocation[i][j] + req[j];
need[i][j] = need[i][j] – req[j];
}
print(); /*输出可用资源数 */
check(); /*进行安全检测 */
if (r == 0) { /*分配后状态不安全 */
for (j = 0; j < m; j++) {
available[j] = available1[j]; /* 还原分配前的已分配的资 源数,仍需要的资源数和可用的资源数 */
allocation[i][j] = allocation1[i][j];
need[i][j] = need1[i][j];
}
printf(” This is unsafe and return:\n”);
print();
}
}
}
printf(“\nDo you want to continue? y(1) or n(0):”); /*判断是否继续进行资源分配 */
scanf(“%d”, &t);
} while (t == 1);
}
}
void check()
{ /*检测函数 */
int k, f, v = 0;
int work[M], a[M];
char finish[M];
r = 1;
for (i = 0; i < n; i++)
finish[i] = ‘F’; /*初始化各进程均没得到足够资源并完成 */
for (j = 0; j < m; j++)
work[j] = available[j]; /*用work[j]表示可提供进程继续运行的各类资源数 */
k = n;
do {
for (i = 0; i < n; i++) {
if (finish[i] == ‘F’) {
f = 1;
for (j = 0; j < m; j++)
if (need[i][j] > work[j])
f = 0;
if (f == 1) { /*找到还没完成的且需求数小于可提供进程继续运行的 */
finish[i] = ‘T’; /*资源数的进程 */
a[v++] = i; /*记录安全序列 */
for (j = 0; j < m; j++)
work[j] = work[j] + allocation[i][j]; /*释放该进程已分配的资源 */
}
}
}
k–;
} while (k > 0);
f = 1;
for (i = 0; i < n; i++) { /*判断是否所有的进程都完成 */
if (finish[i] == ‘F’) {
f = 0;
break;
}
}
if (f == 0) { /*若有进程没完成,则为不安全状态 */
printf(“This is unsafe . \n”);
r = 0;
} else { /* 否则为安全状态 */
printf(“This is safe .”);
printf(” the safe number is:”);
for (i = 0; i < n; i++)
printf(“%d “, a[i]); /*输出安全序列 */
printf(“\n”);
for (i = 0; i < n; i++) {
printf(“%2d”, i);
printf(” “);
for (j = 0; j < m; j++)
printf(“%2d”, allocation[i][j]);
printf(” “);
for (j = 0; j < m; j++)
printf(“%2d”, need[i][j]);
printf(“\n”);
}
}
}
void print()
{ /*输出函数 */
int process[M];
printf(“The available resources: \n”);
for (j = 0; j < m; j++)
printf(“%2d “, available[j]);
printf(“\n”);
}
++++++++++++++++++++++++++++++++++++++++++++++++
[root@localhost 银行家]# gcc banker.c -o banker
[root@localhost 银行家]# ./banker
Please input the processes sum:5
Please input the kinds sum :3
please input the max resources :7 5 3 3 2 2 9 0 2 2 2 2 4 3 3
please input the allocation resources :0 1 0 2 0 0 3 0 2 2 1 1 0 0 2
please input the need resources : 7 4 3 1 2 2 6 0 0 0 1 1 4 3 1
please input the available number :3 3 2
This is safe . the safe number is:1 3 4 0 2
0 0 1 0 7 4 3
1 2 0 0 1 2 2
2 3 0 2 6 0 0
3 2 1 1 0 1 1
4 0 0 2 4 3 1
please input the NO. of process: 1
please input the resources of request:1 0 2
The available resources:
2 3 0
This is safe . the safe number is:1 3 4 0 2
0 0 1 0 7 4 3
1 3 0 2 0 2 0
2 3 0 2 6 0 0
3 2 1 1 0 1 1
4 0 0 2 4 3 1
Do you want to continue? y(1) or n(0):1
please input the NO. of process: 4
please input the resources of request:3 3 0
There are not enough available resources!
Do you want to continue? y(1) or n(0):1
please input the NO. of process: 0
please input the resources of request:0 2 0
The available resources:
2 1 0
This is unsafe .
This is unsafe and return:
The available resources:
2 3 0
Do you want to continue? y(1) or n(0):0
[root@localhost 银行家]#