銀行家算法

死鎖常見的題目

定義

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

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

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

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

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

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

常見死鎖相關算法

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

銀行家算法

算法思想

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

相關數(shù)據(jù)結(jié)構
  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個進程中的每一個進程對m類資源的最大需求。如果Max[i,j]=K;則表示進程i需要Rj類資源的最大數(shù)目為K。

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

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

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

例子

銀行家算法實例

當前系統(tǒng)狀態(tài)
從圖中數(shù)據(jù)我們可以利用銀行家算法的四個數(shù)據(jù)結(jié)構,來描述當前的系統(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向量每一個進程的Need向量相比,發(fā)現(xiàn)Available>=P5.Need,所以可以將目前的資源分配給P5向量(P4也可以,不唯一)。當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 進程數(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滿足某一進程并讓其實現(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存在的標記,當flag1=0時,安全  
    else return(0);  
}  
  
  
/*-----------------------------------------------*/    
/*申請進程后的安全性檢驗函數(shù)*/    
/*-----------------------------------------------*/  
//req-request,n-第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進行比較  
    {  
        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<<"個進程申請資源!\n";  
        else   
        {  
        cout<<"不允許"<<n+1<<"個進程申請資源!\n";  
  
        cout<<"恢復以前狀態(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個進程申請資源——n的值\n";  
    cin>>n;  
  
    rtest(allocation,need,available,request,n);  
} 
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容