当前位置: 首页 > news >正文

PREEMPT_RT 技术实现:RCU

RCU (Read-Copy Update, 读 - 复制 - 更新)是 Linux 内核中一种专为读多写少场景优化的高性能同步机制。它的核心优势是:读操作完全无锁、零开销,写操作通过延迟回收保证安全,极大提升多核并发效率。

一、核心原理

RCU 将更新操作拆分为移除(替换)回收(释放)两个阶段,并引入宽限期(Grace Period)确保安全。

读端(Reader)
  • 无锁访问:读者通过rcu_read_lock()rcu_read_unlock()标记临界区,无需获取锁,直接访问数据。
  • 可见性:读者要么看到旧版本,要么看到新版本,永远不会读到中间状态
写端(Writer)
  1. Copy(复制):不直接修改原数据,而是创建一份副本并修改。
  2. Modify(修改):在副本上完成所有更新。
  3. Assign(替换):用原子操作(rcu_assign_pointer)将全局指针指向新副本。此后,新读者只能看到新数据。
  4. Wait(等待):进入宽限期,等待所有正在访问旧数据的读者完成读取。
  5. Reclaim(回收):宽限期结束后,安全释放旧数据。
关键概念:宽限期 (Grace Period)

  • 定义:从指针替换完成,到所有 CPU 都退出读临界区的时间窗口。
  • 作用:确保旧数据在没有任何读者引用时才被释放,避免悬空指针(Use-After-Free)。
  • 静默状态(Quiescent State):内核将上下文切换、进入用户态、空闲循环,视为 CPU 已退出读临界区的标志。

二、适配PREEMPT_RT的 RCU 配置

在主线 Linux 内核中,RCU 的大量处理工作运行在软中断上下文,此过程抢占是关闭的,会造成显著延迟、损害实时性。这篇文章总结了一些相关的优化设置:RCU Configuration for Real-Time Systems, 简单总结一下就是以下的一些设定:

  • RCU 回调卸载(RCU Callback Offloading)
  • RCU 优先级提升(RCU Priority Boosting)
  • RCU 加速宽限期(Expedited RCU Grace Periods)
  • 可抢占 RCU(Preemptible RCU)

三、 可抢占 RCU(Preemptible RCU)

对于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的实现不难看出区别:

  • Preemptible RCU对比普通RCU, 将preempt_disable替换成current->rcu_read_lock_nesting的嵌套层级计数。
  • 普通RCU判断宽限期结束通过判断当前是否处于禁止抢占的状态,而PREEMPT_RCU则通过判断嵌套层级来确认是否可以回收旧数据。通过标记临界区方法的改变,使rcu_read_lock期间无须禁用抢占
http://www.jsqmd.com/news/1139070/

相关文章:

  • 旋转机械故障诊断数据集的系统设计与工程实践深度解析
  • 深入浅出微信消息回调:基于 Webhook 的高效事件驱动架构设计
  • http://27.156.118.74:18800/web/html/index.html?module=tflj
  • 2026年标签打印软件排行榜:5个核心选择技巧必看
  • 【计算机Java毕业设计案例】基于 SpringBoot 的国产影片评分舆情分析系统的设计与实现 基于 SpringBoot+Vue 的影视行业数据统计可视化系统(程序+文档+讲解+定制)
  • 60.1.仓库安防报警-WiFi-基于STM32单片机物联网设计【硬件+APP+云平台】
  • 不小心隐藏了datagirp字段
  • 2026 年AI发展现状:中国、美国、全球格局
  • 2026年临沂短视频公司哪个靠谱:子鱼传媒专业更靠谱
  • 私教服务 | 月薪11K的外包offer,我要去吗?
  • 企业级AI API聚合平台选型指南:摒弃低价陷阱,生产场景方为核心标尺
  • DELTA TAU PEL3-BE0-4L0-0以太网控制模块
  • 2026标签打印软件推荐榜:这5款专家用了都说好
  • 短示例驱动的仿生运动风格迁移:3秒视频生成物理可信动作
  • NinChat:构建 AI 时代的实时新闻搜索基础设施
  • 循环神经网络基础
  • LangGraph 工作流:Agent 从脚本变成可控,从岗位要求反推能力栈
  • 江奇霖《悬案》演技获赞,反差感角色诠释“剧抛脸”实力
  • 现有游乐设施 XR 数字化升级改造方案
  • AI写专著全知道:优质工具赋能,快速生成20万字专著不再难!
  • 模型 Benchmark 方差控制:平均分之前,先看波动有多大
  • 开源项目 CI 中集成 AI 审查:让机器人帮你盯住 PR 质量
  • Wi-Fi 7 来了,320MHz 信道测试这台仪器能不能扛
  • 多机器人分布式风险感知与NBV协同优化框架
  • 一段15秒短视频催生的小程序:我是车标王从0到2.0的创作手记
  • 用国标GB28181视频平台EasyGBS搭建森林防火AI哨兵
  • 纺织制造中织物缺陷检测综述
  • 论软件测试方法及应用
  • 传输线阻抗不连续设计:5%噪声容忍下的10%阻抗变化与长度计算
  • Paperxie 毕业论文智能写作|学长学姐实测!一站式写论文全流程对话版