<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # DBMS 中的死鎖 > 原文: [https://beginnersbook.com/2015/04/deadlock-in-dbms/](https://beginnersbook.com/2015/04/deadlock-in-dbms/) **死鎖**是一個條件,其中兩個或多個任務正在等待彼此以便完成,但任務都不愿意放棄其他任務所需的資源。在這種情況下,任務都沒有完成,并且永遠處于等待狀態。 ![Deadlock diagram](https://img.kancloud.cn/71/ed/71edf6cb062ab497ee9947d9488459bf_400x300.jpg) ## 科夫曼條件 科夫曼說明發生死鎖的四個條件。如果滿足以下所有條件,則可能發生死鎖。 * **互斥條件**:必須至少有一個資源一次不能被多個進程使用。 * **保持和等待條件**:持有資源的進程可以請求系統中其他進程持有的其他資源。 * **無搶占條件**:無法強制從進程中獲取資源。只有進程才能釋放它所持有的資源。 * **循環等待條件**:一個進程正在等待第二個進程持有的資源而第二個進程正在等待第三個進程的情況......等等,最后一個進程正在等待第一個進程。從而制作一個循環鏈等待。 ## 死鎖處理 ### 忽略死鎖(鴕鳥算法) 那會讓你笑嗎?您可能想知道如何在死鎖處理下忽略死鎖。但是為了讓你知道你在 PC 上使用的窗口,使用這種死鎖處理方法,這是有時它會掛起的原因,你必須重新啟動才能使它工作。不僅 Windows 而且 UNIX 也使用這種方法。 **問題是為什么?為什么不用處理死鎖而忽略它以及為什么這被稱為鴕鳥算法呢?** 好!讓我先回答第二個問題,這就是所謂的鴕鳥算法,因為在這種方法中我們忽略了死鎖并假裝它永遠不會發生,就像鴕鳥的行為“把頭埋在沙子中假裝沒有問題”。 **讓我們討論為什么我們忽略它**:當認為死鎖非常罕見并且死鎖處理的成本更高時,在這種情況下忽略是比處理它更好的解決方案。例如:讓我們以操作系統為例 - 如果時間需要處理死鎖高于需要重新啟動窗口的時間,那么考慮到死鎖在 Windows 中非常罕見,重啟將是首選。 ### 死鎖檢測 資源調度程序是一種保持對進程分配和請求的資源的跟蹤。因此,如果存在死鎖,則資源調度程序已知它。這是檢測到死鎖的方式。 檢測到死鎖后,將通過以下方法進行更正: * **終止死鎖中涉及的進程**:一個接一個地終止死鎖或終止進程中涉及的所有進程,直到死鎖被解決,這可能是解決方案,但這兩種方法都不好。終止所有進程的成本很高,進程完成的部分工作會丟失。逐個終止需要花費大量時間,因為每次進程終止時,都需要檢查死鎖是否已解決。因此,最佳方法是在死鎖條件期間終止它們時考慮進程年齡和優先級。 * **資源搶占**:另一種方法可以是搶占資源并將其分配給其他進程,直到解決了死鎖。 ### 死鎖預防 我們已經了解到,如果所有四個科夫曼條件都成立,則會發生死鎖,因此阻止其中的一個或多個可以防止死鎖。 * **刪除互斥**:所有資源必須是可共享的,這意味著一次可以有多個進程獲取資源。這種方法幾乎是不可能的。 * **刪除保持和等待條件**:如果進程在開始之前獲取了所需的所有資源,則可以將其刪除。另一種刪除此方法的方法是在進程持有時不執行請求資源的規則。 * **搶占資源**:從進程中搶占資源可能導致回滾,因此需要避免這種情況以保持系統的一致性和穩定性。 * **避免循環等待條件**:如果資源在層次結構中維護,并且進程可以按優先級遞增的順序保存資源,則可以避免這種情況。這避免了循環等待。另一種方法是強制每個進程規則使用一個資源 - 進程可以在釋放當前所擁有的資源后請求資源。這避免了循環等待。 ## 死鎖避免 如果以避免發生死鎖的方式分配資源,則可以避免死鎖。有兩種算法可以避免死鎖。 * 等待/死亡 * 死亡/等待 以下是每種算法的資源分配的表表示。這兩種算法都考慮了進程時代,同時確定了避免死鎖的最佳資源分配方式。 | | 等待/死亡 | 死亡/等待 | | --- | --- | | 舊進程需要新進程持有的資源 | **舊進程**等待 | **新進程**死亡 | | 新進程需要舊進程持有的資源 | **舊進程**死亡 | **新進程**等待 | 一個著名的死鎖避免算法是 **銀行家算法**。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看