簡介
rcu(read-copy update)是資料同步的一種方式,在當前的linux核心中發揮著重要的作用。rcu主要針對的資料物件是鍊錶,目的是提高遍歷讀取資料的效率,為了達到目的使用rcu機制讀取資料的時候不對鍊錶進行耗時的加鎖操作。這樣在同一時間可以有多個執行緒同時讀取該鍊錶,並且允許乙個執行緒對鍊錶進行修改(修改的時候,需要加鎖)。rcu適用於需要頻繁的讀取資料,而相應修改資料並不多的情景,例如在檔案系統中,經常需要查詢定位目錄,而對目錄的修改相對來說並不多,這就是rcu發揮作用的最佳場景。
linux核心原始碼當中,關於rcu的文件比較齊全,你可以在 /documentation/rcu/ 目錄下找到這些檔案。paul e. mckenney 是核心中rcu原始碼的主要實現者,他也寫了很多rcu方面的文章。他把這些文章和一些關於rcu的**的鏈結整理到了一起。
在rcu的實現過程中,我們主要解決以下問題:
1,在讀取過程中,另外乙個執行緒刪除了乙個節點。刪除執行緒可以把這個節點從鍊錶中移除,但它不能直接銷毀這個節點,必須等到所有的讀取執行緒讀取完成以後,才進行銷毀操作。rcu中把這個過程稱為寬限期(grace period)。
2,在讀取過程中,另外乙個執行緒插入了乙個新節點,而讀執行緒讀到了這個節點,那麼需要保證讀到的這個節點是完整的。這裡涉及到了發布-訂閱機制(publish-subscribe mechanism)。
3, 保證讀取鍊錶的完整性。新增或者刪除乙個節點,不至於導致遍歷乙個鍊錶從中間斷開。但是rcu並不保證一定能讀到新增的節點或者不讀到要被刪除的節點。
Linux核心之RCU鎖
rcu全程read only update rcu機制 rcu記錄了所有指向共享資料的指標的使用者,當要修改共享資料的時候,首先建立乙個副本,在副本中修改。所有讀執行緒都離開讀臨界區之後,指標指向新的修改後副本的指標,並且刪除舊資料。include include include include i...
Linux中的RCU機制的原理
rcu的基本思想是這樣的 先建立乙個舊資料的copy,然後writer更新這個copy,最後再用新的資料替換掉舊的資料。這樣講似乎比較抽象,那麼結合乙個例項來看或許會更加直觀。假設有乙個單向鍊錶,其中包含乙個由指標p指向的節點 現在,我們要使用rcu機制來更新這個節點的資料,那麼首先需要分配一段新的...
LINUX中的RCU機制的分析
rcu機制是linux2.6之後提供的一種資料一致性訪問的機制,從rcu read copy update 的名稱上看,我們就能對他的實現機制有乙個大概的了解,在修改資料的時候,首先需要讀取資料,然後生成乙個副本,對副本進行修改,修改完成之後再將老資料update成新的資料,此所謂rcu。在作業系統...