銀行家算法

死鎖常見的題目

定義

所謂死鎖,是指多個進(jìn)程循環(huán)等待它方占有的資源而無限期地僵持下去的局面。死鎖是指兩個或兩個以上的進(jìn)程在執(zhí)行過程中,由于競爭資源或者由于彼此通信而造成的一種阻塞的現(xiàn)象,若無外力作用,它們都將無法推進(jìn)下去。此時稱系統(tǒng)處于死鎖狀態(tài)或系統(tǒng)產(chǎn)生了死鎖,這些永遠(yuǎn)在互相等待的進(jìn)程稱為死鎖進(jìn)程。

產(chǎn)生死鎖的必要條件

  • 互斥條件:指進(jìn)程對所分配到的資源進(jìn)行排它性使用,即在一段時間內(nèi)某資源只由一個進(jìn)程占用。如果此時還有其它進(jìn)程請求資源,則請求者只能等待,直至占有資源的進(jìn)程用畢釋放。

  • 請求和保持條件:指進(jìn)程已經(jīng)保持至少一個資源,但又提出了新的資源請求,而該資源已被其它進(jìn)程占有,此時請求進(jìn)程阻塞,但又對自己已獲得的其它資源保持不放。

  • 不剝奪條件:指進(jìn)程已獲得的資源,在未使用完之前,不能被剝奪,只能在使用完時由自己釋放。

  • 環(huán)路等待條件:指在發(fā)生死鎖時,必然存在一個進(jìn)程——資源的環(huán)形鏈,即進(jìn)程集合{P0,P1,P2,···,Pn}中的P0正在等待一個P1占用的資源;P1正在等待P2占用的資源,……,Pn正在等待已被P0占用的資源。

常見死鎖相關(guān)算法

銀行家算法:避免死鎖
資源有序分配法:預(yù)防死鎖
資源分配圖化簡法:檢測死鎖
撤銷進(jìn)程法:解決死鎖

銀行家算法

算法思想

銀行家算法:銀行家算法是從當(dāng)前狀態(tài)出發(fā),按照系統(tǒng)各類資源剩余量逐個檢查各進(jìn)程需要申請的資源量,找到一個各類資源申請量均小于等于系統(tǒng)剩余資源量的進(jìn)程P1。然后分配給該P(yáng)1進(jìn)程所請求的資源,假定P1完成工作后歸還其占有的所有資源,更新系統(tǒng)剩余資源狀態(tài)并且移除進(jìn)程列表中的P1,進(jìn)而檢查下一個能完成工作的客戶,......。如果所有客戶都能完成工作,則找到一個安全序列,銀行家才是安全的。若找不到這樣的安全序列,則當(dāng)前狀態(tài)不安全。

相關(guān)數(shù)據(jù)結(jié)構(gòu)
  1. 可利用資源向量Available。這是一個含有m個元素的數(shù)組,其中的而每一個元素代表一類可利用資源數(shù)目,其初始值是系統(tǒng)中所配置的該類全部可用資源的數(shù)目,其數(shù)值隨該類資源的分配和回收而動態(tài)的改變。如果Available[j]=K,則表示系統(tǒng)中現(xiàn)有Rj類資源K個。

  2. 最大需求矩陣Max。這是一個n*m的矩陣,它定義了系統(tǒng)中n個進(jìn)程中的每一個進(jìn)程對m類資源的最大需求。如果Max[i,j]=K;則表示進(jìn)程i需要Rj類資源的最大數(shù)目為K。

  3. 分配矩陣Allocation。這也是一個n*m的矩陣,它定義了系統(tǒng)中每一類資源當(dāng)前已分配給每一進(jìn)程的資源數(shù)。如果Allocation[i,j]=K,則表示進(jìn)程i當(dāng)前已分得Rj類資源的數(shù)目為K。

  4. 需求矩陣Need。這也是一個n*m的矩陣,用以表示每一個進(jìn)程尚需的各類資源數(shù)。如果Need[i,j]=K,則表示進(jìn)程i還需要Rj類資源K個,方能完成任務(wù)。

    上述三個矩陣間存在下述關(guān)系:Need[i,j]=Max[i,j]-Allocation[i,j]

例子

銀行家算法實例

當(dāng)前系統(tǒng)狀態(tài)
從圖中數(shù)據(jù)我們可以利用銀行家算法的四個數(shù)據(jù)結(jié)構(gòu),來描述當(dāng)前的系統(tǒng)狀態(tài):

因為系統(tǒng)總資源R=(17,5,20),所以可以計算出可利用資源向量Available=R-Allocation(P1,P2,P3,P4,P5)=(2,3,3)
分配資源
根據(jù)目前狀態(tài),用Available向量每一個進(jìn)程的Need向量相比,發(fā)現(xiàn)Available>=P5.Need,所以可以將目前的資源分配給P5向量(P4也可以,不唯一)。當(dāng)P5獲得所需的所有向量后執(zhí)行完畢,之后釋放其占有的所有資源。此時更新系統(tǒng)資源:

Available=R-Allocation(P1,P2,P3)=(7,4,11)
按照上述同樣的方法,P4 也可以安全運行,以及P3,P2,P1也能按順序運行。因此,在T0時刻,存在安全序列:P5,P4,P3,P2,P1(并不唯一)

死鎖的算法實現(xiàn)
// 避免死鎖銀行家算法的C++ 編程實現(xiàn)  
  
#include<iostream>  
using namespace std;  
  
// p 進(jìn)程數(shù),r 資源種類  
#define p 4  
#define r 3  
  
  
/*-----------------------------------------------*/    
/*輸入函數(shù)*/    
/*-----------------------------------------------*/  
//a-max,b-allocation,c-need,d-available  
void input(int a[p][r],int b[p][r],int c[p][r],int d[r])  
{  
    int i,j;  
    cout<<"* input max data:\n";  
    for(i=0;i<p;i++)  
        for(j=0;j<r;j++)cin>>a[i][j];  
    cout<<"* input allocation data:\n";  
    for(i=0;i<p;i++)  
        for(j=0;j<r;j++)cin>>b[i][j];  
    cout<<"* input need data:\n";  
    for(i=0;i<p;i++)  
        for(j=0;j<r;j++)cin>>c[i][j];  
    cout<<"* input available data:\n";  
    for(j=0;j<r;j++)cin>>d[j];  
}  
  
/*-----------------------------------------------*/    
/*比較函數(shù)*/    
/*-----------------------------------------------*/  
//比較結(jié)果為m中的元素全大于n中的元素返回1,否則返回0  
int com(int m[r],int n[r])  
{  
    int i,flag=0;  
    for(i=0;i<r;i++)  
        if(m[i]<n[i])  
        {  
            flag=1;  
            break;  
        }  
    if(flag==1) return(0);  
    else return(1);  
}  
  
  
/*-----------------------------------------------*/    
/*安全性檢驗函數(shù)*/    
/*-----------------------------------------------*/  
//b、c、d意義同上  
int stest(int b[p][r],int c[p][r],int d[r])  
{  
    int i,j,k,l,flag=0,flag1=0;  
    int t[r],finish[p],dd[r];  
    for(i=0;i<p;i++)finish[i]=0;//finish為1即表示available滿足某一進(jìn)程并讓其實現(xiàn)  
  
    for(i=0;i<r;i++)dd[i]=d[i];  
    cout<<"分配序列:\n";  
    for(k=0;k<p;k++)            //全搜索,直至實現(xiàn)或不可能實現(xiàn)  
    {  
        for(i=0;i<p;i++)  
        {  
            if(finish[i]==1)continue;  
            else  
            {  
                for(j=0;j<r;j++)t[j]=c[i][j];  
                if(com(dd,t))  
                {  
                    finish[i]=1;  
                    cout<<i+1<<'\t';  
                    flag=1;  
                    for(l=0;l<r;l++)dd[l]=dd[l]+b[i][l];  
                    break;  
                }  
            }  
            if(flag==1)break;  
        }     
    }  
    cout<<'\n';  
    for(l=0;l<p;l++)  
    {  
        //cout<<finish[l]<<endl;  
        if(finish[l]==0)flag1=1;  
    }  
        //cout<<flag1<<endl;  
    if(flag1==0)return(1);    //flag1為記錄finish是否有0存在的標(biāo)記,當(dāng)flag1=0時,安全  
    else return(0);  
}  
  
  
/*-----------------------------------------------*/    
/*申請進(jìn)程后的安全性檢驗函數(shù)*/    
/*-----------------------------------------------*/  
//req-request,n-第n個進(jìn)程申請資源  
void rtest(int b[p][r],int c[p][r],int d[r],int req[r],int n)  
{  
    int i,j;  
    int t[r];  
    n=n-1;  
    for(i=0;i<r;i++)t[i]=c[n][i];  
    if(com(d,req)&&com(t,req))//對available,request進(jìn)行比較  
    {  
        for(j=0;j<r;j++)  
        {  
            b[n][j]=b[n][j]+req[j];  
            c[n][j]=c[n][j]-req[j];  
            d[j]=d[j]-req[j];  
        }  
        if(stest(b,c,d))cout<<"允許"<<n+1<<"個進(jìn)程申請資源!\n";  
        else   
        {  
        cout<<"不允許"<<n+1<<"個進(jìn)程申請資源!\n";  
  
        cout<<"恢復(fù)以前狀態(tài)!\n";  
        for(j=0;j<r;j++)  
        {  
            b[n][j]=b[n][j]-req[j];  
            c[n][j]=c[n][j]+req[j];  
            d[j]=d[j]+req[j];  
        }  
        }  
    }  
  
    else cout<<"申請資源量出錯!\n";  
}  
  
  
/*-----------------------------------------------*/    
/*主函數(shù)*/    
/*-----------------------------------------------*/  
void main()  
{  
    int j,n;                   //n-第n個資源申請  
    int max[p][r],allocation[p][r],need[p][r];  
    int available[r],request[r];  
    input(max,allocation,need,available);  
  
    if(stest(allocation,need,available)==1)cout<<"初始狀態(tài)安全!\n";  
    else cout<<"初始狀態(tài)不安全!\n";  
  
    cout<<" input request data:\n";  
    for(j=0;j<r;j++)cin>>request[j];  
  
    cout<<"第n個進(jìn)程申請資源——n的值\n";  
    cin>>n;  
  
    rtest(allocation,need,available,request,n);  
} 
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,460評論 6 538
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,067評論 3 423
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 177,467評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,468評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 72,184評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,582評論 1 325
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,616評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,794評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,343評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,096評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,291評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,863評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,513評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,941評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,190評論 1 291
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,026評論 3 396
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 48,253評論 2 375

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

  • 死鎖 在了解銀行家算法前,有必要了解一下死鎖。因為銀行家算法是用于避免死鎖的。 什么是死鎖? 死鎖是指兩個或兩個以...
    tandeneck閱讀 1,246評論 0 1
  • 系統(tǒng)安全狀態(tài)的定義 1.安全狀態(tài) 在避免死鎖的方法中,允許進(jìn)程動態(tài)地申請資源,但系統(tǒng)在進(jìn)行資源分配之前,應(yīng)先計算此...
    haifengmay閱讀 3,756評論 1 8
  • 算法原理 我們可以把操作系統(tǒng)看作是銀行家,操作系統(tǒng)管理的資源相當(dāng)于銀行家管理的資金,進(jìn)程向操作系統(tǒng)請求分配資源相當(dāng)...
    Arya鑫閱讀 870評論 0 1
  • 以下內(nèi)容整理自互聯(lián)網(wǎng),僅用于個人學(xué)習(xí)http://huachao1001.github.io/article.ht...
  • 假定系統(tǒng)中有5個進(jìn)程:P0,P1,...,P4,有3個資源A、B、C。某一時刻資源分配情況是: Max:表示每個進(jìn)...
    Azur_wxj閱讀 3,553評論 0 6