0

根据 RCU 文档(我相信内核和用户空间 RCU 框架相似),synchronize_rcu()等待所有读者(在synchronize_rcu被调用之前开始)完成。在宽限期等待
之后启动的读者会发生什么?返回后开始阅读器和等待时开始 阅读器有什么区别?RCU 框架如何处理这个问题?synchronize_rcu()
synchronize_rcu()synchronize_rcu()

4

1 回答 1

2

新的读取器(在 synchronize_rcu() 等待宽限期后开始在临界区执行)读取新的数据结构?

rcu_assign_pointer()所有读者在阅读完新的数据结构 后进入临界区。

在 synchronize_rcu() 返回后启动的读取器与在 synchronize_rcu() 等待时启动的读取器有什么区别?

您所谈论的一切取决于是否/何时分配新指针。分配和阅读是相关的事情。


synchronize_rcu()在 Linux 上,通常会等到所有 CPU 都切换其上下文- 它保证没有人看到旧指针不再使用它(上下文切换发生在读取器退出其临界区之后) - 所以我们可以释放这个内存。从这篇文章

..如果给定的 CPU 执行上下文切换,我们知道它必须完成所有前面的 RCU 读取端临界区。一旦所有 CPU 都执行了上下文切换,那么所有前面的 RCU 读取端临界区都将完成。
因此,假设我们从其结构中删除一个数据项,然后调用 synchronize_rcu()。一旦 synchronize_rcu() 返回,我们就可以保证没有 RCU 读取端临界区持有对该数据项的引用,因此我们可以安全地回收它。

新读者对旧数据结构一无所知。指针的“交换”是原子的。
再一次:synchronize_rcu()对读者没有影响——它只是保证在它返回后,我们可以释放指针指向的内存(kfree())。

看来您还没有探索过 Linux RCU 的基础知识。
必读:

于 2020-02-07T16:02:49.387 回答