DAY11-RCU机制

RCU机制

RCU英文全称为Read-Copy-Update,顾名思义就是“读-拷贝-更新”, 是Linux内核中重要的同步机制。LInux内核已有原子操作、读写信号量等锁机制,

RCU记录所有指向共享数据的指针的使用者,当要修改改共享数据时,首先创建一个副本,在副本修改。所有读访问线程都离开读临界区之后,指针指向新的修改后副本的指针,并且删除旧数据。

RCU机制及特点

1.RCU重要的应用场景是链表,有效的提高遍历读取数据的效率,读取链表成员数据时通常只需要rcu_read_locak(),允许多个线程同时读取链表,而且允许一个线程同时修改链表。

RCU的意思就是读-复制-更新,他是根据原理命名,写着修改对象的流程为:首先复制生成一个副本,然后更新此副本,最后使用新对象替换旧的对象。在写者执行复制更新的时候,读者可以读数据信息。

写者删除对象,必须等待所有访问被删除对象读者访问结束的时候,才能执行销毁操作实现。

RCU优势是读者没有任何同步开销,不需要获取任何锁。不需要执行原子指令,也不需要执行内存屏障。但是写者的同步开销比较大,写着需要延迟对象的释放、复制被修改的对象,写者之间必须使用锁互斥操作方法

RCU经常用于读者性能要求比较高的场景。RCU只能保护动态分配的数据结构,·必须是通过指针访问此数据结构,受RCU保护的临街区内不能slepp;读写部队称,对写者的性能没有特别的要求,但是读者性能要求比较高。

缺点写者同步开销大,写者之间需要互斥处理操作,在应用的时候比其他机制更为复杂。

链表操作

RCU能保护的不仅是一般的指针。Linux内核提供标准函数,使能通过RCU机制保护双链表,这是RCU机制在Linux内核内部最重要的应用。

有关通过RCU保护的链表,优势在于可使用标准的链表元素,。只有在遍历链表、修改和删除链表元素时,必须调用标准函数的RCU变体

RCU模式添加链表项,具体内码如下

RCU模式删除链表项

 

 

RCU模式更新链表项

在整个操作过程当中,有时要防止编译器和CPU优化代码执行的顺序。smp_wmb()保证在它之前的两行代码执行完毕之后再执行后两行代码

RCU层次架构

RCU根据CPU数量的大小按照树形结构来组成其层次结构,称为RCU Hierarchy。

RCU层次结构根据CPU数量决定,内核中有宏帮助构建RCU层次架构。

其中CONFIG_RCU_FANOUT_LEAF表示一个子叶子的CPU数量

CONFIG_RCU_FANOUT表示每个层数最多支持多少个叶子数量

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值