<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國際加速解決方案。 廣告
                # 死鎖,第 2 部分:死鎖條件 > 原文:<https://github.com/angrave/SystemProgramming/wiki/Deadlock%2C-Part-2%3A-Deadlock-Conditions> ## 科夫曼的條件 有四個 _ 必需 _ 和 _ 充分 _ 條件的死鎖。這些被稱為科夫曼條件。 * 相互排斥 * 循環等待 * 等等 * 沒有先發制人 如果你破壞其中任何一個,你就不會陷入僵局! 所有這些條件都是死鎖所必需的,所以讓我們依次討論每個條件。首先是簡單的 - * 相互排斥:無法共享資源 * 循環等待:資源分配圖中存在一個循環。存在一組進程{P1,P2,...},使得 P1 正在等待 P2 所持有的資源,其等待 P3,...,等待 P1。 * 保持和等待:進程獲取一組不完整的資源,并在等待其他資源時保留它們。 * 沒有先發制人:一旦進程獲得了資源,就無法從進程中獲取資源,并且進程不會自愿放棄資源。 ## 打破科夫曼條件 兩名學生需要一支筆和紙: * 學生們分享筆和紙。避免死鎖,因為不需要互斥。 * 學生們都同意在拿紙之前抓住筆。避免死鎖,因為不能進行循環等待。 * 學生們在一次操作中抓住筆和紙(“得到兩個或得不到”)。因為沒有 _ 保持和等待 _ 而避免死鎖 * 學生是朋友,會互相要求放棄持有的資源。避免死鎖是因為允許搶占。 ## 活鎖 活鎖是 _ 而不是 _ 死鎖 - 考慮以下“解決方案” * 如果學生在 10 秒內無法獲取其他資源,他們將放下一個持有的資源。該解決方案避免了死鎖,但是它可能遭受活鎖。 當進程繼續執行但無法取得進展時會發生 Livelock。實際上可能會發生 Livelock,因為程序員已采取措施避免死鎖。在上面的示例中,在繁忙的系統中,學生將不斷釋放第一個資源,因為他們永遠無法獲得第二個資源。系統沒有死鎖(學生進程仍在執行),但它也沒有取得任何進展。 ## 死鎖預防/避免與死鎖檢測 死鎖預防確保不會發生死鎖,這意味著你打破了 coffman 條件。這在單個程序中是最好的,軟件工程師可以選擇打破某個 coffman 條件。考慮[銀行家的算法](https://en.wikipedia.org/wiki/Banker's_algorithm)。它是另一種避免死鎖的算法。整個實現超出了本課程的范圍,只知道操作系統有更多通用算法。 另一方面,死鎖檢測允許系統進入死鎖狀態。進入后,系統會使用它所具有的信息來打破僵局。例如,考慮訪問文件的多個進程。操作系統能夠通過某種級別的文件描述符(通過 API 或直接抽象)跟蹤所有文件/資源??。如果操作系統在操作系統文件描述符表中檢測到定向循環,則可能會中斷一個進程(例如通過調度)并讓系統繼續運行。 ## 餐飲哲學家 Dining Philosophers 問題是一個經典的同步問題。想象一下,我邀請 N(讓我們說 5 位)哲學家吃飯。我們將坐在一張桌子上,用五根筷子(每個哲學家之間一個)。哲學家在想要吃飯或思考之間交替。吃飯的哲學家必須在他們的位置兩側拾起兩根筷子(原始問題要求每個哲學家都有兩把分叉)。然而,這些筷子與他的鄰居分享。 ![5DiningPhilosophers](https://img.kancloud.cn/5c/c4/5cc4025bb9663b7cc1a549ff6d6addaa_1489x1565.jpg) 是否有可能設計出一種有效的解決方案,使所有哲學家都能吃到它?或者,一些哲學家會挨餓,從未獲得第二根筷子嗎?或者他們都會陷入僵局?例如,想象每個客人拿起他們左邊的筷子,然后等待他們右邊的筷子自由。糟糕 - 我們的哲學家陷入僵局!
                  <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>

                              哎呀哎呀视频在线观看