技术分享 | 编程界也内卷?浅析“斜杠青年”RCU

news2024/10/7 20:33:39

随着硬件晶体管的尺寸越来越小,CPU 的频率上限已经基本保持在 4G 左右,但现代人类对于网络的要求不断升级,想要占领市场各厂商只能激发自己的潜能,将单线程代码发展为多核/多线程系统,在这其中,并行是充分利用这些系统性能的最优办法。

并行编程是一个革新式的变化,它涉及众多领域,包括硬件平台的实现方式、软件任务间的通信、任务同步等等,可以说是一个实打实的“斜杆青年”了。

今天,我们就以 Linux 中的常用 RCU 机制看看,并行编程到底是怎么被卷出来的!

图片

RCU 全称 read-copy-update ,是一种数据同步机制。

RCU 主要针对的数据对象是指针,目的是提高遍历读取数据的效率。以链表为例,为了提高效率,我们在使用 RCU 机制读取数据的时候可以不对链表进行加锁操作。这时,每当线程在共享内存中插入或删除数据结构的元素时,可以保证所有读者都看到并遍历旧结构或新结构,从而避免不一致(例如,取消引用空指针)。

图片

RCU 主要用在读取性能至关重要的场合中,为了保证所有读者的继续不受影响,并可以更快地完成实现速度,它不得不占用更多空间。这也成就了 RCU 的特点:

  • RCU 读端和更新端可以同时操作,并发执行;

  • RCU 采用数据担保的方式,为读端提供可靠数据;

  • 读端读到的数据有可能是旧的也可能是新的;

  • 宽限期结束时,读端要退出临界区;

  • 典型  RCU 读端在临界区内不允许中断、休眠等操作。

图片

图片

我们可以将 RCU 的基本执行过程分为三个步骤:

  • 采用发布——订阅机制添加新的数据

  • 等待已有的 RCU 读者退出临界区;

  • 允许在不影响或者延迟其他并发 RCU 读者的前提下改变数据。

图片

图片

q = kmalloc(sizeof(*p), GFP_KERNEL);
*q = *p;
q->b = 11;
list_replace_rcu(&p->list, &q->list);
synchronize_rcu();
kfree(p);

图片

图片

从上图我们可以看出, RCU 的基本构建思想可以归纳成:

  • 先给指针 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();

当我们进入临界区后,就可以操作获取指针 p ,并对 p 进行一系列的操作了。

  • 更新端

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 的全部执行过程时,就可以将其基本思想概括为三类:

  • 读者无锁访问数据,标记进出临界区;

  • 写者读取,复制,更新;

  • 旧数据延迟回收。

说起来容易,但其在 Linux 内核中实现却不是这么简单。除了要实现基本功能,还需要考虑很多复杂情况。内核的 RCU 系统可以说是内核最复杂系统之一,为了高性能和多核扩展性,它被设计了非常精巧的数据结构,还结合了预处理,批量处理,延后(异步)处理,多核并发,原子操作,异常处理,多场景精细优化等多种技术,也体现很多编程思想和代码设计思想,有一定的学习和参考价值。

想要打造一款以人为本,为用户提供更便捷、智能、安全的操作系统,我们保持着对各类新兴技术的关注与热情,RCU 具备的性能好,可扩展性强,稳定性强等特点,正符合鼎道智联想要打造 DingOS 的目标。合理运用 RCU 技术,就可以提高用户的响应速度、提升系统的稳定性和可靠性,从而给用户带来更安全、流畅的操作体验。如果你也认可我们的想法,有相同的目标,欢迎加入或关注鼎道生态。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/912693.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

解决Spring mvc + JDK17@Resource无法使用的情况

问题描述 我在使用jdk17进行Spring mvc开发时发现 Resource用不了了。 原因 因为JDK版本升级的改动,在Jdk9~17环境下,搭建Springboot项目,会出现原有Resource(javax.annotation.Resource)不存在的问题,导…

el-table动态合并单元格

el-table使用这个方法合并单元格&#xff0c;:span-method“hbcell” <el-table size"small" :data"table.data" border empty-text"暂无数据" :cell-style"cellStyle" :header-cell-style"tableHeaderColor":span-meth…

基于web的教务管理系统java jsp学校学生教师选课mysql源代码

本项目为前几天收费帮学妹做的一个项目&#xff0c;Java EE JSP项目&#xff0c;在工作环境中基本使用不到&#xff0c;但是很多学校把这个当作编程入门的项目来做&#xff0c;故分享出本项目供初学者参考。 一、项目描述 基于web的教务管理系统 系统有3权限&#xff1a;系统…

恒运资本:数据资产入表正式落地,产业化大时代开启,概念股狂欢!

数据要素产业化大时代降临&#xff0c;哪些上市公司有望获益&#xff1f; 8月22日早盘&#xff0c;医疗设备龙头联影医疗开盘跌落&#xff0c;盘中一度跌超15%&#xff0c;跌破发行价&#xff0c;盘中跌幅创该股上市以来单日新高。午间收盘&#xff0c;跌幅仍有13.72%&#xff…

RTSP/Onvif协议EasyNVR安防视频云平台配置录像阈值实现边删边录需求的具体操作步骤

EasyNVR是基于RTSP/Onvif协议的视频接入、处理及分发的安防视频云平台&#xff0c;可提供丰富且灵活的视频能力&#xff0c;包括&#xff1a;设备接入、实时视频直播、录像、云存储、录像回放与检索等功能&#xff0c;也能支持GB28181协议进行平台级联。 有很多用户咨询我们&am…

通达信指标公式16:使用BARSLAST函数写一个指标回测的思路

★★★★★博文原创不易&#xff0c;我的博文不需要打赏&#xff0c;也不需要知识付费&#xff0c;可以白嫖学习小技巧&#xff0c;喜欢的老铁可以多多帮忙点赞&#xff0c;小红牛在此表示感谢&#xff0c;就是对作者的最大支持。愿与诸君共勉&#xff0c;悟道于股市★★★★★…

2023中国算力大会,和鲸科技携手生态伙伴,推动算力创新发展与应用

8月18日至8月19日&#xff0c;由工业和信息化部、宁夏回族自治区人民政府共同主办的 2023 中国算力大会在宁夏银川举行。本届大会以“算领新产业潮流 力赋高质量发展”为主题&#xff0c;聚焦算力前沿技术领域&#xff0c;展示算力融合应用成果&#xff0c;推动算力产业加速发展…

QToolButton

QToolButton API使用方式 使用方法和功能跟QPushButton基本一致, 只不过在对于关联菜单这个功能点上, QToolButton类可以设置弹出的菜单的属性, 以及在显示图标的时候可以设置更多的样式, 可以理解为是一个增强版的QPushButton。 API / 构造函数 / QToolButton::QToolButton(…

C语言小练习(二)

&#x1f31e; “去努力吧&#xff0c;最坏的结果不过是大器晚成&#xff01;” Day02 &#x1f4dd; 一.选择题&#x1f4dd;二.编程题 &#x1f4dd; 一.选择题 1.&#x1f388;、以下程序段的输出结果是&#xff08; &#xff09; #include <stdio.h> int main() {…

蚂蚁区块链投票案例(一)---蚂蚁链简介

文章目录 摘要背景蚂蚁链简介联盟链&#xff08;合约体验链&#xff09;开放联盟链开发者测试链 总结遗留问题测试环境和生产环境的问题&#xff1f; 摘要 计划用三篇文章&#xff0c;一个月左右的时间来实现一个蚂蚁开放联盟链上的区块链投票案例&#xff0c;本文是系列第一篇…

设计模式(8)外观模式

一、 1、使用背景&#xff1a;降低访问复杂系统的内部子系统时的复杂度&#xff0c;简化客户端之间的接口。 2、定义&#xff1a; 为子系统中的一组接口定义一个一致的界面&#xff0c;此模式定义了一个高层接口&#xff0c;这个接口使得这一子系统更加容易使用。完美地体现…

恒运资本:科创板与创业板的区别?

近年来&#xff0c;跟着技能的飞速发展和立异认识的提高&#xff0c;科技立异成为了各国和企业竞相争夺的方向。在中国&#xff0c;“科创板”和“创业板”成为了人们重视的焦点。它们都是现代股票交易商场上的板块&#xff0c;但两者之间有何差异呢&#xff1f;下面从多个视点…

【allegro 17.4软件操作保姆级教程十一】表贴器件封装制作

&#x1f449;个人主页&#xff1a; highman110 &#x1f449;作者简介&#xff1a;一名硬件工程师&#xff0c;持续学习&#xff0c;不断记录&#xff0c;保持思考&#xff0c;输出干货内容 目录 封装组成元素 焊盘类型 表贴器件封装制作 环境设置 计算坐标 放置pin脚 …

pytorch基础实践-数据与预处理

文章目录 数据集Fashion-MNIST 数据集 数据预处理包的导入在Pytorch中进行 ETL利用torchvison包获取和处理数据集&#xff08;ET&#xff09; 访问数据集访问和查看 train_set 中的单个数据利用 DataLoader 成批访问数据 数据集 Fashion-MNIST 数据集 MNIST MNIST&#xff0c;…

day1 链表专题 牛客TOP100 BM 1-10

文章目录 链表BM1 反转链表BM2 链表内指定区间反转BM3 链表中的节点每k个一组翻转BM4 合并两个排序的链表BM5 合并k个已排序的链表BM6 判断链表中是否有环BM7 链表中环的入口结点BM8 链表中倒数最后k个结点BM9 删除链表的倒数第n个节点BM10 两个链表的第一个公共结点 链表 BM1…

ssm+vue绿色农产品推广应用网站源码和论文PPT

ssmvue绿色农产品推广应用网站041 开发工具&#xff1a;idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 技术&#xff1a;ssm 摘 要 21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高…

浅谈限流式保护器在电气线路火灾中的应用

安科瑞 华楠 电气线路起火的主要原因 1.线路短路 所谓短路就是交流电路的两根导线互相触碰&#xff0c;电流不经过线路中的用电设备&#xff0c;而直接形成回路。由于电线本身的电阻比较小&#xff0c;若仅是通过电线这个回路&#xff0c;电流就会急剧变大&#xff0c;比正常情…

HAProxy的配置与搭建

Haproxy概念 HAProxy是可提供高可用性、负载均衡以及基于TCP和HTTP应用的代理&#xff0c;是免费、快速并且可靠的一种解决方案。HAProxy非常适用于并发大&#xff08;并发量达1w以上&#xff09;web站点&#xff0c;这些站点通常又需要会话保持或七层处理。HAProxy的运行模式…

MySQL创建表报错

CREATE TABLE IF NOT EXISTS nhooo_b1 (nhooo_id INT UNSIGNED AUTO_INCREMENT,nhooo_title VARCHAR(100) NOT NULL,nhooo_author VARCHAR(40) NOT NULL,submission_date DATE,PRIMARY KEY (nhooo_id) ) ENGINEINNODB DEFAULT CHARSETutf8;创建表始终报以下错误&#xff1a; 这…

Linux操作系统调度基本准则和实现

今天分享一篇处理器调度相关的理论介绍文章。 1&#xff0c;基本概念 在多道程序系统中&#xff0c;进程的数量往往多于处理机的个数&#xff0c;进程争用处理机的情况就在所难免。处理机调度是对处理机进行分配&#xff0c;就是从就绪队列中&#xff0c;按照一定的算法&…