首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linux 内核 内存管理】RCU 机制 ② ( RCU 机制适用场景 | RCU 机制特点 | 使用 RCU 机制保护链表 )

文章目录 一、RCU 机制适用场景 二、RCU 机制特点 三、使用 RCU 机制保护链表 一、RCU 机制适用场景 ---- 在上一篇博客 【Linux 内核 内存管理】RCU 机制 ① ( RCU 机制简介...) 需要 承担很大的同步开销 , 其需要 ① 延迟对象释放 , ② 读取 并 复制 共享数据 , ③ 必须使用 互斥锁 机制 ; ④ 使用复杂 , 比其它互斥锁要复杂 ; RCU 机制 适用于 " 读者...动态分配 指的是 使用 malloc , calloc 等内存申请函数 , 申请的数据结构 , 不是栈内存数据结构 ; RCU 机制保护的 " 临界区 " ( 函数代码块 ) 中 , 不能执行耗时操作...) 性能要求很高 ; 三、使用 RCU 机制保护链表 ---- RCU 机制 除了保护 普通指针 指向的数据 之外 , 还可以用于 保护 " 链表 " 数据结构 ; Linux 内核中 , 提供了 一系列的...标准函数 , 可以 使用 " RCU 机制 " 保护 " 双链表 " ; 标准链表元素 : 使用 RCU 机制 保护 的 链表 , 链表中的 标准 元素 , 仍然可以使用 ; 标准函数 RCU 变体

89330

Linux RCU 机制详解

1、简介: RCU(Read-Copy Update)是数据同步的一种方式,在当前的Linux内核中发挥着重要的作用。...RCU主要针对的数据对象是链表,目的是提高遍历读取数据的效率,为了达到目的使用RCU机制读取数据的时候不对链表进行耗时的加锁操作。...3、相应资料: Linux内核源码当中,关于RCU的文档比较齐全,你可以在 /Documentation/RCU/ 目录下找到这些文件。 Paul E....McKenney 是内核中RCU源码的主要实现者,他也写了很多RCU方面的文章。他把这些文章和一些关于RCU的论文的链接整理到了一起。...4.2 订阅——发布机制: 当前使用的编译器大多会对代码做一定程度的优化,CPU也会对执行指令做一些优化调整,目的是提高代码的执行效率,但这样的优化,有时候会带来不期望的结果。

3.5K40
您找到你想要的搜索结果了吗?
是的
没有找到

Linux 内核 内存管理】RCU 机制 ① ( RCU 机制简介 | RCU 机制的优势与弊端 | RCU 机制的链表应用场景 )

文章目录 一、RCU 机制 二、RCU 机制的优势与弊端 三、RCU 机制的链表应用场景 一、RCU 机制 ---- RCU , 英文全称是 " Read-Copy-Update “ , 对应的中文名称是...” 读取-拷贝-更新 “ , 这是 Linux 内核中的 ” 同步机制 " ; Linux 内核中还有其它同步机制 , 如 " 原子操作 " , " 读写信号量 " 等 " 锁机制 " ; RCU 机制...机制的优势与弊端 ---- RCU 的优势是 " 读者 " ( 读取共享数据的线程 ) 不需要承担同步开销 , 同步开销指的是 : ① 获取 " 锁 " , ② 执行 " 原子指令 " , ③ 执行..." 内存屏障 " ; 与此相对的 RCU 机制也有一定弊端 , " 写者 " ( 修改共享数据的线程 ) 需要 承担很大的同步开销 , 其需要 ① 延迟对象释放 , ② 读取 并 复制 共享数据 , ③...必须使用 互斥锁 机制 ; 三、RCU 机制的链表应用场景 ---- RCU 机制 可以极大地 提高 " 链表 " 数据结构的 读取效率 , 多个线程 同时读取 链表 时 , 使用 rcu_read_lock

1.7K20

Linux 内核 内存管理】RCU 机制 ④ ( RCU 模式下更新链表项 list_replace_rcu 函数 | 链表操作时使用 smp_wmb() 函数保证代码执行顺序 )

文章目录 一、RCU 模式下更新链表项 list_replace_rcu 函数 二、链表操作时使用 smp_wmb() 函数保证代码执行顺序 一、RCU 模式下更新链表项 list_replace_rcu...函数 ---- 在 Linux 源码 linux-5.6.18\include\linux\rculist.h 头文件中定义的就是 RCU 链表的操作 , 其中定义的 static inline void...(new->prev), new); new->next->prev = new; old->prev = LIST_POISON2; } 源码路径 : linux-5.6.18\include\...linux\rculist.h#198 二、链表操作时使用 smp_wmb() 函数保证代码执行顺序 ---- 编译器 和 CPU 优化 代码时 , 有时会将 代码执行顺序改变 , 在链表操作时 , 代码的执行顺序必须得到保证..., 否则会得到不可预知的结果 ; 使用 smp_wmb() 函数 , 可以保证该函数 前两行 的代码 执行完毕后 , 再执行后两行的代码 ;

74420

Linux 内核 内存管理】RCU 机制 ⑤ ( RCU 层次架构概念 | RCU 层次架构源码解析 | RCU 层次架构每层最多叶子数 | RCU 层次架构每个叶子 CPU 数量 )

文章目录 一、RCU 层次架构概念及源码 二、RCU 层次架构源码解析 1、RCU 层次架构每层最多叶子数 2、RCU 层次架构每个叶子 CPU 数量 一、RCU 层次架构概念及源码 ---- RCU...机制 中 , 会 根据 CPU 数量 , 按照 " 树形结构 “ 组成 RCU 层次架构 , 称为 ” RCU Hierarchy " ; 在 Linux 源码 linux-5.6.18\include...\linux\rcu_node_tree.h 头文件中定义了 RCU 层次架构 , RCU 层次架构 源码 : /* * Define shape of hierarchy based on NR_CPUS..._4 (RCU_FANOUT_3 * RCU_FANOUT) 源码路径 : linux-5.6.18\include\linux\rcu_node_tree.h#31 二、RCU 层次架构源码解析...---- " RCU 层次架构 “ 是 根据 ” CPU 数量 " 确定的 , 在 Linux 内核源码中 , 通过各种 " 宏定义 “ 构建 ” RCU 层次架构 " , 1、RCU 层次架构每层最多叶子数

74310

深入理解 LinuxRCU 机制

RCU(Read-Copy Update),是 Linux 中比较重要的一种同步机制。...RCU 的一个典型的应用场景是链表,在 Linux kernel 中还专门提供了一个头文件(include/linux/rculist.h),提供了利用 RCU 机制对链表进行增删查改操作的接口。...(list_next_rcu(prev), new); next->prev = new;}list_next_rcu() 函数中的 rcu 是一个供代码分析工具 Sparse 使用的编译选项...,规定有 rcu 标签的指针不能直接使用,而需要使用 rcu_dereference() 返回一个受 RCU 保护的指针才能使用。...因此上一节 “增加链表项” 中提到的 “__rcu” 编译选项强制检查是否使用 rcu_dereference() 访问受 RCU 保护的数据,实际上是为了让代码拥有更好的可移植性。

13.3K52

Linux内核32-读-拷贝-更新(RCU

所以,Linux内核引入了读-拷贝-更新技术(英文是Read-copy update,简称RCU),它是另外一种同步技术,主要用来保护被多个CPU读取的数据结构。...RCU允许多个读操作和多个写操作并发执行。更重要的是,RCU是一种免锁算法,也就是说,它没有使用共享的锁或计数器保护数据结构(但是,这儿还是主要指的读操作是无锁算法。...2 RCU实现 既然RCU没有使用共享数据结构,那么它是如何神奇地实现同步技术的呢?其核心思想就是限制RCU使用范围: 只有动态分配的、通过指针进行访问的数据结构。...尤其是当使用了自旋锁保护RCU禁止多个写操作的并发访问的时候。 (3)调用synchronize_rcu,等待所有的读操作都离开临界代码段,完成同步。...4 使用场合 RCU是从Linux2.6版本引入的,主要使用在网络层和虚拟文件系统层。

1.6K10

谢宝友:深入理解RCU之六:分级RCU基础

1、准备工作 本文基于linux 2.6.32-rc7版本的源码, 因此请准备一份linux2.6.32-rc7代码。建议用如下两种方法获取源代码: 1、直接在linux.org上面下载源码包。...2、使用git从linux-next拉取最新代码,然后使用git checkout -b linux-2.6.32-rc7 v2.6.32-rc7检出2.6.32-rc7版本的源码。...这削弱了LINUX节能的能力。 2.3. RCU 迫切要解决的问题 实时RCU迫切要解决的问题列表如下: 1. 延迟销毁。...无条件的read-to-write提升,在LINUX内核中,有几个地方需要这样使用。 8. 兼容的API。 9. 抢占RCU读端临界区的要求可以被去掉。 10....在某些地方,在可抢占RCU实现中使用分级是有必要的。 后续章节将继续分析分级RCU的代码,以及Linux中其他一些RCU的实现。也许还会讨论实现RCU这类复杂并行软件的开发方法及其形式化验证。

49310

谢宝友: 深入理解RCU之七:分级RCU实现

在某些LINUX版本的经典RCU中,这一对字段可能是一个布尔变量。这个字段由根rcu_node 结构的锁进行保护。但是频繁的在没有这个锁保护的情况下访问(但是不修改)。...这个字段由根rcu_node的->lock锁进行保护,但是有时不使用锁访问它(但是不修改它)。...这个字段由根rcu_node保护,但是有时不使用这个锁而直接访问(但不修改)。...其他层的节点使用类似的方法进行计算,但是使用RCU_FANOUT_SQ代替 RCU_FANOUT。 随后第28行计算所有层的总和,结果是rcu_node结构的数量加上rcu_data的数量。...(由于篇幅关系,后面的无法贴下,关心原文的,请直接联系谢宝友老师) "Linux阅码场"是专业的Linux及系统软件技术交流社区,Linux系统人才培养基地,企业和Linux人才的连接枢纽。

3K20

谢宝友: 深入理解 Linux RCU 之从硬件说起

对于想要理解RCU的软件工程师来说,也需要具备一定的硬件基础。 作者简介:谢宝友,在编程一线工作已经有20年时间,其中接近10年时间工作于Linux操作系统。...该书作者Paul E.McKeney是IBM Linux中心领导者,Linux RCU Maintainer。...《深入理解RCU》系列文章整理了Paul E.McKeney的相关著作,希望能帮助读者更深刻的理解Linux内核中非常难于理解的模块----RCU。...当然,这个硬件计数值主要是在power架构上有效,笔者在powerpce500架构上经常使用它。第3-8行的循环,记录变量在当前CPU上保持的时间长度。...因为这通常是由于几个CPU使用缓存通信造成的(例如,一个用于互斥算法的锁使用这个数据项在CPU之间进行通信)。 很明显,所有CPU必须小心的维护数据的一致性视图。

4.4K31

RCU锁原理与实现

Linux内核有多种锁机制,比如 自旋锁、信号量 和 读写锁 等。不同的场景使用不同的锁,如在读多写少的场景可以使用读写锁,而在锁粒度比较小的场景可以使用自旋锁。...由于线程3、线程4和线程6使用的是新数据(已经被替换成新的指针),所以不需要等到它们。 由于 RCU 的读者需要禁止抢占,所以对于 RCU 来说,宽限期 是所有CPU都进行一次用户态调度的时间。...RCU 使用 本文使用的是Linux2.6.0版本的内核。...RCU 读者 要做Linux内核中使用 RCU,读者需要使用 rcu_read_lock() 来对临界区进行 “上锁”,本质上 rcu_read_lock() 就是禁止CPU进行抢占,如下代码: #define...rcu_read_lock() preempt_disable() // 禁止抢占 当不再引用数据时,需要使用 rcu_read_unlock() 对临界区进行 “解锁”,本质上 rcu_read_unlock

6.3K52

谢宝友:深入理解 Linux RCU 从硬件说起之内存屏障

这不是一篇单独的文章,这是《谢宝友:深入理解Linux RCU》系列的第2篇,前序文章:《谢宝友:深入理解 Linux RCU 从硬件说起之内存屏障》 作者简介:谢宝友,在编程一线工作已经有20年时间...,其中接近10年时间工作于Linux操作系统。...该书作者Paul E.McKeney是IBM Linux中心领导者,Linux RCU Maintainer。...《深入理解RCU》系列文章整理了Paul E.McKeney的相关著作,希望能帮助读者更深刻的理解Linux内核中非常难于理解的模块----RCU。...4、内存屏障的传递性,这是Linux系统中比较微妙而难于理解的概念。 5、单核架构中的屏障,是为了解决什么问题?怎么使用? 6、屏障在内核同步原语中的使用,满足了什么样的同步原语语义?

6.9K44

并发和Read-copy update(RCU)

简介 在上一篇文章中的并发和ABA问题的介绍中,我们提到了要解决ABA中的memory reclamation问题,有一个办法就是使用RCU。...RCU(Read-copy update)是一种同步机制,并在2002年被加入了Linux内核中。它的优点就是可以在更新的过程中,运行多个reader进行读操作。...CopyOnWriteArrayList和CopyOnWriteArraySet中的COW使用在遍历的时候。...我们知道使用Iterator来遍历集合的时候,是不允许在Iterator外部修改集合的数据的,只能在Iterator内部遍历的时候修改,否则会抛出ConcurrentModificationException...处理这个问题就需要用到对象生命周期的跟踪技术,也就是RCU中的RCU-sync。 所以RCU和COW的关系就是:RCU是由RCU-sync和COW两部分组成的。

2.2K20

谢宝友:深入理解 RCU 之概念

本文简介本文介绍Linux RCU的基本概念。...这不是一篇单独的文章,这是《谢宝友:深入理解Linux RCU》系列的第3篇,前序文章:谢宝友: 深入理解Linux RCU之一——从硬件说起= 谢宝友:深入理解Linux RCU:从硬件说起之内存屏障作者简介...此外,可抢占环境的RCU实现需要读者实际做点什么事情(也就是在读临界区内,禁止抢占。这是Linux经典RCU读锁的实现)。...例如,将rcu_assign_pointer()和rcu_dereference()原语嵌入在Linux链表的RCU变体中。...Linux的其他链表、哈希表都是线性链表,这意味着它的头结点只需要一个指针,而不是象循环链表那样需要两个。因此哈希表的使用可以减少哈希表的hash bucket数组一半的内存消耗。

5.4K10

无锁编程(五) - RCU(Read-Copy-Update)

RCU(Read-Copy Update) RCU就是指读-拷贝修改,它是基于其原理命名的。...对于被RCU保护的共享数据结构,读操作不需要获得任何锁就可以访问,但写操作在访问它时首先拷贝一个副本,然后对副本进行修改,最后在适当的时机把指向原来数据的指针重新指向新的被修改的数据。...Linux内核中内存管理大量的运用到了RCU机制。为每个内存对象增加了一个原子计数器用来继续该对象当前访问数。当没有其他进程在访问该对象时(计数器为0),才允许回收该内存。...从这个流程可以看出,RCU类似于一种读写锁的优化,用于解决读和写之间的同步问题。比较适合读多,写少的情况,当写操作过多的时候,这里的拷贝和修改的成本同样也很大。.../lockfree_rcu product begin ************************consumed world, index1, self 1395513088 *********

1.6K70

实时Linux内核的实现

目前Linux内核主线不支持软实时,而是使用下面2个仓库存放和Linux内核主线的版本对应的实时内核的源代码。...(1)Linux内核使用虚拟内存,对用户空间的内存(包括栈、代码段、数据段以及使用函数malloc()或mmap()动态分配的内存)使用惰性分配的策略,如果实时进程访问的虚拟页没有映射到物理页,那么会触发页错误异常...实时内核强制开启可抢占RCU的配置宏CONFIG_PREEMPT_RCUrcu_read_lock()、rcu_read_unlock()和call_rcu()这些函数使用可抢占RCU实现,所以使用rcu_read_lock...如果读端临界区绝对不能被抢占,那么应该使用不可抢占RCU提供的函数rcu_read_lock_sched()和rcu_read_unlock_sched()保护临界区,函数rcu_read_lock_sched...RCU-bh使用函数rcu_read_lock_bh()和rcu_read_unlock_bh()保护读端临界区,rcu_read_lock_bh()等价于“rcu_read_lock() + 禁止软中断

6.2K40
领券