【作業系統】小型銀行家演算法實現
阿新 • • 發佈:2019-02-12
一.銀行家演算法簡介:
銀行家演算法是一種避免死鎖的演算法。在避免死鎖方法中允許程序動態地申請資源,但系統在進行資源分配之前,應先j檢查並計算此次分配資源的安全性,若分配不恰當會導致導致系統進入不安全狀態,則等待.如果處於安全狀態則分配。
輸入一些資源量,最大需要的資源量,已開闢的資源量,並且已知在程序裡面可分配資源的數量,當某一個程序請求時,判斷子請求是否合理。
我是用結構體存放資料的,我覺得這樣比較讓自己容易接受。
二.程式模組
1.初始化模組。
2.試探分配模組。
3.資源回收模組。
4.安全性檢查模組。
5.資源請求分配模組。
6.主函式,自己輸入資料測試。
三.程式流程圖
全部流程圖:
(2)安全性檢查流程圖
(3)資源分配流程圖
開始
程式碼:
:#include <stdio.h> #include <string.h> #define false 0 #define All_Reource 50 #define Vallue 10 typedef struct { int arr[Vallue]; }Resource; int safe[All_Reource] = { 0 }; Resource ptr; Resource Resource_Max[All_Reource] = { 0 };//最大需求矩陣 Resource Resource_Allocation[All_Reource] = { 0 };//已分配資源數矩陣 Resource Resource_Need[All_Reource] = { 0 };//需求矩陣 //可用資源向量 Resource Available; Resource Work; //int safe[All_Reource] = { 0 }; void Init(int Numz) { int i; for (i = 0; i < Numz; i++) { printf("請輸入可用資源向量Ava:\n"); scanf("%d", &Available.arr[i]); } } void Resource_Max_Init(int Num, int Numz) { for (int i = 0; i<Num; i++) { //printf("please input the P%d source\n", i); printf("please input the number of P%d max source \n ", i); for (int j = 0; j < Numz; j++) { printf("請輸入 P%d 的%d類資源:\n", i, j); scanf("%d", &Resource_Max[i].arr[j]); } } } void Resource_Allocation_Init(int Num,int Numz) { for (int i = 0; i < Num; i++) { printf("please input the P%d source\n", i); for (int j = 0; j < Numz; j++) { printf("請輸入 P%d 的%d類分配的資源:\n", i, j); scanf("%d", &Resource_Allocation[i].arr[j]); } } } //void Resource_Need_Init(int Num,int Numz) // //{ // for (int i = 0; i<Num; i++) // { // printf("please input the P%d's source\n", i); // for (int j = 0; j < Numz; j++) // { // printf("請輸入 P%d 的%d類需要的資源:\n", i, j); // scanf("%d", &Resource_Need[i].arr[j]); // } // } //} void Resource_Need_Init(int Num,int Numz) { for (int i = 0; i < Num;i++) { for (int j = 0; j < Numz;j++) { Resource_Need[i].arr[j] = Resource_Max[i].arr[j] - Resource_Allocation[i].arr[j]; } } } //試探分配 void ProbeAlloc(int process, Resource *res,int Numz) { for (int i = 0; i < Numz; i++) { Available.arr[i] -= res->arr[i]; Resource_Allocation[process].arr[i] += res->arr[i]; Resource_Need[process].arr[i] -= res->arr[i]; } } //若試探分配後進入不安全狀態,將以試分配的的資源回收 void RollBack(int process, Resource *res,int Numz) { for (int i = 0; i < Numz; i++) { Available.arr[i] += res->arr[i]; Resource_Allocation[process].arr[i] -= res->arr[i]; Resource_Need[process].arr[i] += res->arr[i]; } } //安全性檢查 bool SafeCheck(int Num,int Numz) { int num = 0; int Finish[All_Reource]; for (; num < Num; num++) { Finish[num] = { false }; } int i; int j = 0; Work = Available; for (i = 0; i < Num; i++) { //是否已檢查過 if (Finish[i] == false) { int n = 0; //是否有足夠的資源分配給該程序 for (n=0; n < Numz;) { if (Resource_Need[i].arr[n] <= Work.arr[n]) { n++; } else { break; } } if (n==Numz) { for (int nb = 0; nb < Numz; nb++) { Work.arr[nb] += Resource_Allocation[i].arr[nb]; } Finish[i] = true; safe[j++] = i; i = -1; } } } //如果所有程序的Finish向量都為true則處於安全狀態,否則為不安全狀態 for (i = 0; i < Num; i++) { if (Finish[i] == false) { return false; } } return true; } //資源分配請求 bool request(int process, Resource *res, int Num,int Numz) { int j; int i; for (i = 0; i < Numz;) { if (res->arr[i] <= Resource_Need[process].arr[i])//請求量是否小於需求量 { i++; } else { printf("請求量大於需求量\n"); return false; } } for (j = 0; j < Numz;) { if (res->arr[j] <= Available.arr[j])//請求量是否小於系統的可用資源量 { j++; } else { printf("請求量大於需可用量\n"); return false; } } //試探分配 ProbeAlloc(process, res,Numz); //如果安全檢查成立,則請求成功,否則將分配失敗並返回失敗 if (SafeCheck(Num, Numz)) { return true; } else { printf("安全性檢查失敗,系統將進入不安全狀態\n"); RollBack(process, res,Numz); return false; } } void PrintfTable(int Numz) { int i; printf("Ava :"); for (i = 0; i < Numz; i++) { printf("%d ",Available.arr[i]); } printf("\n"); } int main() { int y; int d; int ch; int num = 0; int numz = 0; int i = 0; printf("請輸入程序總數: "); scanf("%d", &num); printf("請輸入資源種類: "); scanf("%d", &numz); for (i = 0; i < numz; i++) { ptr.arr[i] = i; } Init(numz); Resource_Max_Init(num, numz); Resource_Allocation_Init(num, numz); Resource_Need_Init(num, numz); printf("先檢查初始狀態是否安全\n"); if (SafeCheck(num, numz)) { //printf("系統處於安全狀態\n"); printf("輸出安全序列:\n"); for (d = 0; d < num; d++) { printf("p%d", safe[d]); } printf("\n"); } else { printf("系統處於不安全狀態,程式將退出...\n"); getchar(); return -1; } do { int process; Resource res; PrintfTable(numz); printf("請輸入需要請求的程序數:"); scanf("%d", &process); for (y = 0; y < numz; y++) { printf("請輸入程序數%d分配資源數量%d: ", process, y); scanf("%d", &res.arr[y]); } if (request(process, &res, num, numz)) { int a; printf("分配成功。\n"); printf("輸出安全序列:\n"); for (a = 0; a < num; a++) { printf("p%d", safe[a]); printf("\n"); } //PrintfTable(numz); int n1 = 0; for (int i = 0; i < numz;i++) { if (Resource_Need[process].arr[i]==0) { n1++; } else { break; } } if (n1 == numz) { for (int i = 0; i < numz;i++) { Available.arr[i] += Resource_Allocation[process].arr[i]; } } PrintfTable(numz); } else { printf("分配失敗。\n"); } printf("是否繼續分配?(Y/N):"); fflush(stdin); ch = getchar(); } while (ch == 'Y' || ch == 'y'); return 0; }
(流程圖太大了,不好截圖,所以只能分開截圖)。