【實驗目的】
①理解銀行家算法。
②掌握進程安全性檢查的方法及資源分配的方法。
【實驗內容】
編制模擬銀行家算法的程序,並以下面給出的例子驗證所編寫的程序的正確性。
例4-1某系統有A、B、C、D4類資源共5個進程(PO、P1、P2、P3、P4)共享,
各進程對資源的需求和分配情況如表4-1所示。
表4-1各進程對資源的需求和分配情況表
進程 |
已占資源 |
最大需求數 |
||||||
A |
B |
C |
D |
A |
B |
C |
D |
|
P0 |
0 |
0 |
1 |
2 |
0 |
0 |
1 |
2 |
P1 |
1 |
0 |
0 |
0 |
1 |
7 |
5 |
0 |
P2 |
1 |
1 |
5 |
4 |
2 |
3 |
5 |
6 |
P3 |
0 |
6 |
3 |
2 |
0 |
6 |
5 |
2 |
P4 |
0 |
0 |
1 |
1 |
0 |
6 |
5 |
6 |
現在系統中A、B、C、D4類資源分別還剩1、5、2、0個,請按銀行家算法回答下列問題:
①現在系統是否處於安全狀態?
②如果現在進程Pl提出需要(0、4、2、0)個資源的請求,系統能否滿足它的請求?
【實驗步驟】
1:數據結構
int Available[100];
int Max[50][100];
int Allocation[50][100];
int Need[50][100];
int Request[50][100];
int Finish[50];
int p[50];
int m, n;
流程圖1.2:銀行家算法程序流程圖
1.3 實驗代碼
#include <iostream> using namespace std; //全局變量定義 int Available[100]; //可利用資源數組 int Max[50][100]; //最大需求矩陣 int Allocation[50][100]; //分配矩陣 int Need[50][100]; //需求矩陣 int Request[50][100]; //M個進程還需要N類資源的資源量 int Finish[50]; int p[50]; int m, n; //M個進程,N類資源 //安全性算法 int Safe() { int i, j, l = 0; int Work[100]; //可利用資源數組 for (i = 0; i < n; i++) Work[i] = Available[i]; for (i = 0; i < m; i++) Finish[i] = 0; for (i = 0; i < m; i++) { if (Finish[i] == 1) continue; else { for (j = 0; j < n; j++) { if (Need[i][j] > Work[j]) break; } if (j == n) { Finish[i] = 1; for (int k = 0; k < n; k++) Work[k] += Allocation[i][k]; p[l++] = i; i = -1; } else continue; } if (l == m) { cout << "系統是安全的" << '\n'; cout << "系統安全序列是:\n"; for (i = 0; i < l; i++) { cout << p[i]; if (i != l - 1) cout << "-->"; } cout << '\n'; return 1; } } } //銀行家算法 int main() { int i, j, mi; printf("\n"); cout << "輸入進程的數目:\n"; cin >> m; cout << "輸入資源的種類:\n"; cin >> n; cout << "輸入每個進程最多所需的各類資源數,按照" << m << "x" << n << "矩陣輸入\n"; for (i = 0; i < m; i++) for (j = 0; j < n; j++) cin >> Max[i][j]; cout << "輸入每個進程已經分配的各類資源數,按照" << m << "x" << n << "矩陣輸入\n"; for (i = 0; i < m; i++) { for (j = 0; j < n; j++) { cin >> Allocation[i][j]; Need[i][j] = Max[i][j] - Allocation[i][j]; if (Need[i][j] < 0) { cout << "你輸入的第" << i + 1 << "個進程所擁有的第" << j + 1 << "個資源錯誤,請重新輸入:\n"; j--; continue; } } } cout << "請輸入各個資源現有的數目:\n"; for (i = 0; i < n; i++) cin >> Available[i]; Safe(); while (1) { cout << "輸入要申請的資源的進程號:(第一個進程號為0,第二個進程號為1,依此類推)\n"; cin >> mi; cout << "輸入進程所請求的各個資源的數量\n"; for (i = 0; i < n; i++) cin >> Request[mi][i]; for (i = 0; i < n; i++) { if (Request[mi][i] > Need[mi][i]) { cout << "所請求資源數超過進程的需求量!\n"; return 0; } if (Request[mi][i] > Available[i]) { cout << "所請求資源數超過系統所有的資源數!\n"; return 0; } } Safe(); for (i = 0; i < n; i++) { Available[i] -= Request[mi][i]; Allocation[mi][i] += Request[mi][i]; Need[mi][i] -= Request[mi][i]; } if (Safe()) cout << "同意分配請求\n"; else { cout << "你的請求被拒\n"; for (i = 0; i < n; i++) { Available[i] += Request[mi][i]; Allocation[mi][i] -= Request[mi][i]; Need[mi][i] += Request[mi][i]; } } for (i = 0; i < m; i++) Finish[i] = 0; char YesOrNo; //標志位 cout << "是否再次請求分配?是請按Y/y,否請按N/n \n"; while (1) { cin >>YesOrNo; if (YesOrNo == 'Y' || YesOrNo == 'y' || YesOrNo == 'N' || YesOrNo == 'n') break; else { cout << "請按要求重新輸入:\n"; continue; } } if (YesOrNo == 'Y' ||YesOrNo == 'y') continue; else break; } }
實驗結果
1.根據五個進成和數據,判斷系統是否安全結果如下:
進程p1需要(0、4、2、0)個資源的請求,對進程進行修改並重新判斷是否安全實驗結果如下:
【實驗結果分析】
1.安全狀態一定是沒有死鎖發生。不安全狀態不一定導致死鎖。
2.如果一個由系統有安全序列,則系統處於安全狀態。
3.銀行家算法要在資源分配之前查看系統是否安全