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表示每个层数最多支持多少个叶子数量