分散式系統中的資源死鎖與通訊死鎖
作業系統中的死鎖發生在當一個程序進入等待狀態,而其他程序持有需要使用的資源時。這個問題通常發生在多處理環境、分散式系統和平行計算系統中。
在分散式系統中,死鎖被認為是一個主要問題,其中程序請求的資源由於其他程序持有而不可用。分散式系統包含一組程序 p1、p2、p3…pn,它們不共享公共記憶體,並且通訊僅透過網路傳遞訊息進行。它沒有用於即時訪問和通訊媒介的全域性時鐘。每個程序都有兩種狀態,例如執行狀態,其中程序包含所有資源並準備執行,以及另一種狀態阻塞狀態,其中程序處於等待狀態,需要一些資源。
以下是發生死鎖需要滿足的四個條件:
保持並等待 - 一個程序持有另一個程序需要使用的資源。
互斥 - 當一次只允許一個程序使用一個資源時。
不可搶佔 - 任何程序都不能被搶佔,直到它完成任務的執行。
迴圈等待 - 程序需要以迴圈方式等待所需的資源,其中佇列中的最後一個程序等待第一個程序使用的資源。
資源死鎖
資源死鎖發生在當一個程序等待由另一個程序持有一組資源,並且它等待在解除阻塞之前接收所有請求的資源時。因此,等待資源的程序集被稱為處於資源死鎖狀態。考慮一個例子,當兩個程序 P1 和 P2 需要資源 X 和 Y 時。在這種情況下,P1 等待資源 Y,而 P2 持有資源 Y,而 P2 反過來等待資源 X,該資源必須由持有它的 P1 釋放。因此,在
封閉的方式中,P1 需要資源 Y 並等待 P2 釋放它,而 P2 需要 X,並等待 P2 釋放它。
上圖被稱為處於資源死鎖狀態,因為每個程序都等待另一個程序獲取所有需要的資源集。分散式死鎖更難以處理,因為資源和輸入程序是分散式的,並且不能在公共場所檢測到。一些方法用於處理分散式死鎖,例如檢測、預防、避免和鴕鳥問題(避免)。
通訊死鎖
通訊死鎖發生在需要通訊的程序之間,並且等待另一個程序完成其任務。處於等待狀態的程序在收到組中其他程序的通訊請求時可以解除其阻塞狀態。當集合中的每個程序都等待另一個程序進行通訊時,此時沒有其他程序開始其他通訊,直到它從初始程序收到進一步的通訊。
考慮一種情況,程序 X 等待來自程序 Y 的訊息,而程序 Y 反過來等待來自另一個稱為 Z 的程序的訊息。然後程序 Z 等待初始程序。當程序之間的通訊被彼此鎖定時,就會發生這種死鎖。
下表定義了資源死鎖和通訊死鎖之間的主要區別
差異依據 |
資源死鎖 |
通訊死鎖 |
|---|---|---|
定義 |
程序等待由其他程序持有的多個資源 |
程序等待組中的另一個程序彼此發起通訊 |
程序狀態 |
等待所需資源的程序無法繼續執行狀態,直到獲取所有資源。 |
程序在收到來自另一個程序的通訊訊息之前不會進入執行狀態。 |
等待物件 |
程序等待資源來執行其任務。 |
程序等待來自另一個程序的訊息。 |
事務 |
不知道事務之間的依賴關係 |
程序可以在開始事務之前識別要與哪個程序通訊 |
死鎖發生 |
當特定集合中的每個程序都需要來自另一個程序的多個資源,並且初始程序必須透過獲取所需的資源來解除其阻塞狀態時。然後這些程序集處於資源死鎖狀態 |
當組中的每個程序都等待來自另一個程序的通訊,並且在此階段,沒有其他程序啟動新的通訊,直到它從所需程序收到相同的通訊,這些程序現在處於死鎖階段。 |
示例 |
程序 P1 等待資源 X,而 P2 等待資源 Y,並且每個程序都持有並等待每個資源。 |
程序 X 等待來自程序 Y 的訊息,而程序 Y 反過來等待程序 Z,而 Z 等待初始程序 X。 |
結論
分散式系統中死鎖的發生是一個主要問題,因為資源不共享公共記憶體位置,並且它們分佈在不同的程序之間。分散式系統中可能出現兩種型別的死鎖,即資源死鎖和通訊死鎖,上面已經對它們進行了描述,以及它們之間的區別。
資料結構
網路
RDBMS
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP