RCU初步分析

article/2025/7/3 13:13:35

RCU初步分析

  • 背景知识
  • RCU介绍
  • 名词定义
  • RCU的基本执行过程
    • 基本过程
    • 基本思想
    • 示意图
    • 基本流程
    • 示例代码
    • 并发执行示意图
  • RCU特性
  • 简易RCU实现
    • 基于spinlock的实现
    • 基于计数器的实现
    • 基于线程变量的实现
  • Linux内核中经典RCU实现介绍

背景知识

随着硬件晶体管的尺寸越来越小,CPU的频率上限基本保持在4G左右。这说明虽然摩尔定律仍然在晶体管密度方面有效,但是在提高单线程性能方面已经不再有效,也意味着编写单线程代码并简单的等待 CPUs 一两年时间不再是一个可行的方法。所有主流厂商最近的趋势是朝多核/多线程系统发展,并行是充分利用这些系统性能的好办法,以此让软件更能符合硬件的变化从而提高软件的性能。
并行编程领域是一个革新式的变化,同时也涉及众多的领域——它需要考虑硬件平台的实现方式、软件任务间的通信、任务同步等多种复杂的情况。

Linux中的RCU是并行编程的一个典型应用,下面主要介绍RCU的内容。

RCU介绍

RCU全称read-copy-update,是一种同步机制。当多个线程同时读取和更新通过指针链接且属于共享数据结构(例如,链表、树,哈希表)时,避免使用锁。每当线程在共享内存中插入或删除数据结构的元素时,所有读者都可以保证看到并遍历旧结构或新结构,从而避免不一致(例如,取消引用空指针)。
它主要用在读取性能至关重要的场合,以更多空间为代价实现快速操作;这使得所有读者继续进行,就好像不涉及同步一样,因此它们会很快,但也会使更新更加困难。

名词定义

  • 宽限期:grace period,简写gp,这是一个等待期,以确保所有与执行删除的数据相关的 reader访问完毕。
  • 静止状态:Quiescent State,简写 qs,在任意时刻,一个特定的CPU只要看起来处于 阻塞状态、IDLE循环、或者离开了内核后,我们就知道所有RCU读端临界区已 经完成。这些状态被称为“静止状态”。

RCU的基本执行过程

基本过程

  • 采用发布——订阅机制添加新的数据;
  • 等待已有的 RCU 读者退出临界区;
  • 允许在不影响或者延迟其他并发 RCU 读者的前提下改变数据;

基本思想

  • 示例代码
q = kmalloc(sizeof(*p), GFP_KERNEL);
*q = *p;
q->b = 2;
q->c = 3;
list_replace_rcu(&p->list, &q->list);
synchronize_rcu();
kfree(p);

示意图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 先给指针q分配一个空间;
  • 给指针q赋值;
  • 将新生成的q指向p的下一个节点;
  • 再将p的上一个节点指向q;
  • 等宽限期结束后,在将p释放掉;
  • 第三第四步的顺序不能反,否则会造成读端在读取数据的时候出现空指针;

基本流程

  • 读端通过rcu_read_lock()进入临界区;
  • 读端通过rcu_read_unlock()退出临界区;
  • 更新端通过rcu_assign_pointer()等发布原语发布数据;
  • 更新端通过synchronize_rcu()等待宽限期结束;

示例代码

  • 读端:
rcu_read_lock();
p = rcu_dereference(head);... ...
rcu_read_unlock();

该段代码通过rcu_read_lock()进入临界区,然后获取指针p,并对p进行一些列操作,最后通过rcu_read_unlock()退出临界区。

  • 更新端
spin_lock(&lock);
p = head;
rcu_assign_pointer(head, NULL);
spin_unlock(&lock);
synchronize_rcu();
kfree(p);

该段代码先通过rcu_assign_pointer()函数将head置为NULL,然后通过synchronize_rcu()等待宽限期结束。当synchronize_rcu()函数返回时,表示宽限期结束,所有的读端都已经退出临界区,此时可以释放p(原来head)指向的空间。

并发执行示意图

在这里插入图片描述

RCU特性

  • RCU读端和更新端可以同时操作,并发执行;
  • RCU采用数据担保的方式,为读端提供可靠数据;
  • 读端读到的数据有可能是旧的也可能是新的;
  • 宽限期结束时,读端要退出临界区;
  • 典型RCU读端在临界区内不允许中断、休眠等操作;

简易RCU实现

宽限期的开始和结束都是要看是否有当前有读端在临界区内,所以RCU最重要的过程也就是如下3个:

  • 读端进入临界区
  • 读端退出临界区
  • 等待宽限期结束
    下面我们通过几个简单的实现来重点了解一下这三个方面的内容。

基于spinlock的实现

DEFINE_SPINLOCK(rcu_gp_lock);static void rcu_read_lock(void)
{spin_lock(&rcu_gp_lcok);
}static void rcu_read_unlock(void)
{spin_unlock(&rcu_gp_lock);
}static void synchronize_rcu(void)
{spin_lock(&rcu_gp_lock);spin_unlock(&rcu_gp_lock);
}

基于计数器的实现

atomic_t rcu_refcnt;static void rcu_read_lock(void)
{atomic_inc(&rcu_refcnt);smp_mb();
}static void rcu_read_unlock(void)
{smp_mb();atomic_dec(&rcu_refcnt);
}static void synchronize_rcu(void)
{smp_mb();while(atomic_read(&rcu_refcnt) != 0) {poll(NULL, 0, 10);}smp_mb();
}

基于线程变量的实现

static void rcu_read_lock(void)
{spin_lock(&__get_thread_var(rcu_gp_lock));
}static void rcu_read_unlock(void)
{spin_unlock(&__get_thread_var(rcu_gp_lock));
}static void synchronize_rcu(void)
{for_each_running_thread(t){spin_lock(&per_thread(rcu_gp_lock, t));spin_unlock(&per_thread(ruc_gp_lock, t));}
}

Linux内核中经典RCU实现介绍

在Linux内核中RCU有多种实现方式:

  • 基于单核的tiny实现
  • 基于静止状态的实现
  • 基于任务的实现
  • 可睡眠的SRCU
  • … …

这些实现主要是跟踪宽限期的方式不同。下面主要对基于静止状态的RCU的宽限期跟踪实现的介绍。
经典RCU 读端临界区限制其中的内核代码不允许阻塞。这意味着在任意时刻,一个特定的CPU只要看起来处于阻塞状态、IDLE循环、或者离开了内核后,我们就知道所有RCU读端临界区已经完成。这些状态被称为“静止状态”,当每一个CPU已经经历过至少一次静止状态时,RCU宽限期结束。
为了减少对CPU的遍历,所有CPU的静止状态会保存到一个struct rcu_state的结构体中类型为struct rcu_node的数组中。为了减少CPU上报时对数据锁的竞争,RCU采用了分级控制,如下图:
在这里插入图片描述
在一个rcu_node中,第一个上报静止状态的CPU会将数据保存在该层的节点中;只有另外一个CPU也上报了静止状态的时候,才会将该节点的两个CPU的静止状态同时上报的上一层的rcu_node中。这样做的好处是:在底层同一时间至多有两个CPU会竞争锁,在顶层锁的竞争也相对较少;这样大大减少了CPU相互竞争的机会,提高了RCU宽限期检测的性能。
上图是立体示意图,实际在Linux中采用数组来实现。示意图如下:
在这里插入图片描述
Linux会在RCU初始化的时候会根据实际CPU的数量来动态生成CPU的层级关系。


http://www.hkcw.cn/article/pglmnpoSqV.shtml

相关文章

多名中国公民被印度拘捕 中使馆提醒 边境风险需警惕

中国驻尼泊尔使馆近期发布消息,提醒旅尼中国公民避免前往尼印边境地区。尽管多次发出警告,仍有部分中国公民未听从劝告,执意前往该区域,导致多起被捕事件。尼泊尔和印度之间的边界开放,两国公民可凭身份证件自由往来,但外国公民不能免签证经尼泊尔进入印度。中国公民在尼…

解锁AI超级能力:30+款MCP服务器全景指南

MCP服务器是当前AI领域的热门话题,几乎每个人都渴望参与其中。简单来说,MCP(模型上下文协议,Model Context Protocol)服务器是一种REST API服务器,充当大型语言模型(LLM)与各种外部系…

【cpp-httplib】 安装与使用

cpp-httplib 1. 介绍2. 安装3. 类与接口3.1 httplib请求3.2 httplib响应3.3 httplib服务端3.4 httplib客户端 4. 使用4.1 服务端4.2 客户端 1. 介绍 C HTTP 库(cpp-httplib)是一个轻量级的 C HTTP 客户端/服务器库,它提供了简单的 API 来创建…

HPE推出全新分布式服务交换机及有线无线产品组合,全面赋能AI与高性能计算需求

HPE Aruba Networking将分布式服务交换机性能全面升级,实现能力翻倍 休斯顿-2025年5月29日-慧与科技(NYSE:HPE)日前宣布全面扩展HPE Aruba Networking有线及无线网络产品组合,并重磅推出全新HPE Aruba Networking CX 10K分布式服务交换机。该系列交换机搭载AMD Pensando可编程…

烟草工业数字化转型:科技领航,重塑传统产业新生态

在科技浪潮席卷各行业的当下,烟草工业这一传统产业也迎来了深刻变革。《烟草工业数字化转型:科技领航,重塑传统产业新生态》这一主题,精准揭示了数字化技术如何在具有独特生产工艺与严格监管要求的烟草工业中,发挥关键…

单依纯《歌手》被吐槽像吃了跳跳糖 转型争议不断

2025年开春,单依纯这个名字在娱乐圈频繁出现。这个被称为“00后王菲”的女孩,在《歌手2025》的舞台上表现亮眼,但随之而来的争议也越来越多。有人称赞她的唱功,有人批评她“卖肉博眼球”。这些争论背后反映出两个问题:女艺人应该怎样生活,观众到底想看什么。回顾单依纯的…

断眉袭榜单依纯成功 青春DNA狂飙舞台

歌手2025第三期是袭榜赛,断眉作为袭榜者开场演唱了大热单曲《See You Again》,前奏一响即勾起观众的集体回忆,被评价为“青春DNA狂飙”的舞台。尽管部分观众认为其高音表现稍显吃力,但整体感染力仍获认可。接下来是歌手2025第三期出场顺序及淘汰名单:GAI周延第一个出场,演…

二维平面点集相似问题思考及优化

欢迎关注更多精彩 关注我,学习常用算法与数据结构,一题多解,降维打击。 问题描述 如果两个点集可以通过平移,X轴对称,Y轴对称,中心对称得到相同的点集,则移两个点集相似。 给定多个点集&…

AI炼丹日志-23 - MCP 自动操作 自动进行联网检索 扩展MCP能力

点一下关注吧!!!非常感谢!!持续更新!!! Java篇: MyBatis 更新完毕目前开始更新 Spring,一起深入浅出! 大数据篇 300: Hadoop&…

WebFuture:设置不自动删除操作日志

问题描述: 客户要求保留系统操作日期为1年 或者不删除 问题处理: 在平台安全配置中 将自动清理后台操作日志功能 选择为否,或者设置自动清理的时间为365天

国产高安全芯片在供应链自主可控中的综合优势与案例分析

摘要:本文深入探讨了国产高安全芯片在实现供应链自主可控中的关键作用,通过分析国科安芯的 AS32A601、ASM1042、ASP3605 和 ASP4644 芯片的技术特性,结合其在工业控制、汽车电子、航天航空和电力系统等领域的应用场景,系统阐述了国…

Sigma-Aldrich3D细胞培养支架有哪些类型?

体内生长的哺乳动物细胞处于复杂的三维(3D)环境中。围绕在细胞周围的细胞外基质(ECM)的形状和化学组成能够决定许多生理反应。传统的细胞培养技术和实验方案在通常由玻璃或聚苯乙烯制成的二维(2D)表面上进行…

【开发心得】AstrBot对接飞书失败的问题探究

飞书与AstrBot的集成使用中,偶尔出现连接不稳定的现象。尽管不影响核心功能,但为深入探究技术细节并推动后续优化,需系统性记录该问题。先从底层通信机制入手,分析连接建立的逻辑与数据交互流程。基于实际现象,明确问题…

低功耗可编程RTU 在供水管网监控中的应用

1.1 智慧水务之管网 供水管网监控系统适用于供水企业实施供水管网的远程监测,工作人员在调度中心远程监测供水管网的压力及流量情况,可以对远程现场的运行设备进行监控,以实现管道压力、水流量的数据传送及阀门开关的自动管制&#xff…

RK3568 OH5.1 编译运行程序hellworld

编写helloworld 代码根目录创建sample子系统文件夹在子系统目录下创建hello部件文件夹hello文件夹中创建hello源码目录及源码 sample/hello/src/helloworld.c&#xff1a; #include <stdio.h> #include "helloworld.h"void hello_oh(void);int main(int arg…

LangChain-结合魔塔社区modelscope的embeddings实现搜索

首先要安装modelscope pip install modelscope 安装完成后测试 from langchain_community.embeddings import ModelScopeEmbeddingsembeddings ModelScopeEmbeddings(model_id"iic/nlp_gte_sentence-embedding_chinese-base")text "这是一个测试句子"…

千库/六图素材下载工具

—————【下 载 地 址】——————— 【​本章下载一】&#xff1a;https://pan.xunlei.com/s/VORW9TbxC9Lmz8gCynFrgdBzA1?pwdxiut# 【​本章下载二】&#xff1a;https://pan.quark.cn/s/829e2a4085d3 【百款黑科技】&#xff1a;https://ucnygalh6wle.feishu.cn/wiki/…

老板发百万让员工带薪收麦子 暖心福利获赞

5月23日,河南长垣的河南省矿山起重机有限公司内举行了一场特别的“三夏”生产动员暨表彰大会。公司董事长崔培军在会上宣布了一项暖心措施:他现场拿出360万元现金,每位员工都收到了700元现金、一袋小米和4箱啤酒作为“三夏”福利。崔培军表示,正值“三夏”大忙季节,考虑到…

加沙的孩子没有儿童节 战火中的无辜伤亡

5月27日,联合国儿童基金会称,自2023年10月本轮巴以冲突爆发以来,加沙已有超过5万名儿童伤亡,当地被形容为人间地狱。英国外交官卡里乌基表示,加沙已成为世界上儿童生存最危险的地方。据半岛电视台报道,平均每45分钟就有一名孩子死去。战前,加沙人口约230万,其中一半是1…

何为新消费时代的“情绪价值逻辑” 品牌业绩与股价双开花

胖东来、泡泡玛特、老铺黄金等品牌不仅在社交媒体上频繁出现,还实现了业绩与股价的双重增长。这种现象背后是情绪消费时代的崛起。国金证券最新研究报告指出,随着中国居民人均可支配收入的提升,消费需求正从功能性向情感性转移,情绪价值消费成为消费行业的重要趋势。预计到…