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