您的位置:首页 > 编程语言 > C语言/C++

银行家算法——C语言(11计科1班-孙鹏启——修正)

2016-02-01 00:00 519 查看
#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 银行家]#
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: