【操作系統】銀行家算法


【實驗目的】

①理解銀行家算法。

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

 【實驗內容】

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

例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.銀行家算法要在資源分配之前查看系統是否安全

 


免責聲明!

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



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