rcu機制是linux2.6之後提供的一種資料一致性訪問的機制,從rcu(read-copy-update)的名稱上看,我們就能對他的實現機制有乙個大概的了解,在修改資料的時候,首先需要讀取資料,然後生成乙個副本,對副本進行修改,修改完成之後再將老資料update成新的資料,此所謂rcu。
在作業系統中,資料一致性訪問是乙個非常重要的部分,通常我們可以採用鎖機制實現資料的一致性訪問。例如,semaphore、spinlock機制,在訪問共享資料時,首先訪問鎖資源,在獲取鎖資源的前提下才能實現資料的訪問。這種原理很簡單,根本的思想就是在訪問臨界資源時,首先訪問乙個全域性的變數(鎖),通過全域性變數的狀態來控制線程對臨界資源的訪問。但是,這種思想是需要硬體支援的,硬體需要配合實現全域性變數(鎖)的讀-修改-寫,現代cpu都會提供這樣的原子化指令。採用鎖機制實現資料訪問的一致性存在如下兩個問題:
1. 效率問題。鎖機制的實現需要對記憶體的原子化訪問,這種訪問操作會破壞流水線操作,降低了流水線效率。這是影響效能的乙個因素。另外,在採用讀寫鎖機制的情況下,寫鎖是排他鎖,無法實現寫鎖與讀鎖的併發操作,在某些應用下會降低效能。
2. 擴充套件性問題。當系統中cpu數量增多的時候,採用鎖機制實現資料的同步訪問效率偏低。並且隨著cpu數量的增多,效率降低,由此可見鎖機制實現的資料一致性訪問擴充套件性差。
為了解決上述問題,linux中引進了rcu機制。該機制在多cpu的平台上比較適用,對於讀多寫少的應用尤其適用。
rcu的思路實際上很簡單,如下所示:
1.對於讀操作,可以直接對共享資源進行訪問,但是前提是需要cpu支援訪存操作的原子化,現代cpu對這一點都做了保證。但是rcu的讀操作上下文是不可搶占的(這一點在下面解釋),所以讀訪問共享資源時可以採用read_rcu_lock(),該函式的工作是停止搶占。
2 . 對於寫操作,其需要將原來的老資料作一次備份(copy),然後對備份資料進行修改,修改完畢之後再用新資料更新老資料,更新老資料時採用了rcu_assign_pointer()巨集,在該函式中首先屏障一下memory,然後修改老資料。這個操作完成之後,需要進行老資料資源的**。操作執行緒向系統註冊**方法,等待**。採用資料備份的方法可以實現讀者與寫者之間的併發操作,但是不能解決多個寫者之間的同步,所以當存在多個寫者時,需要通過鎖機制對其進行互斥,也就是在同一時刻只能存在乙個寫者。
3.在rcu機制中存在乙個垃圾**的daemon,當共享資源被update之後,可以採用該daemon實現老資料資源的**。**時間點就是在update之前的所有的讀者全部退出。由此可見寫者在update之後是需要睡眠等待的,需要等待讀者完成操作,如果在這個時刻讀者被搶占或者睡眠,那麼很可能會導致系統死鎖。因為此時寫者在等待讀者,讀者被搶占或者睡眠,如果正在執行的執行緒需要訪問讀者和寫者已經占用的資源,那麼死鎖的條件就很有可能形成了。
rcu機制是linux2.6之後提供的一種資料一致性訪問的機制,目前在linux核心中被大量的使用。在修改資料的時候,首先需要讀取資料,然後生成乙個副本,對副本進行修改,修改完成之後再將老資料update成新的資料,此所謂rcu。
從上述分析來看,rcu思想是比較簡單的,其核心內容緊緊圍繞「寫時拷貝」,採用rcu機制,能夠保證在讀寫操作共享資源時,基本不需要取鎖操作,能夠在一定程度上提公升效能。但是該機制的應用是有條件的,對於讀多寫少的應用,機制的開銷比較小,效能會大幅度提公升,但是如果寫操作較多時,開銷將會增大,效能不一定會有所提公升。總體來說,rcu機制是對rw_lock的一種優化。
Linux中的RCU機制的分析
rcu機制是linux2.6之後提供的一種資料一致性訪問的機制,從rcu read copy update 的名稱上看,我們就能對他的實現機制有乙個大概的了解,在修改資料的時候,首先需要讀取資料,然後生成乙個副本,對副本進行修改,修改完成之後再將老資料update成新的資料,此所謂rcu。在作業系統...
Linux中的RCU機制的原理
rcu的基本思想是這樣的 先建立乙個舊資料的copy,然後writer更新這個copy,最後再用新的資料替換掉舊的資料。這樣講似乎比較抽象,那麼結合乙個例項來看或許會更加直觀。假設有乙個單向鍊錶,其中包含乙個由指標p指向的節點 現在,我們要使用rcu機制來更新這個節點的資料,那麼首先需要分配一段新的...
linux核心 RCU機制概述
簡介 rcu read copy update 是資料同步的一種方式,在當前的linux核心中發揮著重要的作用。rcu主要針對的資料物件是鍊錶,目的是提高遍歷讀取資料的效率,為了達到目的使用rcu機制讀取資料的時候不對鍊錶進行耗時的加鎖操作。這樣在同一時間可以有多個執行緒同時讀取該鍊錶,並且允許乙個...