银行家问题1

#include <stdio.h>
int curr[5][5], maxclaim[5][5], avl[5];
int alloc[5] = {0, 0, 0, 0, 0};//已分配的资源
int maxres[5], running[5], safe=0;
int count = 0, i, j, exec, r, p, k = 1;

void main()
{
    printf("\n请输入进程的个数: ");
    scanf("%d", &p);

    for (i = 0; i < p; i++) {
        running[i] = 1;//i进程运行
        count++;//进程运行个数
    }

    printf("\n请输入资源数目: ");
    scanf("%d", &r);

    printf("\n请输入各资源的数量:");
    for (i = 0; i < r; i++) { 
        scanf("%d", &maxres[i]);
    }

    printf("\n请输入已分配的资源表:\n");
    for (i = 0; i < p; i++) {
        for(j = 0; j < r; j++) {
            scanf("%d", &curr[i][j]);
        }
    }

    printf("\n请输入最大资源表:\n");
    for (i=0; i<p;i++) {
        for(j=0;j<r;j++) {
            scanf("%d", &maxclaim[i][j]);
        }
    }

    printf("\n各资源数量为s: ");
    for (i = 0; i < r; i++) {
        printf("\t%d", maxres[i]);
    }

    printf("\n已分配的资源表为:\n");
    for (i = 0; i < p; i++) {
        for (j = 0; j < r; j++) {
            printf("\t%d", curr[i][j]);//输出已分配的资源
        }

        printf("\n");
    }

    printf("\n最大资源表为:\n");
    for (i = 0; i < p; i++) {//p进程个数
        for (j = 0; j < r; j++) {//r资源个数
            printf("\t%d", maxclaim[i][j]);//输出最大资源表
        }

        printf("\n");
    }

    for (i = 0; i < p; i++) {
        for (j = 0; j < r; j++) {
            alloc[j] += curr[i][j];//一共分配了多少
        }
    }

    printf("\n已分配的资源:");
    for (i = 0; i < r; i++) {
        printf("\t%d", alloc[i]);//输出一共分配了多少资源
    }

    for (i = 0; i < r; i++) {
        avl[i] = maxres[i] - alloc[i];//ke利用的资源  available
    }

    printf("\n可利用的资源:");
    for (i = 0; i < r; i++) {
        printf("\t%d", avl[i]);//输出可利用的资源
    }
    printf("\n");

    //Main procedure goes below to check for unsafe state.
    while (count != 0) {//有进程执行
        safe = 0;//初始化进程不安全
        for (i = 0; i < p; i++) {
            if (running[i]) {
                exec = 1;
                for (j = 0; j < r; j++) {
                    if (maxclaim[i][j] - curr[i][j] > avl[j]) {
                        exec = 0;//需要的资源大于可利用的资源不能执行
                        break;
                    }
                }
                if (exec) {
                    printf("\n进程%d 正在运行\n", i + 1);
                    running[i] = 0;
                    count--;//运行个数减一
                    safe = 1;//处于安全状态

                    for (j = 0; j < r; j++) {
                        avl[j] += curr[i][j];//更新可利用的资源
                    }

                    break;
                }
            }
        }
        if (!safe) {
            printf("\n该进程不安全.\n");
            break;
        } else {
            printf("\n该进程安全");
            printf("\n可利用的资源为:");

            for (i = 0; i < r; i++) {
                printf("\t%d", avl[i]);
            }

            printf("\n");
        }
    }
}

/*SAMPLE  OUTPUT
-----------------
Enter the number of processes:5 进程个数

Enter the number of resources:4 资源数量

Enter Claim Vector:8 5 9 7 输入各种资源的数量

Enter Allocated Resource Table:输入已分配的资源表
2 0 1 1
0 1 2 1
4 0 0 3
0 2 1 0
1 0 3 0

Enter Maximum Claim Table:输入最大量
3 2 1 4
0 2 5 2
5 1 0 5
1 5 3 0
3 0 3 3

The Claim Vector is:    8   5   9   7
The Allocated Resource Table:
    2   0   1   1
    0   1   2   1
    4   0   0   3
    0   2   1   0
    1   0   3   0

The  Maximum Claim Table:
    3   2   1   4
    0   2   5   2
    5   1   0   5
    1   5   3   0
    3   0   3   3

 Allocated resources:   7   3   7   5已分配的资源
 Available resources:   1   2   2   2可用的资源

Process3 is executing

 The process is in safe state
 Available vector:  5   2   2   5
Process1 is executing

 The process is in safe state
 Available vector:  7   2   3   6
Process2 is executing

 The process is in safe state
 Available vector:  7   3   5   7
Process4 is executing

 The process is in safe state
 Available vector:  7   5   6   7
Process5 is executing

 The process is in safe state
 Available vector:  8   5   9   7

 ---------------------------------------------------------*/

  

猜你喜欢

转载自www.cnblogs.com/zili/p/9900511.html