死鎖

  • 死鎖的概念:死鎖是指兩個或兩個以上的進程在執行過程中,由於競爭資源或者由於彼此通信而造成的一種阻塞現象,若無外力作用,它們都將無法推進下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的進程稱爲死鎖進程。

  • 一個線程也會產生死鎖問題(沒有釋放)。

  • 死鎖產生的4個必要條件
    (1)互斥條件:一個資源每次只能被一個進程使用,若其他進程想要訪問該資源,只能等佔有該資源的進程使用完後釋放該資源,才能使用該資源
    (2)請求和保持:一個進程因請求其他資源而阻塞時,對已獲得的資源保持不放
    (3)不可剝奪條件:進程已獲得的資源,在未使用完之前,不能強行剝奪,只能使用完自己釋放
    (4)循環等待條件:若干進程之間形成一種頭尾相接的循環等待資源關係
    只要發生死鎖,一定滿足以上4個條件,所以破壞其中任意一個就不會產生死鎖。

  • 解決死鎖的方法:保證每個線程獲得鎖的順序一致

  • 處理死鎖有以下4個基本方法
    (1)預防死鎖:通過設置某些限制條件,去破壞產生死鎖的必要條件。但由於施加的限制條件都太嚴格,所以可能導致系統資源利用率低和系統吞吐量低
    (2)避免死鎖:在資源分配過程中,使用某種方法避免系統進入不安全的狀態
    (3)檢測死鎖:允許死鎖的發生,但需要經過系統的檢測後能及時檢測出死鎖的發生,並可以判斷出與死鎖相關的進程和資源,然後採取適當的措施,清除死鎖
    (4)解除死鎖:與檢測死鎖配合使用。常用方法:掛起一些進程,回收一些資源,再將這些資源分配給已經處於阻塞狀態的進程。

  • 如何避免死鎖,以及常見的算法與原理
    (1)銀行家算法:是最具有代表性的避免死鎖的算法。銀行家算法的基本思想是分配資源之前,判斷系統是否是安全的;若安全,才分配。在該方法中把系統的狀態分爲安全狀態和不安全狀態,只要能使系統時鐘處於安全狀態,便可以避免發生死鎖。
    A.如果request <= need,轉向步驟2;否則認爲出錯,因爲請求資源大於需要資源
    B.如果request <= available,轉向步驟3;否則尚無足夠資源,進程X阻塞
    C.系統長時把資源分配給進程X,並修改available、allocation和need的數值
    (2)安全性檢查算法:
    A.設置兩個向量
    work:表示系統可提供給進程繼續運行的所需的各類資源的數目,執行安全算法開始時,work=available。
    finish:表示系統是否有足夠的資源分配給進程,使之運行完成。開始時先讓finish[i] = false;
    當有足夠資源分配給進程時再令finish[i] = true。
    B.從進程集合找到一個滿足下列條件的進程
    finish[i] = false;
    need <= work;
    若找到執行步驟3,否則執行步驟4
    C.當進程X獲得資源後,可順利執行,直至完成,並釋放資源:
    work = work+allocation(X);
    Finish[i] = true;
    循環執行步驟2;
    D.如果所有進程的finish = true,則表示系統處於安全狀態,否則,系統處於不安全狀態。

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