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

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

所以,Linux内核引入了读-拷贝-更新技术(英文是Read-copy update,简称RCU),它是另外一种同步技术,主要用来保护被多个CPU读取的数据结构。...RCU允许多个读操作和多个写操作并发执行。更重要的是,RCU是一种免算法,也就是说,它没有使用共享的或计数器保护数据结构(但是,这儿还是主要指的读操作是无算法。...进入RCU保护的临界代码段的内核控制路径不能休眠。 3 基本操作 对于reader,RCU的基本操作为: (1)调用rcu_read_lock(),进入RCU保护的临界代码段。...每个系统时间Tick,内核都会检查局部CPU是否处于空闲状态。...4 使用场合 RCU是从Linux2.6版本引入的,主要使用在网络层和虚拟文件系统层。

1.6K10

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

文章目录 一、RCU 机制适用场景 二、RCU 机制特点 三、使用 RCU 机制保护链表 一、RCU 机制适用场景 ---- 在上一篇博客 【Linux 内核 内存管理】RCU 机制 ① ( RCU 机制简介...| RCU 机制的优势与弊端 | RCU 机制的链表应用场景 ) 中 , 分析了 RCU 机制的优势与弊端 ; 优势 : RCU 的优势是 " 读者 " ( 读取共享数据的线程 ) 不需要承担同步开销..., 同步开销指的是 : ① 获取 " " , ② 执行 " 原子指令 " , ③ 执行 " 内存屏障 " ; 弊端 : 与此相对的 RCU 机制也有一定弊端 , " 写者 " ( 修改共享数据的线程...) 需要 承担很大的同步开销 , 其需要 ① 延迟对象释放 , ② 读取 并 复制 共享数据 , ③ 必须使用 互斥 机制 ; ④ 使用复杂 , 比其它互斥要复杂 ; RCU 机制 适用于 " 读者...) 性能要求很高 ; 三、使用 RCU 机制保护链表 ---- RCU 机制 除了保护 普通指针 指向的数据 之外 , 还可以用于 保护 " 链表 " 数据结构 ; Linux 内核中 , 提供了 一系列的

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

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 层次架构概念 | 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 层次架构每层最多叶子数

72210

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...(list_next_rcu(new->prev), new); new->next->prev = new; old->prev = LIST_POISON2; list_replace_rcu...(new->prev), new); new->next->prev = new; old->prev = LIST_POISON2; } 源码路径 : linux-5.6.18\include\...linux\rculist.h#198 二、链表操作时使用 smp_wmb() 函数保证代码执行顺序 ---- 编译器 和 CPU 优化 代码时 , 有时会将 代码执行顺序改变 , 在链表操作时 , 代码的执行顺序必须得到保证

72420

Linux内核28-自旋

如果内核控制路径发现自旋空闲,则申请加锁然后执行。相反,如果发现已经被其它CPU上的内核控制路径占用,它就会一直自旋,就是在循环查看是否已经释放,直到该被释放。...自旋的自旋过程就是一个忙等待的过程。也就是说,正在等待的内核控制路径正在浪费时间,因为什么也不干。...但是,大部分的内核资源加锁的时间可能仅为毫秒的几分之一,因此,释放CPU使用权再获取可能比一直等待更消耗时间。所以,自旋使用的场合就是,内核资源的占用时间一般比较短,且是多核系统的时候。...2 自旋结构实现 Linux内核系统中,自旋spinlock_t的实现主要使用了raw_spinlock_t结构,这个结构的实现,参考下面的代码: typedef struct raw_spinlock...raw_lock 表示自旋的状态,依赖于具体的架构实现。 break_lock 标志着进程正在忙等待(仅当内核同时支持SMP和内核抢占时才会出现)。 接下来,我们分析加锁的流程。

1.3K20

linux内核--自旋的理解

自旋:如果内核配置为SMP系统,自旋就按SMP系统上的要求来实现真正的自旋等待,但是对于UP系统,自旋仅做抢占和中断操作,没有实现真正的“自旋”。...在Linux内核中,自旋通常用于包含内核数据结构的操作,你可以看到在许多内核数据结构中都嵌入有spinlock,这些大部分就是用于保证它自身被操作的原子性,在操作这样的结构体时都经历这样的过程:上锁-...如果内核控制路径发现自旋“开着”(可以获取),就获取并继续自己的执行。...相反,如果内核控制路径发现由运行在另一个CPU上的内核控制路径“着”,就在原地“旋转”,反复执行一条紧凑的循环检测指令,直到被释放。...不过,自旋通常非常方便,因为很多内核资源只1毫秒的时间片段,所以等待自旋的释放不会消耗太多CPU的时间。

1.4K20

Linux内核30-读写自旋

1 读/写自旋概念 自旋解决了多核系统在内核抢占模式下的数据共享问题。但是,这样的自旋一次只能一个内核控制路径使用,这严重影响了系统的并发性能。...为此,Linux内核提出了读/写自旋的概念。也就是说,没有内核控制路径修改共享数据的时候,多个内核控制路径可以同时读取它。...如果有内核控制路径想要修改这个数据结构,它就请求读/写自旋的写自旋,独占访问这个资源。这大大提高了系统的并发性能。...(2)调用sev指令,唤醒正在执行WFE指令的内核控制路径。...通过上面的分析可以看出,读写自旋使用bit31表示写自旋,bit30-0表示读自旋,对于读自旋而言,绰绰有余了。

1.3K20

编程(五) - 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内核】二、中断屏蔽 1、中断屏蔽思想 中断屏蔽,正如其名,屏蔽掉CPU的中断响应功能,解决并发引起的竞态问题。 在进入临界区前屏蔽中断,这么做有什么好处,以及有什么弊端?...弊端在于: Linux内核中,除了系统进程调度依赖中断,还有一些异步I/O等众多操作都依赖中断,因此长时间屏蔽中断是很危险的,会对系统造成严重影响,因此也要求临界区代码要简短。...因此,并不能解决SMP多CPU引发的竞态 因此,单独使用中断屏蔽通常不是一种值得推荐的避免竞态的方法 2、Linux内核中断屏蔽的实现 2.1 Linux内核提供的API接口 关于中断屏蔽,Linux内核所提供的接口如下...3、总结 该篇文章,主要了解以下几点: 中断屏蔽的思想 中断屏蔽的好处与不足 Linux内核提供的中断屏蔽接口 中断屏蔽的基本汇编实现

40420

实时Linux内核的实现

目前Linux内核主线不支持软实时,而是使用下面2个仓库存放和Linux内核主线的版本对应的实时内核的源代码。...(4)正在执行RCU保护(调用函数rcu_read_lock()或rcu_read_lock_bh())的读端临界区,禁止内核抢占。 (5)正在执行自旋或读写保护的临界区。...(3)在实时内核中大多数禁止内核抢占的临界区可以变成可抢占的,为了兼顾非实时内核和实时内核,引入本地,非实时内核把本地映射到禁止内核抢占和禁止硬中断,实时内核把本地映射到使用实时互斥实现的自旋...= TASK_RUNNING) 31 wake_up_process(tsk); 32 } 7.解决RCU读端临界区不可抢占的问题 Linux内核支持3种RCU,如下。...互斥的定义如下,可以看到在实时内核中互斥等同于实时互斥。 include/linux/mutex.h #ifdef CONFIG_PREEMPT_RT # include #else ...

6K40

linux编程

CAS(Compare-and-Swap),如无栈,无队列等待 解析: 一、RCU RCULinux 2.6内核系统新的机制 RCU(Read-Copy Update)。...参考:http://www.ibm.com/developerworks/cn/linux/l-rcu/ 众所周知,为了保护共享数据,需要一些同步机制,如自旋(spinlock),读写...RCU并不是新的机制,它只是对Linux内核而言是新的。...早在二十世纪八十年代就有了这种机制,而且在生产系统中使用了这种机制,但这种早期的实现并不太好,在二十世纪九十年代出现了一个比较高效的实现,而在linux中是在开发内核2.5.43中引入该技术的并正式包含在...二、CAS 参考:透过 Linux 内核看无编程 非阻塞型同步的三种方案: Wait-free Wait-free 是指任意线程的任何操作都可以在有限步之内结束,而不用关心其它线程的执行速度。

2.6K10

Linux内核中的各种:信号量互斥读写原子自旋内存屏障等

使用实例如下: #include // 定义自旋 spinlock_t my_lock; void my_function(void) { spin_lock...为了支持内核抢占,内核引入了preempt_count字段,该计数初始值为0,每当使用时+1,释放时-1。...四、RCU机制/内存屏障 — —内存 RCU机制是read copy update,即读 复制 更新。...和读写一样,RCU机制也是允许多个读者同时读,但更新数据的时候,需要先复制一份副本,在副本上完成修改,然后再一次性地替换旧数据。...所以RCU机制的核心有两个:1)复制后更新;2)延迟回收内存 有RCU机制的话,读写就不需要做同步,也不会发生读写竞争了,因为读者是对原来的数据进行读,而写者是对拷贝出来的那份内存进行修改,读写可以并行

29110

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

联系方式: mail:scxby@163.com 微信:linux-kernel 一、RCU有什么用? RCU主要用于对性能要求苛刻的并行实时计算。例如:天气预报、模拟核爆炸计算、内核同步等等。...此外,可抢占环境的RCU实现需要读者实际做点什么事情(也就是在读临界区内,禁止抢占。这是Linux经典RCU的实现)。...它于2002年10月引入Linux内核RCU允许读操作可以与更新操作并发执行,这一点提升了程序的可扩展性。...(&p->list, &head); RCU发布链表 第15行必须用某些同步机制(最常见的是各种)来保护,防止多核list_add()实例并发执行。...不过,同步并不能阻止list_add()的实例RCU的读者并发执行。 订阅一个受RCU保护的链表的代码非常直接。

5.2K10
领券