# 银行家算法——C语言

#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];

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  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 银行家]#

原文作者：银行家问题
原文地址: https://blog.csdn.net/Dark_gezi/article/details/59053997
本文转自网络文章，转载此文章仅为分享知识，如有侵权，请联系博主进行删除。