Linux 内核 内存管理RCU 机制 ② ( RCU 机制适用场景 | RCU 机制特点 | 使用 RCU 机制保护链表 )
Posted 韩曙亮
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux 内核 内存管理RCU 机制 ② ( RCU 机制适用场景 | RCU 机制特点 | 使用 RCU 机制保护链表 )相关的知识,希望对你有一定的参考价值。
文章目录
一、RCU 机制适用场景
在上一篇博客 【Linux 内核 内存管理】RCU 机制 ① ( RCU 机制简介 | RCU 机制的优势与弊端 | RCU 机制的链表应用场景 ) 中 , 分析了 RCU 机制的优势与弊端 ;
优势 : RCU 的优势是 " 读者 " ( 读取共享数据的线程 ) 不需要承担同步开销 ,
同步开销指的是 : ① 获取 " 锁 " , ② 执行 " 原子指令 " , ③ 执行 " 内存屏障 " ;
弊端 : 与此相对的 RCU 机制也有一定弊端 , " 写者 " ( 修改共享数据的线程 ) 需要 承担很大的同步开销 , 其需要
① 延迟对象释放 ,
② 读取 并 复制 共享数据 ,
③ 必须使用 互斥锁 机制 ;
④ 使用复杂 , 比其它互斥锁要复杂 ;
RCU 机制 适用于 " 读者 " ( 读取共享数据的线程 ) 性能要求高的场景 ;
二、RCU 机制特点
RCU 机制 只能 保护 " 动态分配 “ 的 ” 共享数据结构 " , 该 共享数据 必须 通过指针访问 ,
这里的 动态分配 指的是 使用 malloc
, calloc
等内存申请函数 , 申请的数据结构 , 不是栈内存数据结构 ;
RCU 机制保护的 " 临界区 " ( 函数代码块 ) 中 , 不能执行耗时操作 , 尤其是 不能有 sleep
休眠操作 ;
读写不对称 : RCU 机制 读写不对称 , " 写者 “ ( 修改共享数据的线程 ) 性能不作要求 , 可以高也可以低 , 但是 ” 读者 " ( 读取共享数据的线程 ) 性能要求很高 ;
三、使用 RCU 机制保护链表
RCU 机制 除了保护 普通指针 指向的数据 之外 , 还可以用于 保护 " 链表 " 数据结构 ;
Linux 内核中 , 提供了 一系列的 标准函数 , 可以 使用 " RCU 机制 " 保护 " 双链表 " ;
标准链表元素 : 使用 RCU 机制 保护 的 链表 , 链表中的 标准 元素 , 仍然可以使用 ;
标准函数 RCU 变体 : 遍历 , 修改 , 删除 链表元素 时 , 需要调用 标准函数的 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() 函数保证代码执行顺序 )