銀行家算法

銀行家算法是一種預(yù)防死鎖的算法慈省。具體算法步驟可以參考百度百科:銀行家算法

例子:某系統(tǒng)有A臀防、B、C、D , 4類資源共5個進程(P0袱衷、P1捎废、P2、P3致燥、P4)共享登疗,各進程對資源的需求和分配情況如下表所示。


現(xiàn)在系統(tǒng)中A篡悟、B谜叹、C匾寝、D 4類資源分別還剩1搬葬、5、2艳悔、0個急凰,請按銀行家算法回答下列問題:
(1)現(xiàn)在系統(tǒng)是否處于安全狀態(tài)?
(2)如果現(xiàn)在進程P1提出需求(0猜年、4抡锈、2、0)個資源的請求乔外,系統(tǒng)能否滿足它的請求床三?

代碼:

#include <iostream>
#define maxP 10
#define maxS 10
using namespace std;
int Available[maxS];
int Max[maxP][maxS];
int Allocation[maxP][maxS];
int Need[maxP][maxS];
int Request[maxS];
int Finish[maxP];
int path[maxP] = { 0 };
int PNum, RNum;
void outPath() {
    cout << "系統(tǒng)安全序列是:\n";
    cout << "P" << path[0] - 1;
    for (int i = 1; path[i] != 0; i++) {
        cout << "->P" << path[i] - 1;
    }
    for (int i = 0; i < PNum; i++) path[i] = 0;
    cout << endl;
}
int BankSafe() {
    int i, j, l = 0;
    int Work[maxS];
    for (i = 0; i < RNum; i++) Work[i] = Available[i];
    for (i = 0; i < PNum; i++) Finish[i] = 0;
    for (i = 0; i < PNum; i++) {
        if (Finish[i] == 1)
            continue;
        else {
            for (j = 0; j < RNum; j++) {
                if (Need[i][j] > Work[j])
                    break;
            }
            if (j == RNum) {
                Finish[i] = 1;
                for (int k = 0; k < RNum; k++)
                    Work[k] += Allocation[i][k];
                path[l++] = i + 1;
                i = -1;
            }
            else continue;
        }
        if (l == PNum) {
            return 1;
        }
    }
    return 0;
}
void input(int PNum, int RNum) {
    cout << "輸入每個進程最多所需的各類資源數(shù):\n";
    for (int i = 0; i < PNum; i++) {
        cout << "P" << i << " : ";
        for (int j = 0; j < RNum; j++)
            cin >> Max[i][j];
    }
    cout << "輸入每個進程已經(jīng)分配的各類資源數(shù):\n";
    for (int i = 0; i < PNum; i++) {
        cout << "P" << i << " : ";
        for (int j = 0; j < RNum; j++) {
            cin >> Allocation[i][j];
            Need[i][j] = Max[i][j] - Allocation[i][j];
            if (Need[i][j] < 0) {
                cout << "你輸入的進程P" << i << "所擁有的第" << j + 1 << "個資源錯誤,請重新輸入:\n";
                j--;
                continue;
            }
        }
    }
    cout << "請輸入各個資源現(xiàn)有的數(shù)目:\n";
    for (int i = 0; i < RNum; i++)
        cin >> Available[i];
}
int requestP() {
    int Pi;
    cout << "輸入要申請資源的進程號(0-4):";
    cin >> Pi;
    Pi;
    cout << "輸入進程所請求的各資源的數(shù)量:";
    for (int i = 0; i < RNum; i++)
        cin >> Request[i];
    for (int i = 0; i < RNum; i++) {
        if (Request[i] > Need[Pi][i]) {
            cout << "所請求資源數(shù)超過進程的需求量杨幼!\n";
            return 1;
        }
        if (Request[i] > Available[i]) {
            cout << "所請求資源數(shù)超過系統(tǒng)所有的資源數(shù)撇簿!\n";
            return 1;
        }
    }
    for (int i = 0; i < RNum; i++) {
        Available[i] -= Request[i];
        Allocation[Pi][i] += Request[i];
        Need[Pi][i] -= Request[i];
    }
    if (BankSafe()) {
        cout << "系統(tǒng)安全!\n";
        outPath();
        cout << "同意分配請求!\n";
    }
    else {
        for (int i = 0; i < RNum; i++) {
            Available[i] += Request[i];
            Allocation[Pi][i] -= Request[i];
            Need[Pi][i] += Request[i];
        }
        cout << "請求后,系統(tǒng)不安全,你的請求被拒!\n";
    }
    return 0;
}
void outDATA() {
    int i, j;
    cout << "\n系統(tǒng)可用的資源數(shù)為 :";
    for (j = 0; j < RNum; j++)
        cout << " " << Available[j];
    cout << endl << "各進程還需要的資源量:" << endl;
    for (i = 0; i < PNum; i++) {
        cout << "進程 P" << i << " :";
        for (j = 0; j < RNum; j++)
            cout << " " << Need[i][j];
        cout << endl;
    }
    cout << endl << "各進程已經(jīng)得到的資源量:" << endl;
    for (i = 0; i < PNum; i++) {
        cout << "進程 P" << i << " :";
        for (j = 0; j < RNum; j++)
            cout << " " << Allocation[i][j];
        cout << endl;
    }
    cout << endl;
}
int main() {
    cout << "輸入進程的數(shù)目:";
    cin >> PNum;
    cout << "輸入資源的種類:";
    cin >> RNum;
    input(PNum, RNum);
    if (BankSafe()) {
        cout << "當(dāng)前系統(tǒng)安全!\n";
        outPath();
    }
    else {
        cout << "當(dāng)前系統(tǒng)不安全!\n";
        return 0;
    }
    while (1) {
        requestP();
        outDATA();
        char chose;
        cout << "是否再次請求分配?是請按Y/y差购,否請按N/n:\n";
        while (1) {
            cin >> chose;
            if (chose == 'Y' || chose == 'y' || chose == 'N' || chose == 'n')
                break;
            else {
                cout << "請按要求重新輸入:\n";
                continue;
            }
        }
        if (chose == 'Y' || chose == 'y')
            continue;
        else break;
    }
    return 0;
}

運行結(jié)果:

輸入進程的數(shù)目:5
輸入資源的種類:4
輸入每個進程最多所需的各類資源數(shù):
P0 : 0 0 1 2
P1 : 1 7 5 0
P2 : 2 3 5 6
P3 : 0 6 5 2
P4 : 0 6 5 6
輸入每個進程已經(jīng)分配的各類資源數(shù):
P0 : 0 0 1 2
P1 : 1 0 0 0
P2 : 1 3 5 4
P3 : 0 6 3 2
P4 : 0 0 1 4
請輸入各個資源現(xiàn)有的數(shù)目:
1 5 2 0
當(dāng)前系統(tǒng)安全!
系統(tǒng)安全序列是:
P0->P2->P1->P3->P4
輸入要申請資源的進程號(0-4):1
輸入進程所請求的各資源的數(shù)量:0 4 2 0
系統(tǒng)安全!
系統(tǒng)安全序列是:
P0->P2->P1->P3->P4
同意分配請求!

系統(tǒng)可用的資源數(shù)為 : 1 1 0 0
各進程還需要的資源量:
進程 P0 : 0 0 0 0
進程 P1 : 0 3 3 0
進程 P2 : 1 0 0 2
進程 P3 : 0 0 2 0
進程 P4 : 0 6 4 2

各進程已經(jīng)得到的資源量:
進程 P0 : 0 0 1 2
進程 P1 : 1 4 2 0
進程 P2 : 1 3 5 4
進程 P3 : 0 6 3 2
進程 P4 : 0 0 1 4

是否再次請求分配四瘫?是請按Y/y,否請按N/n:
N

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末欲逃,一起剝皮案震驚了整個濱河市找蜜,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌稳析,老刑警劉巖洗做,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異彰居,居然都是意外死亡诚纸,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進店門裕菠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來咬清,“玉大人,你說我怎么就攤上這事【缮眨” “怎么了影钉?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長掘剪。 經(jīng)常有香客問我平委,道長,這世上最難降的妖魔是什么夺谁? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任廉赔,我火速辦了婚禮,結(jié)果婚禮上匾鸥,老公的妹妹穿的比我還像新娘蜡塌。我一直安慰自己,他們只是感情好勿负,可當(dāng)我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布馏艾。 她就那樣靜靜地躺著,像睡著了一般奴愉。 火紅的嫁衣襯著肌膚如雪琅摩。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天锭硼,我揣著相機與錄音房资,去河邊找鬼。 笑死檀头,一個胖子當(dāng)著我的面吹牛轰异,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播鳖擒,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼溉浙,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蒋荚?” 一聲冷哼從身側(cè)響起戳稽,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎期升,沒想到半個月后惊奇,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡播赁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年颂郎,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片容为。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡乓序,死狀恐怖寺酪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情替劈,我是刑警寧澤寄雀,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站陨献,受9級特大地震影響盒犹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜眨业,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一急膀、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧龄捡,春花似錦卓嫂、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽呜呐。三九已至就斤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蘑辑,已是汗流浹背洋机。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留洋魂,地道東北人绷旗。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像副砍,于是被迫代替她去往敵國和親衔肢。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 假定系統(tǒng)中有5個進程:P0,P1,...,P4豁翎,有3個資源A角骤、B、C心剥。某一時刻資源分配情況是: Max:表示每個進...
    Azur_wxj閱讀 3,482評論 0 6
  • 最近在做操作系統(tǒng)的課程設(shè)計邦尊,其中實驗四是“銀行家算法的模擬和實現(xiàn)”。好在前面看過一點优烧,有點印象蝉揍。所以想嘗試自己寫一...
    此生望盡天涯路閱讀 6,259評論 4 12
  • 系統(tǒng)安全狀態(tài)的定義 1.安全狀態(tài) 在避免死鎖的方法中,允許進程動態(tài)地申請資源畦娄,但系統(tǒng)在進行資源分配之前又沾,應(yīng)先計算此...
    haifengmay閱讀 3,740評論 1 8
  • 宋代有詩云:“自從陸羽生人間弊仪,人間相學(xué)事春茶”。 陸羽(733—804)杖刷,字鴻漸撼短,一名疾,字季疵挺勿。唐復(fù)州竟陵(今湖...
    晴溪閱讀 1,547評論 0 7
  • 【本書作者】邁克·貝克特爾 【閱讀總結(jié)梳理及思考】 一曲横、對本書內(nèi)容梳理 通過自己的理解,將本書分為“靜”和“動”兩...
    cedric_y閱讀 363評論 0 2