[英]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.