# 死鎖,第 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 位)哲學家吃飯。我們將坐在一張桌子上,用五根筷子(每個哲學家之間一個)。哲學家在想要吃飯或思考之間交替。吃飯的哲學家必須在他們的位置兩側拾起兩根筷子(原始問題要求每個哲學家都有兩把分叉)。然而,這些筷子與他的鄰居分享。

是否有可能設計出一種有效的解決方案,使所有哲學家都能吃到它?或者,一些哲學家會挨餓,從未獲得第二根筷子嗎?或者他們都會陷入僵局?例如,想象每個客人拿起他們左邊的筷子,然后等待他們右邊的筷子自由。糟糕 - 我們的哲學家陷入僵局!
- UIUC CS241 系統編程中文講義
- 0. 簡介
- #Informal 詞匯表
- #Piazza:何時以及如何尋求幫助
- 編程技巧,第 1 部分
- 系統編程短篇小說和歌曲
- 1.學習 C
- C 編程,第 1 部分:簡介
- C 編程,第 2 部分:文本輸入和輸出
- C 編程,第 3 部分:常見問題
- C 編程,第 4 部分:字符串和結構
- C 編程,第 5 部分:調試
- C 編程,復習題
- 2.進程
- 進程,第 1 部分:簡介
- 分叉,第 1 部分:簡介
- 分叉,第 2 部分:Fork,Exec,等等
- 進程控制,第 1 部分:使用信號等待宏
- 進程復習題
- 3.內存和分配器
- 內存,第 1 部分:堆內存簡介
- 內存,第 2 部分:實現內存分配器
- 內存,第 3 部分:粉碎堆棧示例
- 內存復習題
- 4.介紹 Pthreads
- Pthreads,第 1 部分:簡介
- Pthreads,第 2 部分:實踐中的用法
- Pthreads,第 3 部分:并行問題(獎金)
- Pthread 復習題
- 5.同步
- 同步,第 1 部分:互斥鎖
- 同步,第 2 部分:計算信號量
- 同步,第 3 部分:使用互斥鎖和信號量
- 同步,第 4 部分:臨界區問題
- 同步,第 5 部分:條件變量
- 同步,第 6 部分:實現障礙
- 同步,第 7 部分:讀者編寫器問題
- 同步,第 8 部分:環形緩沖區示例
- 同步復習題
- 6.死鎖
- 死鎖,第 1 部分:資源分配圖
- 死鎖,第 2 部分:死鎖條件
- 死鎖,第 3 部分:餐飲哲學家
- 死鎖復習題
- 7.進程間通信&amp;調度
- 虛擬內存,第 1 部分:虛擬內存簡介
- 管道,第 1 部分:管道介紹
- 管道,第 2 部分:管道編程秘密
- 文件,第 1 部分:使用文件
- 調度,第 1 部分:調度過程
- 調度,第 2 部分:調度過程:算法
- IPC 復習題
- 8.網絡
- POSIX,第 1 部分:錯誤處理
- 網絡,第 1 部分:簡介
- 網絡,第 2 部分:使用 getaddrinfo
- 網絡,第 3 部分:構建一個簡單的 TCP 客戶端
- 網絡,第 4 部分:構建一個簡單的 TCP 服務器
- 網絡,第 5 部分:關閉端口,重用端口和其他技巧
- 網絡,第 6 部分:創建 UDP 服務器
- 網絡,第 7 部分:非阻塞 I O,select()和 epoll
- RPC,第 1 部分:遠程過程調用簡介
- 網絡復習題
- 9.文件系統
- 文件系統,第 1 部分:簡介
- 文件系統,第 2 部分:文件是 inode(其他一切只是數據...)
- 文件系統,第 3 部分:權限
- 文件系統,第 4 部分:使用目錄
- 文件系統,第 5 部分:虛擬文件系統
- 文件系統,第 6 部分:內存映射文件和共享內存
- 文件系統,第 7 部分:可擴展且可靠的文件系統
- 文件系統,第 8 部分:從 Android 設備中刪除預裝的惡意軟件
- 文件系統,第 9 部分:磁盤塊示例
- 文件系統復習題
- 10.信號
- 過程控制,第 1 部分:使用信號等待宏
- 信號,第 2 部分:待處理的信號和信號掩碼
- 信號,第 3 部分:提高信號
- 信號,第 4 部分:信號
- 信號復習題
- 考試練習題
- 考試主題
- C 編程:復習題
- 多線程編程:復習題
- 同步概念:復習題
- 記憶:復習題
- 管道:復習題
- 文件系統:復習題
- 網絡:復習題
- 信號:復習題
- 系統編程笑話