RCU 读复制更新Read-copy update
把共享对象的移除与回收分离,让读者在规定临界区内安全访问,回收等待宽限期。
- 核心约束
- 旧对象必须保留到可能观察到它的既有读侧临界区结束;发布与回收须遵守相应内存序和 API 规则。
- 适用问题
- 读多写少的索引、共享对象发布与生命周期管理。
- 边界与取舍
- RCU 不自动序列化写者,也不保证可变字段快照;跨读区持有对象常需引用计数等机制。
常见操作#
R 为待回收对象集合;读侧成本依 RCU 变体、内核配置与执行上下文而变。
| 操作 | 时间成本 | 条件与说明 |
|---|---|---|
| 进入 / 退出读侧临界区 | 由 RCU 变体决定 | 某些上下文只需很少指令;SRCU 等方案会维护额外计数,不能统一断言零成本。 |
| 发布替代对象 | 构建对象 + 有序发布 | 更新者仍需适当序列化;RCU 不自动解决多个写者的数据竞争。 |
| 等待宽限期并回收 | 由既有读者退出和回收调度决定 | 不是一个以容器元素数为变量的固定 延迟。回调可以异步排队。 |
时间与空间#
- 时间成本
- 读侧、更新、宽限期和回收分别分析
- 空间成本
- 当前对象 + 尚未回收的旧对象及回调
RCU 主要保证读侧遍历期间的对象生命周期。退出读侧后继续保留指针,需要引用计数或其他生命周期协议。
工程中的应用#
2 个案例 · 附源码Linux 通过 RCU 保护 PID 查找期间的对象存活,再用引用计数延长返回对象的生命;移除 PID 后先等待 RCU 宽限期,再释放索引持有的引用。
附源码片段 · 并发与一致性
QEMU 重建 FlatView 后发布新指针,已有读者继续使用旧视图,直到引用归还且 RCU 宽限期结束才销毁。
附源码片段 · 并发与一致性
基础原理参考资料
Linux 6.12 · What is RCU?移除、宽限期、延迟回收和读复制更新 API 的边界。