天天看點

實驗二 銀行家算法

一、實驗目的

死鎖會引起計算機工作僵死,是以作業系統中必須防止。本實驗的目的在于讓我們獨立地使用進階語言編寫和調試一個系統動态配置設定資源的簡單模拟程式,了解死鎖産生的條件和原因,并采用銀行家算法有效地防止死鎖的發生,以加深對課堂上所講授的知識的了解。

二、實驗内容

設計有 n 個程序共享 m 個系統資源的系統,程序可動态的申請和釋放資源,系統按各程序的申請動态的配置設定資源。調用銀行家算法和安全性算法完成配置設定,給出系統是否安全的提示。系統能顯示各個程序申請和釋放資源,以及系統動态配置設定資源的過程,便于使用者觀察和分析。

三、實驗要求

設計有 n 個程序共享 m 個系統資源的系統,程序可動态的申請和釋放資源,系統按各程序的申請動态的配置設定資源。

系統能顯示各個程序申請和釋放資源,以及系統動态配置設定資源的過程,便于使用者觀察和分析;

  • 實驗過程

1.資料結構:

1)可利用資源向量 Available ,它是一個含有 m 個元素的數組,其中的每一個元素代表一類可利用的資源的數目,其初始值是系統中所配置的該類全部可用資源數目。其數值随該類資源的配置設定和回收而動态地改變。如果 Available(j)=k,表示系統中現有 Rj 類資源 k 個。

2)最大需求矩陣 Max,這是一個 n×m 的矩陣,它定義了系統中 n 個程序中的每一個程序對 m 類資源的最大需求。如果 Max(i,j)=k,表示程序 i 需要 Rj 類資源的最大數目為 k。

3)配置設定矩陣 Allocation,這是一個 n×m 的矩陣,它定義了系統中的每類資源目前一配置設定到每一個程序的資源數。如果 Allocation(i,j)=k,表示程序 i 目前已經分到 Rj 類資源的數目為 k。Allocation i 表示程序 i 的配置設定向量,有矩陣 Allocation的第 i 行構成。

4)需求矩陣 Need,這是一個 n×m 的矩陣,用以表示每個程序還需要的各類資源的數目。如果 Need(i,j)=k,表示程序 i 還需要 Rj 類資源 k 個,才能完成其任務。Need i 表示程序 i 的需求向量,由矩陣 Need 的第 i 行構成。

上述三個矩陣間存在關系:Need(i,j)=Max(i,j)-Allocation(i,j);

  1. 安全性算法

1)設定兩個向量。

Work:它表示系統可提供給程序繼續運作的各類資源數目,它包含 m 個元素,開始執行安全性算法時,Work = Available。

Finish:它表示系統是否有足夠的資源配置設定給程序,使之運作完成,開始 Finish (I)=false;當有足夠資源配置設定給程序 Pi 時,令 Finish(i)=true;

2)從程序集合中找到一個能滿足下述條件的程序。

Finish(i)= = false;

Need i ≤work;

如找到則執行步驟 3;否則,執行步驟 4;

3)當程序 Pi 獲得資源後,可順利執行直到完成,并釋放出配置設定給它的資源,故應執行

Work = work + Allocation i

Finish(i)=true;轉向步驟 2;

4)若所有程序的 Finish(i)都為 true,則表示系統處于安全狀态;否則,系統處于不安全狀态。

實驗二 銀行家算法

五、實驗分析與實作

//安全算法及銀行家算法
void Security(vector<int>avail,vector<vector<int> >Allocation,vector< vector<int> >Need,int n,int m)
{
    char seq[n+1];//列出安全序列
    int work[m];
    bool finish[m];// 表示系統是否有足夠的資源配置設定給程序
    int judge[n];//判斷need是否小于work,小于則為1
    int safety=0;//累計安全序列個數
    int unsafety=n;//累計不安全序列個數
    //初始化finish
    for(int i=0;i<m;i++)
    {
        finish[i]=false;
    }
    for(int i=0;i<m;i++)
    {
        for(int j=0;j<n;j++)
        {
            work[j]=avail[j];
            if(Need[i][j]<= work[j])
                judge[i]=1;
            else
                judge[i]=0;
        }
        finish[i]=false;
    }
    //判斷是否安全及資源調配
    while(safety<=n)
    {
        for(int i=0;i<n;i++)
        {
            if(finish[i]==false && judge[i]==1)//從程序集合中找到一個能滿足下述條件的程序
            {
                for(int j=0;j<m;j++)
                {
                    work[j]+=Allocation[i][j];
                    finish[i]=true; 
                }
                unsafety--; 
                seq[safety]=i+'1';
                safety++;
            }
            else
            {
                continue;
                unsafety++;
                safety++;
            }
        }
        if(unsafety==n)
        {
            cout<<"系統處于不安全狀态"<<endl;
            break;
        }
        else if(safety==n)
        {
            cout<<"系統處于安全狀态"<<endl;
            cout<<"安全序列為:"<<seq<<endl;
            break;
        }
    }
}
           

六、實驗過程中的問題及對應思考

1.如何定義一個可變大小的數組

解決:使用容器

2.如何判斷系統屬于安全或者不安全狀态

解決:使用變量safety和unsafety計數

3.如何輸出安全序列

解決:定義一個字元串seq記錄每次的安全序列

七、附錄

#include <iostream>
#include <vector>
using namespace std;

//安全算法及銀行家算法
void Security(vector<int>avail,vector< vector<int> >Allocation,vector< vector<int> >Need,int n,int m)
{
    char seq[n+1];//列出安全序列
    int work[m];
    bool finish[m];
    int judge[n];//判斷need是否小于work,小于則為1
    int safety=0;
    int unsafety=n;
    //初始化finish
    for(int i=0;i<m;i++)
    {
        finish[i]=false;
    }
    for(int i=0;i<m;i++)
    {
        for(int j=0;j<n;j++)
        {
            work[j]=avail[j];
            if(Need[i][j]<= work[j])
                judge[i]=1;
            else
                judge[i]=0;
        }
        finish[i]=false;
    }
    //判斷是否安全及資源調配
    while(safety<=n)
    {
        for(int i=0;i<n;i++)
        {
            if(finish[i]==false && judge[i]==1)//從程序集合中找到一個能滿足下述條件的程序
            {
                for(int j=0;j<m;j++)
                {
                    work[j]+=Allocation[i][j];
                    finish[i]=true; 
                }
                unsafety--; 
                seq[safety]=i+'1';
                safety++;
            }
            else
            {
                continue;
                unsafety++;
                safety++;
            }
        }
        if(unsafety==n)
        {
            cout<<"系統處于不安全狀态"<<endl;
            break;
        }
        else if(safety==n)
        {
            cout<<"系統處于安全狀态"<<endl;
            cout<<"安全序列為:"<<seq<<endl;
            break;
        }
    }
}

int main()
{
    int m,n;//資源數,程序數
    int i,j;
    bool judge=false;//判斷need矩陣是否為0;
    cout<<"輸入程序數n:"<<endl;
    cin>>n;
    cout<<"輸入資源數m:"<<endl;
    cin>>m;
    vector< vector<int> >Max(n,vector<int>(m));//最大需求矩陣
    vector< vector<int> >Allocation(n,vector<int>(m));//已占據的資源數
    vector< vector<int> >Need(n,vector<int>(m));//需求矩陣
    vector< vector<int> >Req(n,vector<int>(m));//資源請求矩陣
    vector<int>re(m);//輸入各類資源總數
    vector<bool>need_re(n);//标記各程序是否需要資源
    vector<int>avail(m);//可獲得資源向量
    //輸入各類資源總數,初始化available向量
    cout<<"初始化available向量,請輸入m個數,初始化各類資源總數:"<<endl;
    for(j=0;j<m;j++)
    {
        cin>>re[j];
        avail[j]=rand()*(re[j]+1);
    }
    //輸入程序 i 的最大需求向量 max
    cout<<"輸入程序最大需求向量 max"<<endl;
    for(i=0;i<n;i++){
        cout<<"請輸入第"<<i+1<<"個程序資源數:"<<endl;
        for(j=0;j<m;j++){
            cin>>Max[i][j]; 
            if(Max[i][j]>re[j])
            {
                cout<<"最大需求向量大于資源總數,請重新輸入:";
                cin>>Max[i][j];
            }
            else{
                Allocation[i][j]=((rand()%100)/100*(Max[i][j]+1));
                Need[i][j]=Max[i][j]-Allocation[i][j];
                if(Need[i][j]==0)//判斷need矩陣是否為0;
                    judge=true;
                else
                    judge=false;
            }
        }
        if(judge==true)//判斷need矩陣是否為0,若為0則目前程序已運作結束,标記為0;
            need_re[i]=0;
        else
            need_re[i]=1;
    }
    if(judge==true)//判斷need矩陣是否為0,若為0則結束運作
        return 0;
    else
    {
        //預設選第一個程序作為目前程序
        for(i=0;i<n;i++)
        {
            if(need_re[i]==0)
                continue;
            else{
                cout<<"輸入該程序的資源請求量 Request"<<endl;
                for(j=0;j<m;j++)
                {
                    cout<<"輸入第"<<i+1<<"個資源數,滿足request<="<<Need[i][j]<<endl;
                    cin>>Req[i][j]; 
                }
            }
        }
        Security(avail,Allocation,Need,n,m);
    }
}
           

繼續閱讀