作業系統中的死鎖
當兩個或多個程序需要某些資源才能完成執行,而這些資源卻被其他程序持有時,就會在作業系統中發生死鎖。
在上圖中,程序1擁有資源1,需要獲取資源2。同樣,程序2擁有資源2,需要獲取資源1。程序1和程序2處於死鎖狀態,因為它們都需要對方的資源才能完成執行,但兩者都不願意釋放其資源。
Coffman條件
如果四個Coffman條件都成立,則會發生死鎖。但這些條件並非相互排斥的。
Coffman條件如下:
- 互斥
應該有一個資源,一次只能被一個程序持有。在下圖中,資源1只有一個例項,並且僅被程序1持有。
- 持有並等待
一個程序可以持有多個資源,並且仍然可以向持有這些資源的其他程序請求更多資源。在下圖中,程序2持有資源2和資源3,並正在請求程序1持有的資源1。
- 不可搶佔
不能強行從程序中搶佔資源。程序只能自願釋放資源。在下圖中,程序2無法從程序1搶佔資源1。只有在程序1完成執行後自願釋放資源1時,程序2才能獲得資源1。
- 迴圈等待
一個程序正在等待第二個程序持有的資源,而第二個程序正在等待第三個程序持有的資源,以此類推,直到最後一個程序正在等待第一個程序持有的資源。這形成了一個迴圈鏈。例如:程序1被分配了資源2,並正在請求資源1。同樣,程序2被分配了資源1,並正在請求資源2。這形成了一個迴圈等待迴圈。
死鎖檢測
資源排程程式可以檢測死鎖,因為它會跟蹤分配給不同程序的所有資源。檢測到死鎖後,可以使用以下方法解決:
- 終止所有參與死鎖的程序。這不是一個好方法,因為所有程序已經完成的工作都將被破壞。
- 可以從某些程序中搶佔資源,並將其提供給其他程序,直到解決死鎖為止。
死鎖預防
在死鎖發生之前預防死鎖非常重要。因此,系統在執行每個事務之前都會檢查它,以確保它不會導致死鎖。如果即使有一點點可能性,一個事務將來可能會導致死鎖,那麼它將永遠不會被執行。
死鎖避免
最好避免死鎖,而不是在死鎖發生後採取措施。等待圖可用於避免死鎖。然而,這隻對較小的資料庫有用,因為它在較大的資料庫中可能會變得相當複雜。
廣告
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP