文章目录

  • 一、RCU 机制
  • 二、RCU 机制的优势与弊端
  • 三、RCU 机制的链表应用场景

一、RCU 机制


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

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

RCU 机制 :

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

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

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

二、RCU 机制的优势与弊端


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

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

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

① 延迟对象释放 ,

② 读取 并 复制 共享数据 ,

③ 必须使用 互斥锁 机制 ;

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


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

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

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

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

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

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

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

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

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

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

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

    文章目录 一.RCU 机制适用场景 二.RCU 机制特点 三.使用 RCU 机制保护链表 一.RCU 机制适用场景 在上一篇博客 [Linux 内核 内存管理]RCU 机制 ① ( RCU 机制简介 ...

  2. linux 内核内存管理

    物理内存 相关数据结构 page(页) Linux 内核内存管理的实现以 page 数据结构为核心,其他的内存管理设施都基于 page 数据结构,如 VMA 管理.缺页中断.RMAP.页面分配与回收等 ...

  3. pae扩展内存 linux,浅析linux内核内存管理之PAE

    浅析linux内核内存管理之PAE 早期Intel处理器从80386到Pentium使用32位物理地址,理论上,这样可以访问4GB的RAM.然而,大型服务器需要大于4GB的RAM来同时运行数以千计的进 ...

  4. Linux内核内存管理(3):kmemcheck介绍

    Linux内核内存管理 kmemcheck介绍 rtoax 2021年3月 在英文原文基础上,针对中文译文增加5.10.13内核源码相关内容. 5.10.13不存在kmemcheck的概念,取代的是k ...

  5. Linux内核内存管理(2):固定映射地址(fixmap)和输入输出重映射(ioremap)

    Linux内核内存管理 固定映射地址(fixmap)和输入输出重映射(ioremap) rtoax 2021年3月 在英文原文基础上,针对中文译文增加5.10.13内核源码相关内容. Print ke ...

  6. Linux内核内存管理:地址转换和MMU

    地址转换和MMU 虚拟内存是一个概念,是给进程的一种错觉,因此它认为自己拥有巨大的.几乎无限的内存,有时甚至比系统实际拥有的内存还要多.每次访问内存位置时,由CPU将虚拟地址转换为物理地址.这种机制称 ...

  7. 【Linux 内核 内存管理】虚拟地址空间布局架构 ③ ( 内存描述符 mm_struct 结构体成员分析 | mmap | mm_rb | task_size | pgd | mm_users )

    文章目录 一.mm_struct 结构体成员分析 1.mmap 成员 2.mm_rb 成员 3.get_unmapped_area 函数指针 4.task_size 成员 5.pgd 成员 6.mm_ ...

  8. 【Linux 内核 内存管理】内存管理架构 ④ ( 内存分配系统调用过程 | 用户层 malloc free | 系统调用层 brk mmap | 内核层 kmalloc | 内存管理流程 )

    文章目录 一.内存分配系统调用过程 ( 用户层 | 系统调用 | 内核层 ) 二.内存管理流程 一.内存分配系统调用过程 ( 用户层 | 系统调用 | 内核层 ) " 堆内存 " ...

  9. 【Linux 内核 内存管理】内存管理架构 ② ( 用户空间内存管理 | malloc | ptmalloc | 内核空间内存管理 | sys_brk | sys_mmap | sys_munmap)

    文章目录 一.用户空间内存管理 ( malloc / free / ptmalloc / jemalloc / tcmalloc ) 二.内核空间内存管理 1.内核内存管理系统调用 ( sys_brk ...

  10. 【Linux 内核 内存管理】优化内存屏障 ③ ( 编译器屏障 | 禁止 / 开启内核抢占 与 方法保护临界区 | preempt_disable 禁止内核抢占源码 | 开启内核抢占源码 )

    文章目录 一.禁止 / 开启内核抢占 与 方法保护临界区 二.编译器优化屏障 三.preempt_disable 禁止内核抢占 源码 四.preempt_enable 开启内核抢占 源码 一.禁止 / ...

最新文章

  1. 微软开源NAS算法Petridish,提高神经网络迁移能力
  2. python爬虫赚钱的经历-聊一聊,这些年我用Python爬虫挣钱的那些事
  3. Debug pip: Could not build wheels for _ which use PEP 517 and cannot be installed directly - Easy So
  4. 在Spring MVC Web应用程序中使用reCaptcha
  5. 第一阶段 03Java的基本数据类型
  6. android pdf阅读器开发_如何在 Windows 10 中将 Firefox 设置为默认 PDF 阅读器
  7. 访问不了firefox附加组件页面怎么办
  8. C/C++如何读取整行字符串
  9. 关于图书管理系统项目的大概思路
  10. ios弱网测试_弱网测试方法整理
  11. 2339: [HNOI2011]卡农
  12. PID调节规律各自的特点
  13. 小程序:选举投票问题未知行数输入问题(含代码)
  14. VBA-自动筛选符合条件的数据
  15. 有没有可以测试充电宝电流电压的软件,USB测试仪 移动电源电流电压容量检测 充电宝充电器测试老化工具...
  16. [EULAR文摘] 滑膜HIF-1a与类风湿关节炎的关节破坏
  17. 小草 李白 《菩萨蛮》
  18. 如何提取伴奏?1分钟让你知道伴奏提取软件手机版有哪些
  19. 郴州职高哪个学计算机好,2021湖南郴州有什么职高学校
  20. 友盟受访页面_调整我们如何询问受访者的性别

热门文章

  1. Android 7.0 多窗口模式
  2. Hadoop源码阅读-HDFS-day2
  3. JavaScript对象理解
  4. 技术人的标准——简历模板
  5. 伪装qizhi software数字签名的下载者分析报告
  6. Bit,Byte,Word,Dword,Qword
  7. PHP安装swoole扩展
  8. async/await工作机制探究--NodeJS
  9. 【模拟】【贪心】POJ2709Painter
  10. .net core 项目文件结构浅析