根据RCU文档(我相信内核和用户空间RCU框架是相似的),synchronize_rcu()等待所有读者(在调用synchronize_rcu之前开始)完成。
在synchronize_rcu()处于宽限期等待之后,启动的读者会发生什么?
在synchronize_rcu()返回后启动的读取器与在synchronize_rcu()等待时启动的读取器之间有什么区别?RCU框架如何处理这个问题?
发布于 2020-02-07 16:02:49
新读取器(在synchronize_rcu()在宽限期等待之后开始在关键部分执行)读取新的数据结构?
在rcu_assign_pointer()读取新的数据结构后,所有进入关键部分的读者。
在synchronize_rcu()返回之后启动的读取器和在synchronize_rcu()等待时启动的读取器之间有什么区别?
您所谈论的一切取决于是否/何时分配了新指针。分配和阅读是相关的事情。
Linux上的synchronize_rcu()通常等待到所有CPU都进行上下文切换--它保证没有人看到旧指针不再使用它(在读取器出口它们的关键部分之后发生上下文切换)--所以我们可以释放这个内存。来自这个职位
..if一个给定的CPU执行一个上下文切换,我们知道它必须已经完成了前面所有的RCU读取端关键部分。一旦所有CPU都执行了上下文切换,那么前面所有的RCU读取端关键部分都将完成。 因此,假设我们从它的结构中删除一个数据项,然后调用synchronize_rcu()。一旦synchronize_rcu()返回,我们就可以保证没有RCU读取端关键部分保存对该数据项的引用,这样我们就可以安全地回收它。
新的读者对旧的数据结构一无所知。指针的“交换”是原子的。
再一次:synchronize_rcu()对读取器没有影响-它只是保证在它返回之后,我们可以释放指针指向的内存(kfree())。
您似乎还没有了解Linux的基础知识。
必须改为:
https://stackoverflow.com/questions/60110278
复制相似问题