簡體   English   中英

RCU 如何處理在 synchronized_rcu() 等待時讀者開始讀取臨界區的情況

[英]How RCU handles the condition of a reader started reading critical section while synchronize_rcu() is waiting

根據 RCU 文檔(我相信內核和用戶空間 RCU 框架是相似的), synchronize_rcu()等待所有讀取器(在調用synchronize_rcu之前啟動的)完成。
synchronize_rcu()在其寬限期內等待之后啟動的讀取器會發生什么?
synchronize_rcu()返回后啟動的閱讀器和synchronize_rcu()等待時啟動的閱讀器有什么區別? RCU 框架如何處理這個問題?

新的讀取器(在同步 rcu() 在其寬限期內等待后開始在臨界區執行)讀取新的數據結構?

所有在rcu_assign_pointer()之后進入臨界區的讀者讀取新的數據結構。

在synchronize_rcu()返回后啟動的閱讀器和synchronize_rcu()等待時啟動的閱讀器有什么區別?

您所談論的一切都取決於是否/何時分配了新指針。 分配和閱讀是相關的事情。


Linux上的synchronize_rcu()通常會等到所有CPU都切換上下文——它保證沒有人看到舊指針不再使用它(上下文切換發生在讀者退出臨界區之后)——所以我們可以釋放這個內存. 這篇文章

..如果給定的 CPU 執行上下文切換,我們知道它必須已完成所有前面的 RCU 讀端臨界區。 一旦所有 CPU 都執行了上下文切換,則所有前面的 RCU 讀端臨界區都將完成。
所以,假設我們從它的結構中刪除一個數據項,然后調用synchronize_rcu()。 一旦synchronize_rcu() 返回,我們就可以保證沒有RCU 讀取端臨界區持有對該數據項的引用,因此我們可以安全地回收它。

新讀者對舊數據結構一無所知。 指針的“交換”是原子的。
再一次: synchronize_rcu()對讀者沒有影響——它只是保證在它返回后,我們可以釋放指針指向的內存( kfree() )。

看來您還沒有探索過 Linux RCU 的基礎知識。
必讀:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM