rcu是linux 2.6 kernel實現的一種高效的同步機制,適用於讀者多,寫者少的情況。它的適用場合和讀寫鎖是很相似的。但是和讀寫鎖來比,它可以提高了讀者的效率。因為使用rcu的讀者在訪問共享資料的時候不需要加鎖,而使用讀寫鎖的讀者則需要加讀鎖,在多cpu環境中會有快取記憶體行失效的問題,所以效率稍低。
但是沒有天下沒有免費的午餐。rcu有它自身的缺點和使用限制。首當其衝的缺點就是寫者的效率問題,rcu要求寫者在更新共享資料的時候,先拷貝乙份,修改,然後在更新,寫者做了太多事情,所以效率低。另外rcu有兩個使用限制條件:
. rcu只保護動態分配並通過指標引用的資料結構
. 在被rcu保護的臨界區中,任何核心路徑都不能睡眠
明白了為什麼有這兩個限制,也就明白了rcu的實現原理。
第乙個限制條件是因為對指標變數的修改是原子操作,這樣讀者讀這個指標和寫者修改這個指標的操作就不需要同步。寫者在操作的時候首先定義乙個新指標,申請空間,然後拷貝原指標指向的內容,修改完畢後,直接將剛申請的新指標的值賦給共享指標。這樣也就要求讀者在訪問的時候,需要先定義另外乙個指標,然後將共享指標的值賦給新指標,然後用新指標進一步訪問裡面的內容,不能直接使用共享指標訪問其中的內容,因為如果那樣,在讀者兩次訪問共享指標指向的內容的中間,共享指標的值可能被寫者改變,造成資料不一致的問題。
第二個限制條件是因為被寫者替換前的指標指向的空間必須被釋放,而且這個釋放必須是在所有程序都已經不在引用舊指標的基礎上。加上這個限制就可以通過程序切換來判斷了,只要某個cpu程序切換過一次,就知道這個cpu上已經不存在引用舊資料的程序了,如果所有cpu在寫者更新以後都進行過至少一次程序切換,那麼舊的資料就可以被釋放掉了。另外這個限制也要求讀者在訪問共享指標前要禁用核心搶占,否則可能發生程序切換。
Linux中的RCU機制的原理
rcu的基本思想是這樣的 先建立乙個舊資料的copy,然後writer更新這個copy,最後再用新的資料替換掉舊的資料。這樣講似乎比較抽象,那麼結合乙個例項來看或許會更加直觀。假設有乙個單向鍊錶,其中包含乙個由指標p指向的節點 現在,我們要使用rcu機制來更新這個節點的資料,那麼首先需要分配一段新的...
Linux RCU佇列(2)樹形RCU佇列實現
因為只用乙個全域性鎖在多處理器系統中會造成很嚴重的鎖競爭問題,一種有效的途徑是將鎖競爭關係變為一種層次關係 如圖1 圖中四個rcu node結構體都有自己的鎖,因此處理器0和處理器1之間將會先競爭底層的鎖然後在競爭高層的鎖,其他處理器也一樣。在grace period期間,只有獲取了底層的鎖的處理器...
RCU機制及發布訂閱
簡介 rcu read copy update 是資料同步的一種方式,在當前的linux核心中發揮著重要的作用。rcu主要針對的資料物件是鍊錶,目的是提高遍歷讀取資料的效率,為了達到目的使用rcu機制讀取資料的時候不對鍊錶進行耗時的加鎖操作。這樣在同一時間可以有多個執行緒同時讀取該鍊錶,並且允許乙個...