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

Posted 韩曙亮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux 内核 内存管理RCU 机制 ① ( RCU 机制简介 | RCU 机制的优势与弊端 | RCU 机制的链表应用场景 )相关的知识,希望对你有一定的参考价值。

文章目录





一、RCU 机制



RCU , 英文全称是 " Read-Copy-Update “ , 对应的中文名称是 ” 读取-拷贝-更新 “ , 这是 Linux 内核中的 ” 同步机制 " ;

Linux 内核中还有其它同步机制 , 如 " 原子操作 " , " 读写信号量 " " 锁机制 " ;


RCU 机制 :

① 记录指针 : RCU 会 记录 所有的 指向 " 共享数据 " 的 指针 ;

② 修改数据 ( 读取-拷贝 操作 ) : 如果 " 指针持有者 “ 修改该 ” 共享数据 " , 需要先 创建一个共享数据 " 副本 " , 然后在副本中修改 ;

③ 更新数据 ( 更新操作 ) : 只需要读取 " 共享数据 " 的线程 , 离开 " 读临界区 " 后 , 指向原来 " 共享数据 " 的 指针 重新指向 " 副本 " , 然后再删除原来的 " 共享数据 " ;





二、RCU 机制的优势与弊端



RCU 的优势是 " 读者 " ( 读取共享数据的线程 ) 不需要承担同步开销 ,

同步开销指的是 : ① 获取 " 锁 " , ② 执行 " 原子指令 " , ③ 执行 " 内存屏障 " ;


与此相对的 RCU 机制也有一定弊端 , " 写者 " ( 修改共享数据的线程 ) 需要 承担很大的同步开销 , 其需要

① 延迟对象释放 ,

② 读取 并 复制 共享数据 ,

③ 必须使用 互斥锁 机制 ;





三、RCU 机制的链表应用场景



RCU 机制 可以极大地 提高 " 链表 " 数据结构的 读取效率 ,

多个线程 同时读取 链表 时 , 使用 rcu_read_lock() 即可 ,

在多线程读取的同时还允许有 1 1 1 个线程修改 链表 ;


RCU 机制 就是 " 读取-拷贝-更新 " ,

上述 " 写线程 " 修改 " 链表 " 数据结构 的流程如下 :

① 首先 , 读取 链表数据 内容 ;

② 然后 , 拷贝 链表数据 到一个 " 副本 " 中 ;

③ 最后 , 更新 数据 , 将 " 链表 " 的指针 指向 拷贝的 " 副本 " 中 , 删除 原始链表数据 ;


如果 " 写线程 " 删除 " 链表 " 数据结构 , 需要 等待 所有 访问该 链表的 线程 访问结束 , 即 释放该链表指针 , 之后才能销毁该链表 ;

以上是关于Linux 内核 内存管理RCU 机制 ① ( RCU 机制简介 | RCU 机制的优势与弊端 | RCU 机制的链表应用场景 )的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

Linux 内核 内存管理RCU 机制 ③ ( RCU 模式下添加链表项 list_add_rcu 函数 | RCU 模式下删除链表项 list_del_rcu 函数 )

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

linux内核源码分析之内存屏障和RCU机制