繁体   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