Raymond 基於樹的演算法
Raymond 的基於樹的演算法用於透過鎖定方法保護分散式系統免受分割槽的影響。分散式系統是具有大量節點的網路,涉及從一個節點到另一個節點的訊息流。當程序被鎖定或處於臨界區時,只允許一個執行緒或程序進入,其他執行緒將處於等待狀態。由於分散式系統涉及許多節點,因此可以透過生成生成樹來減少節點數量。
Raymond 的基於樹的演算法
定義
該演算法遵循的方法是,只有擁有令牌的執行緒才能進入臨界區。網路的每個節點最多可以有一個父節點,負責生成令牌。
節點演算法
在樹形結構中,每個節點只能有一個父節點或根節點,所有來自其他節點的請求都發送到該節點。父節點遵循先進先出 (FIFO) 機制來響應來自子節點的請求,無論何時收到令牌。
互斥
該演算法使用令牌來保證互斥。在這種方法中,每個站點都組織成一個有向樹,邊指向持有令牌的站點。如果某個站點擁有令牌,則它可以訪問關鍵部分。這確保了每次只有一個站點可以訪問關鍵部分,而其他所有站點都必須等待令牌釋放。
Raymond 的基於樹的演算法機制
進入臨界區的節點被認為擁有令牌。讓我們將節點 A 作為父節點,子節點為 B、C 和 D。
節點根據請求進入臨界區。
當父站點佇列為空時,它將子節點移動到先進先出佇列,並根據請求分配令牌。
當父節點不為空或佇列已滿時,它將請求的子節點推入佇列。
當任何擁有令牌的子節點收到另一個令牌時,它會將令牌移動到需要令牌的子節點。
Raymond 的基於樹的演算法的特性
該演算法的一些主要特性是:
它透過使用令牌確保互斥屬性。如果某個站點擁有令牌,則它可以訪問關鍵部分。
所有站點都排列成一個有向樹,邊指向持有令牌的站點。
每個節點只有一個父節點,接收請求並轉發請求。
每次節點遇到令牌時,它都會保留一個請求的 FIFO 佇列。
演算法示例
該演算法在分散式系統中使用以下樹形結構實現:
在上面的示例中,站點 A 是持有令牌的主節點。節點 A 下面的站點是站點 B 和 C,它們被認為是子節點。這些站點請求站點 A 進入臨界區。站點 C 又細分為兩個子站點,即節點 D 和 E。
與上述步驟類似,節點 C 是具有兩個子節點 D 和 E 的主節點。這些節點根據其需求向父節點發送請求。由於節點 B 和 C 已經提出了請求,因此當前請求將被設定為在佇列中等待。
根據從主節點到次節點接收到的令牌,站點進入臨界區。
演算法的時間複雜度
分散式系統的臨界區提供 O(log n) 的時間複雜度。每個程序的節點都必須至少儲存 O(log n) 位。
Raymond 演算法的缺點
飢餓 − Raymond 的演算法會導致飢餓。飢餓是在併發系統中可能發生的一種情況,其中程序或執行緒持續被拒絕其執行所需資源。當排程演算法持續優先考慮其他程序或執行緒而不是飢餓程序時,可能會發生這種情況,導致它無限期地等待資源。飢餓會導致系統性能下降,甚至可能導致系統無響應。
貪婪策略 − Raymond 的演算法會導致飢餓。飢餓是在併發系統中可能發生的一種情況,其中程序或執行緒持續被拒絕其執行所需資源。當排程演算法持續優先考慮其他程序或執行緒而不是飢餓程序時,可能會發生這種情況,導致它無限期地等待資源。飢餓會導致系統性能下降,甚至可能導致系統無響應。
結論
該演算法基於子節點發送到父節點的請求使用。該過程透過請求父節點、根據佇列執行節點(節點從臨界區釋放後)以及可以在空或非空節點之間選擇節點來遵循。
資料結構
網路
關係型資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C 語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP