算法筆記---安全狀態(銀行家算法)

題目描述

操作系統中,進程調度是一個非常重要的問題。每個進程都需要一定的資源才能順利執行,進程執行過程中使用的資源在進程結束時都會釋放。不同的資源分配策略會對系統的運行效率產生很大的影響,甚至可能導致死鎖。

現某系統中現有n個進程和m種資源。每個進程開始時得到部分資源,但不足以使得進程順利執行,還需要得到其它資源才能執行。已知該系統中各類可用資源的總量,給定已知的進程及其資源分配和需求情況,你能幫忙檢查這些進程能夠順利執行嗎?

輸入數據:

輸入數據有若干組,每組輸入數據的第一行包含兩個正整數n,m(0<n≤50000,0<m≤l00),表示當前系統中進程的總數和資源的種類。隨後的m行中,每行有n個整數,爲各個進程得到的資源數。之後的m行中,每行也有n個整數,表示進程還需要的資源數。之後的一行中包含m個整數,爲系統中當前可用資源的數量。保證所有的整數值小於或等於10°。

輸出數據:

對每組輸入數據,在單獨的行中輸出結果。若所有進程均能順利完成,輸出Yes,否則輸出No。

樣例輸入:

4 3
1 6 2 0
0 1 1 0
0 2 1 2
2 0 1 4
2 0 0 2
2 1 3 0
0 1 1
4 3
2 5 2 0
0 1 1 0
1 1 1 2
1 1 1 4
2 0 0 2
1 2 3 0
0 1 1

樣例輸出:

Yes
No

解題思路:
使用銀行家算法來實現。
如果不太清楚銀行家算法的具體過程,可以參考下面的鏈接。
操作系統—銀行家算法

下面爲實現代碼:

/*
 * @Description: 銀行家算法
 * @Author: sikaozhifu
 * @Date: 2020-06-12 14:33:49
 * @LastEditTime: 2020-06-12 15:41:03
 * @LastEditors: Please set LastEditors
 */ 
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;

int n,m;//n 表示進程總數,m 表示資源種類數

//Max 表示最大需求數
//Allocation 表示已經分配的資源數
//Need 表示還需要分配的資源數
//表示系統可用的資源數
int **Max,**Allocation,**Need,*Available;

//Work 動態存儲當前Available的值
//Finish 表示當前進程是否爲安全序列之一
int *Work,*Finish;
vector<int> result;

//判斷是否爲安全序列
bool check(){
    Work = new int[m];
    for(int i = 0;i < m;i++){
        Work[i] = Available[i];
    }
    Finish = new int[n];
    fill(Finish,Finish + n, 0);
    for(int k = 0;k < n;k++){//n 個進程需要遍歷n次
        for(int i = 0;i < n;i++){
            if (Finish[i] == 0)
            {
                //判斷需求數是否滿足當前可用資源數
                int count = 0;
                for(int j = 0;j < m;j++){
                    if(Need[i][j] <= Work[j]){
                        count++;
                    }
                }
                if(count == m){
                    //表示滿足當前需求數
                    for(int j = 0;j < m;j++){
                        //更新當前的可用資源數
                        Work[j] += Allocation[i][j];
                    }
                    Finish[i] = 1;
                    result.push_back(i);
                    break;
                }
            }
        }
    }

    for(int i = 0;i < m;i++){
        if(Finish[i] == 0){
            return false;
        }
    }
    return true;
}


int main(){
    cin >> n >> m;
    Max = (int **)new int* [n];
    Allocation = (int **)new int* [n];
    Need = (int **)new int* [n];

    for(int i = 0;i < n;i++){
        Max[i] = new int[m];
        Allocation[i] = new int[m];
        Need[i] = new int[m];
    }
    Available = new int[m];

    for(int i = 0;i < m;i++){
        for(int j = 0;j < n;j++){
            cin >> Allocation[j][i];
        }
    }
    for(int i = 0;i < m;i++){
        for(int j = 0;j < n;j++){
            cin >> Need[j][i];
        }
    }
    for(int i = 0;i < m; i++){
        cin >> Available[i];
    }
    if(check()){
        cout << "Yes" << endl;
    }else{
        cout << "No" << endl;
    }
    system("pause");
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章