






















RCU (Read-Copy Update, 读 - 复制 - 更新) 是 Linux 内核中一种专为 读多写少 场景优化的高性能同步机制。它的核心优势是:读操作完全无锁、零开销,写操作通过延迟回收保证安全,极大提升多核并发效率。
RCU 将更新操作拆分为 移除(替换) 和 回收(释放) 两个阶段,并引入 宽限期(Grace Period) 确保安全。

rcu_read_lock() 和 rcu_read_unlock() 标记临界区,无需获取锁,直接访问数据。rcu_assign_pointer)将全局指针指向新副本。此后,新读者只能看到新数据。
在主线 Linux 内核中,RCU 的大量处理工作运行在软中断上下文,此过程抢占是关闭的,会造成显著延迟、损害实时性。这篇文章总结了一些相关的优化设置:RCU Configuration for Real-Time Systems, 简单总结一下就是以下的一些设定:
对于RCU的一些优化操作,我想着重介绍一下Preemptible RCU的实现机制。
#ifdef CONFIG_PREEMPT_RCU
static void rcu_preempt_read_enter(void)
{
WRITE_ONCE(current->rcu_read_lock_nesting, READ_ONCE(current->rcu_read_lock_nesting) + 1);
}
/*
* Preemptible RCU implementation for rcu_read_lock().
* Just increment ->rcu_read_lock_nesting, shared state will be updated
* if we block.
*/
void __rcu_read_lock(void)
{
rcu_preempt_read_enter();
if (IS_ENABLED(CONFIG_PROVE_LOCKING))
WARN_ON_ONCE(rcu_preempt_depth() > RCU_NEST_PMAX);
if (IS_ENABLED(CONFIG_RCU_STRICT_GRACE_PERIOD) && rcu_state.gp_kthread)
WRITE_ONCE(current->rcu_read_unlock_special.b.need_qs, true);
barrier(); /* critical section after entry code. */
}
#else /* #ifdef CONFIG_PREEMPT_RCU */
static inline void __rcu_read_lock(void)
{
preempt_disable();
}
#endif
通过上述代码对__rcu_read_lock的实现不难看出区别:
preempt_disable替换成current->rcu_read_lock_nesting的嵌套层级计数。rcu_read_lock期间无须禁用抢占。此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。