C語言實現銀行家算法


 

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h> // bool 類型


int N = 0;         // 進程數目
int M = 0;         // 資源數目
int* Available;    // 可利用資源向量 M
int** Max;         // 最大需求矩陣 M * N
int** Allocation;  // 分配矩陣 M * N
int** Need;        // 需求矩陣 M * N


// 初始化數據結構
void init();

// 銷毀數據結構
void destory();

// 安全性檢查算法
void security_checks();


int main(int argc, char const *argv[]) {
    init();
    security_checks();
    destory();
    return 0;
}


/**
 * 初始化數據結構
 */
void init() {
    printf("依次輸入進程數目和資源類型數目:");
    scanf("%d%d", &N, &M);

    // 分配內存
    Available = malloc(sizeof(int*) * N);
    Max = malloc(sizeof(int*) * N);
    Allocation = malloc(sizeof(int*) * N);
    Need = malloc(sizeof(int*) * N);
    for (int i = 0; i < N; i++) {
        Max[i] = malloc(sizeof(int) * M);
        Allocation[i] = malloc(sizeof(int) * M);
        Need[i] = malloc(sizeof(int) * M);
    }

    // 賦值
    for (int i = 0; i < M; i++) {
        printf("輸入資源類型%d的數目:", i);
        scanf("%d", &(Available[i]));
    }

    for (int i = 0; i < N; i++) {
        for (int j = 0; j < M; j++) {
            printf("依次輸入進程%d對資源類型%d的最大需求及已獲得的數量:", i, j);
            scanf("%d%d", &(Max[i][j]), &(Allocation[i][j]));
            Available[j] -= Allocation[i][j];
            Need[i][j] = Max[i][j] - Allocation[i][j];
        }
    }
}


/**
 * 銷毀數據結構
 */
void destory() {
    free(Available);
    for (int i = 0; i < N; i++) {
        free(Max[i]);
        free(Need[i]);
        free(Allocation[i]);
    }
}


/**
 * 安全性檢查算法
 */
void security_checks() {
    int Work[M];
    bool Finish[N];
    for (int i = 0; i < N; i++) {
        Finish[i] = false;
    }
    for (int i = 0; i < M; i++) {
        Work[i] = Available[i];
    }

    int finish_count = 0; // 結束任務的進程數目
    char security_seq[N][5]; // 安全序列
    while (true) {
        bool had_allocated = false; // 判斷本輪是否分配
        for (int i = 0; i < N; i++) {
            if (Finish[i] == false) { // 找一個沒有結束的進程
                bool all_valid = true;
                for (int j = 0; j < M; j++) { // 如果對所有資源的Need[i][j]都小於Work[j],則分配
                    if (Need[i][j] > Work[j]) { // 但凡有一個不滿足,則不分配
                        all_valid = false;
                        break;
                    }
                }
                if (all_valid == true) { // 分配並回收資源
                    for (int j = 0; j < M; j++) {
                        Work[j] += Allocation[i][j];
                    }
                    Finish[i] = true;
                    had_allocated = true;
                    sprintf(security_seq[finish_count++], "P%d\0", i);
                }
            }
        }
        if (finish_count == N) { // 結束,安全
            puts("系統處於安全狀態");
            printf("進程安全序列為:");
            for (int i = 0; i < N; i++) { // 輸出安全序列
                printf("[%s]", security_seq[i]);
                if (i != N - 1) printf(" => ");
                else puts("");
            }
            return ;
        } else if (had_allocated == false) { // 結束,不安全
            puts("系統處於不安全狀態");
            return ;
        }
    }
}

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM