讀寫更新
RCU 是一種可以管理多個程序執行的方法,可以部署到任何作業系統,其中之一是 Linux 核心。它是一種簡單的程序同步方法,它將 RCU 更新分成兩個階段:刪除和回收。這種機制允許讀取和更新同時發生。該過程在作業系統的許多讀取器和更新器之間併發發生。除了簡單的過程之外,它對於同時程序的訪問也可靠。
讀寫更新
定義
讀寫更新 (RCU) 是一種最佳的資料結構,它遵循併發程序同步,在多執行緒併發執行以讀取和更新共享資源(如記憶體、裝置或檔案)時,限制了互斥量或鎖的使用。
讀寫更新 (RCU) 的階段
更新分為兩個階段,即:
刪除
回收
在不使用 RCU 的情況下,離開或刪除執行緒必須鎖定元素,以便任何其他元素都無法訪問它。但是,使用 RCU,刪除階段用於引用元素,並且可以輕鬆刪除而不會影響遍歷列表。在刪除階段從列表中刪除對元素的引用後,執行緒必須等待所有先前的讀取器完成其 RCU 讀取端關鍵部分,然後才能繼續執行回收階段。
讀/寫端程式碼
資料結構分為讀和寫操作。讀取端是併發型別,不會更改資料結構模型,而寫入端會更改資料結構。RCU 使用程序同步來避免讀取器和寫入器端之間的漏洞。
只有當讀取端併發程式碼使用與非同步程式碼類似的記憶體時,才能像後者一樣快速執行。因為原子寫入速度慢且會鎖定記憶體匯流排,所以讀取端程式碼不能寫入共享資料結構。從本質上講,共享資料結構中每個共享快取行上的寫入都會導致共享行從其他處理器的快取中刪除。
此逐出後,其他處理器的快取將需要重新載入資料,這將至少需要數百個週期。快取行彈跳是快取行所有權在核心之間交替的問題。讀取端程式無法使用其他昂貴的指令,例如記憶體屏障。
這些條件從本質上排除了讀寫鎖作為選項。讀取端操作必須對共享資料結構執行原子寫入,在最簡單的讀寫鎖中,這些鎖跟蹤併發讀取器的數量。
RCU 操作
在傳統方法中,讀取器使用鎖來阻止更新刪除資料項。目前,RCU 讀取器可以透過等待所有讀取器完成來使用更輕量級的同步,甚至根本不使用同步。
應用程式程式設計介面 -
下面給出了一些 RCU API:
rcu_read_lock − 它標記 RCU 保護的資料結構,在整個時間內都不能恢復,並且是關鍵部分的初始操作。
rcu_read_unlock − 讀取器使用此函式通知它已離開關鍵部分。
Synchronize_rcu() − Synchronize_rcu() 函式由讀取器使用,該讀取器等待關鍵部分的讀取端退出程序,並且不會立即返回。
Call_rcu − 它是一個在所有活動的 RCU 讀取端關鍵部分完成後呼叫 synchronize_rcu 的函式,而不是阻塞。當禁止阻塞或更新端效率至關重要時,此回撥型別特別有用。
Call_rcu − 此函式更關注安全地通知讀取器更新的值。它還負責記錄有關受 RCU 保護的指標的資料。
rcu_dereference − 此函式專門用於獲取有關由 RCU 保護的指標的資訊。在關鍵部分中的執行緒期間,這些函式僅在此函式內參與。
RCU 的實現
RCU 可以透過兩種不同的方式在 Linux 作業系統中實現。其中一種是使用鎖定方法,另一種是 RCU 的經典方法。
儘管鎖定方法很容易,但它不能在即時使用中實現,因為它在兩個讀取端關鍵部分之間切換。在 RCU 的經典方法中,它顯示更新的效能較低。
讀寫更新的缺點
讀寫更新的主要缺點是搶佔,因為它不能在使用者模式下使用。這些讀寫更新不能被樹資料結構使用,因為它可能依賴於許多無法自動完成的更新。
結論
RCU 機制是一種可以在任何作業系統中使用以避免鎖定方法的機制。RCU 讀取從鎖定函式開始,在解鎖函式中結束。RCU 遵循的基本演算法是進行更改,等待現有的 RCU 讀取端關鍵部分結束,最後清理過程。
資料結構
網路
RDBMS
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP