rcu的基本思想是這樣的:先建立乙個舊資料的copy,然後writer更新這個copy,最後再用新的資料替換掉舊的資料。這樣講似乎比較抽象,那麼結合乙個例項來看或許會更加直觀。
假設有乙個單向鍊錶,其中包含乙個由指標p指向的節點:
現在,我們要使用rcu機制來更新這個節點的資料,那麼首先需要分配一段新的記憶體空間(由指標q指向),用於存放這個copy。
然後將p指向的節點資料,以及它和下一節點[11, 4, 8]的關係,都完整地copy到q指向的記憶體區域中。
接下來,writer會修改這個copy中的資料(將[5, 6, 7]修改為[5, 2, 3])。
修改完成之後,writer就可以將這個更新「發布」了(publish),對於reader來說就「可見」了。因此,pubulish之後才開始讀取操作的reader(比如讀節點[1, 2, 3]的下乙個節點),得到的就是新的資料[5, 2, 3](圖中紅色邊框表示有reader在引用)。
而在publish之前就開始讀取操作的reader則不受影響,依然使用舊的資料[5, 6, 7]。
等到所有引用舊資料區的reader都完成了相關操作,writer才會釋放由p指向的記憶體區域。
可見,在此期間,reader如果讀取這個節點的資料,得到的要麼全是舊的資料,要麼全是新的資料,反正不會是「半新半舊」的資料,資料的一致性是可以保證的。重要的是,rcu中的reader不用像rwlock中的reader那樣,在writer操作期間必須spin等待了。
rcu的全稱是"read copy update",可以這樣來理解:read和進行copy的執行緒並行,目的是為了update。好像有點"copy on write"的意思?反正有人覺得rcu的命名不夠準確,寧願叫它"publish protocol"(比如 fedor pikus)。不管怎樣,rcu的命名已經成了業界預設的,我們還是就叫它rcu吧。
LINUX中的RCU機制的分析
rcu機制是linux2.6之後提供的一種資料一致性訪問的機制,從rcu read copy update 的名稱上看,我們就能對他的實現機制有乙個大概的了解,在修改資料的時候,首先需要讀取資料,然後生成乙個副本,對副本進行修改,修改完成之後再將老資料update成新的資料,此所謂rcu。在作業系統...
Linux中的RCU機制的分析
rcu機制是linux2.6之後提供的一種資料一致性訪問的機制,從rcu read copy update 的名稱上看,我們就能對他的實現機制有乙個大概的了解,在修改資料的時候,首先需要讀取資料,然後生成乙個副本,對副本進行修改,修改完成之後再將老資料update成新的資料,此所謂rcu。在作業系統...
linux核心 RCU機制概述
簡介 rcu read copy update 是資料同步的一種方式,在當前的linux核心中發揮著重要的作用。rcu主要針對的資料物件是鍊錶,目的是提高遍歷讀取資料的效率,為了達到目的使用rcu機制讀取資料的時候不對鍊錶進行耗時的加鎖操作。這樣在同一時間可以有多個執行緒同時讀取該鍊錶,並且允許乙個...