1. 程式人生 > >java面試題之死鎖產生的條件,以及如何避免死鎖,銀行家算法,產生死鎖後如何解決(阿裏面試題)

java面試題之死鎖產生的條件,以及如何避免死鎖,銀行家算法,產生死鎖後如何解決(阿裏面試題)

需求量 info 強行 進程 spa tro 否則 破壞 阻塞

死鎖產生的四個必要條件:
互斥:一個資源每次只能被一個進程使用(資源獨立)

請求與保持:一個進程因請求資源而阻塞時,對已獲得的資源保持不放(不釋放鎖)

不剝奪:進程已獲得的資源,在未使用之前,不能強行剝奪(搶奪資源)

循環等待:若幹進程之間形成一種頭尾相接的循環等待的資源關閉(死循環)
死鎖預防
  1. 破壞“互斥”條件:

    就是在系統裏取消互斥、若資源一般不被一個進程獨占使用,那麽死鎖是肯定不會發生的,但一般“互斥”條件是無法破壞的。因此,在死鎖預防裏主要是破壞其他三個必要條件,而不去涉及破壞“互斥”條件  
  1. 破壞“請求和保持”條件:

    方法1:所有的進程在開始運行之前,必須一次性的申請其在整個運行過程各種所需要的全部資源
    ?
    優點:簡單易實施且安全
    ?
    缺點:因為某項資源不滿足,進程無法啟動,而其他已經滿足了的資源也不會得到利用,嚴重降低了資源的利用率,造成資源浪費
    ?
    方法2:該方法是對第一種方法的改進,允許進程只獲得運行初期需要的資源,便開始運行,在運行過程中逐步釋放掉分配到,已經使用完畢的資源,然後再去請求新的資源。這樣的話資源的利用率會得到提高,也會減少進程的饑餓問題
    ?
  2. 破壞“不剝奪”條件:

    當一個已經持有了一些資源的進程在提出新的資源請求沒有得到滿足時,它必須釋放已經保持的所有資源,待以後需要使用的時候再重新申請。這就意味著進程已占有的資源會被短暫的釋放或者說被搶占了
  3. 破壞“循環等待”條件:

    可以通過定義資源類型的線性順序來預防,可以將每個資源編號,當一個進程占有編號為i的資源時,那麽它下一次申請資源只能申請編號大於i的資源。如下圖
    技術分享圖片
    這樣雖然避免了循環等待,但是這種方法是比較低效的,資源的執行速度會變慢,並且可能在沒有必要的情況下拒絕資源的訪問,比如說,線程c想要申請資源1,如果資源1並沒有被其他進程占有,此時將它分配給線程c是沒有問題的,但是為了避免產生循環等待,該申請會被拒絕,這樣就降低了資源的利用率。

死鎖避免

避免是指進程在每次申請資源時判斷這些操作是否安全,典型算法是“銀行家算法”。但這種算法會增加系統的開銷
死鎖的檢測
判斷系統是否處於死鎖狀態,如果是,則執行死鎖解除策略
死鎖解除
與死鎖檢測結合使用,它使用的方式就是剝奪。即將資源強行分配給別的進程
銀行家算法
1、操作系統按照銀行家指定的規則為進程分配資源,當進程首次申請資源時,需要測試該進程對資源的最大需求量,如果系統現存的資源可以滿足它的最大需求量則按當前的申請資源分配資源,否則就推遲分配;
2、當進程在執行中繼續申請資源時,先測試該進程本次申請的資源數,是否超過了該資源剩余的總量,若超過則拒絕分配資源,若能滿足則按當前的申請量分配資源,否則也要推遲分配。

java面試題之死鎖產生的條件,以及如何避免死鎖,銀行家算法,產生死鎖後如何解決(阿裏面試題)