收藏 介紹RCU的好文章

2022-03-08 13:58:27 字數 1132 閱讀 2905

rcu原理:

rcu(read-copy update),顧名思義就是讀-拷貝修改,它是基於其原理命名的。對於被rcu保護的共享資料結構,讀者不需要獲得任何鎖就可以訪問它,但寫者在訪問它時首先拷貝乙個副本,然後對副本進行修改,最後使用乙個**(callback)機制在適當的時機把指向原來資料的指標重新指向新的被修改的資料。這個時機就是所有引用該資料的cpu都退出對共享資料的操作。

因此rcu實際上是一種改進的rwlock,讀者幾乎沒有什麼同步開銷,它不需要鎖,不使用原子指令,而且在除alpha的所有架構上也不需要記憶體柵(memory barrier),因此不會導致鎖競爭,記憶體延遲以及流水線停滯。不需要鎖也使得使用更容易,因為死鎖問題就不需要考慮了。寫者的同步開銷比較大,它需要延遲資料結構的釋放,複製被修改的資料結構,它也必須使用某種鎖機制同步並行的其它寫者的修改操作。讀者必須提供乙個訊號給寫者以便寫者能夠確定資料可以被安全地釋放或修改的時機。有乙個專門的垃圾收集器來探測讀者的訊號,一旦所有的讀者都已經傳送訊號告知它們都不在使用被rcu保護的資料結構,垃圾收集器就呼叫**函式完成最後的資料釋放或修改操作。 rcu與rwlock的不同之處是:它既允許多個讀者同時訪問被保護的資料,又允許多個讀者和多個寫者同時訪問被保護的資料(注意:是否可以有多個寫者並行訪問取決於寫者之間使用的同步機制),讀者沒有任何同步開銷,而寫者的同步開銷則取決於使用的寫者間同步機制。但rcu不能替代rwlock,因為如果寫比較多時,對讀者的效能提高不能彌補寫者導致的損失。

讀者在訪問被rcu保護的共享資料期間不能被阻塞,這是rcu機制得以實現的乙個基本前提,也就說當讀者在引用被rcu保護的共享資料期間,讀者所在的cpu不能發生上下文切換,spinlock和rwlock都需要這樣的前提。寫者在訪問被rcu保護的共享資料時不需要和讀者競爭任何鎖,只有在有多於乙個寫者的情況下需要獲得某種鎖以與其他寫者同步。寫者修改資料前首先拷貝乙個被修改元素的副本,然後在副本上進行修改,修改完畢後它向垃圾**器註冊乙個**函式以便在適當的時機執行真正的修改操作。等待適當時機的這一時期稱為grace period,而cpu發生了上下文切換稱為經歷乙個quiescent state,grace period就是所有cpu都經歷一次quiescent state所需要的等待的時間。垃圾收集器就是在grace period之後呼叫寫者註冊的**函式來完成真正的資料修改或資料釋放操作的。

1、2、

3、4、

收藏的好文章

二叉樹遍歷之非遞迴演算法 石鍋拌飯的部落格 二叉樹遍歷的遞迴演算法 石鍋拌飯的部落格 二叉樹的遞迴建立 binary trees stanford cs education library binary trees pdf stanford cs education library 為什麼gets ...

收藏的好文章

二叉樹遍歷之非遞迴演算法 石鍋拌飯的部落格 二叉樹遍歷的遞迴演算法 石鍋拌飯的部落格 二叉樹的遞迴建立 binary trees stanford cs education library binary trees pdf stanford cs education library 為什麼gets ...

好文章備忘

1 規範了命名空間 地圖 com.mapabc.maps.api.mflexmap 常量 com.mapabc.maps.api.constants 包括 mdisplaystate m s mdirection mmapmousetools malignposition mlanguage mgp...