1. 程式人生 > 其它 >實驗三 程序死鎖

實驗三 程序死鎖

【實驗目的】

①理解銀行家演算法。

②掌握程序安全性檢查的方法及資源分配的方法。

 【實驗內容】

編制模擬銀行家演算法的程式,並以下面給出的例子驗證所編寫的程式的正確性。

例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需要(0420)個資源的請求,對程序進行修改並重新判斷是否安全實驗結果如下:

【實驗結果分析】

1.安全狀態一定是沒有死鎖發生。不安全狀態不一定導致死鎖。

2.如果一個由系統有安全序列,則系統處於安全狀態。

3.銀行家演算法要在資源分配之前檢視系統是否安全