什么是RCU?

RCU(Read-Copy Update),顾名思义就是读-拷贝-修改,它是基于其原理命名的。对于被RCU保护的共享数据结构,读者不需要获得任何锁就可以访问它,但写者在访问它时首先拷贝一个副本,然后对副本进行修改,最后使用一个回调(callback)机制在适当的时机把指向原来数据的指针替换为新的被修改的数据。这个时机就是所有引用该数据的CPU都退出对共享数据的访问。

RCU的优点?

在面对内核中需要频繁读但是不需要频繁写的共享数据时,RCU是一种非常成功的同步机制。可以实现多线程无阻塞地读取数据,就算有线程在修改数据时读者也不会被阻塞,且读取数据的时候几乎没有额外的同步开销,同时也能排除当我们在读的时候某人正在修改数据的可能(否则的话会导致读取数据的线程可能读到更新一半的数据或者是读到一个无效的指针等等)。

RCU的缺点?

RCU的缺点在于,(1)RCU的读者可能访问旧数据,或者发现数据不一致。RCU不保证在写线程开始之后的读线程可以读取到更新后的数据,只能保证读取到的数据是旧数据或新数据,而不是修改一半的错误数据。(2)写者的性能比较糟糕。

如何确定将旧数据替换为新数据的时机?

这是RCU实现的关键。难点就在于如何判断所有的读者已经完成访问。通常把写者开始更新,到所有读者完成访问这段时间叫做宽限期(Grace Period)。

static inline void __rcu_read_lock(void)
{
preempt_disable();
} static inline void __rcu_read_unlock(void)
{
preempt_enable();
}

线程在进入RCU读临界区时关闭了抢占,在离开读临界区时打开抢占, 这时是否度过宽限期的判断就比较简单:每个CPU都经过一次抢占。

每个CPU在时钟中断的处理函数中,都会判断当前CPU是否完成了抢占。

void rcu_check_callbacks(int cpu, int user)
{
......
if (user || rcu_is_cpu_rrupt_from_idle()) {
/*在用户态上下文,或者idle上下文,说明已经发生过抢占*/
rcu_sched_qs(cpu);
rcu_bh_qs(cpu);
} else if (!in_softirq()) {
/*仅仅针对使用rcu_read_lock_bh类型的rcu,不在softirq,
*说明已经不在read_lock关键区域*/
rcu_bh_qs(cpu);
}
rcu_preempt_check_callbacks(cpu);
if (rcu_pending(cpu))
invoke_rcu_core();
......
}

然后向RCU汇报,该CPU已经离开了读临界区。

Linux中的RCU机制的更多相关文章

  1. LINUX中的RCU机制的分析

    RCU机制是Linux2.6之后提供的一种数据一致性访问的机制,从RCU(read-copy-update)的名称上看,我们就能对他的实现机制有一个大概的了解,在修改数据的时候,首先需要读取数据,然后 ...

  2. 浅谈Linux中的信号处理机制(二)

    首先谢谢 @小尧弟 这位朋友对我昨天夜里写的一篇<浅谈Linux中的信号处理机制(一)>的指正,之前的题目我用的“浅析”一词,给人一种要剖析内核的感觉.本人自知功力不够,尚且不能对着Lin ...

  3. Linux中的保护机制

    Linux中的保护机制 在编写漏洞利用代码的时候,需要特别注意目标进程是否开启了NX.PIE等机制,例如存在NX的话就不能直接执行栈上的数据,存在PIE 的话各个系统调用的地址就是随机化的. 一:ca ...

  4. 再谈Linux内核中的RCU机制

    转自:http://blog.chinaunix.net/uid-23769728-id-3080134.html RCU的设计思想比较明确,通过新老指针替换的方式来实现免锁方式的共享保护.但是具体到 ...

  5. Linux中的RCU的那点事

      原文:https://zhuanlan.zhihu.com/p/67520807     今天来讲一下这Linux内核中的RCU(Read Copy Update,读复制更新)机制. 我主要参考的 ...

  6. 总结一下linux中的分段机制

    本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 这篇文章主要说一下linux对于分段机制的处理,虽然都说linux不使用分段机制,但是分段机制属于CPU的一个功 ...

  7. linux中的tasklet机制【转】

    转自:http://blog.csdn.net/yasin_lee/article/details/12999099 转自: http://www.kerneltravel.net/?p=143 中断 ...

  8. linux中的阻塞机制及等待队列

    阻塞与非阻塞是设备访问的两种方式.驱动程序需要提供阻塞(等待队列,中断)和非阻塞方式(轮询,异步通知)访问设备.在写阻塞与非阻塞的驱动程序时,经常用到等待队列. 一.阻塞与非阻塞 阻塞调用是没有获得资 ...

  9. linux中的阻塞机制及等待队列【转】

    转自:http://www.cnblogs.com/gdk-0078/p/5172941.html 阻塞与非阻塞是设备访问的两种方式.驱动程序需要提供阻塞(等待队列,中断)和非阻塞方式(轮询,异步通知 ...

随机推荐

  1. Kafka学习(二)

    作者:程序员cxuan链接:https://www.zhihu.com/question/53331259/answer/1262483551来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非 ...

  2. mac phpstorm返回文件顶部或者底部

    在Mac下,请按FN+Command+→|←,就这么简单~

  3. 租户的概念和MybatisPlus实现

    租户的概念:https://baijiahao.baidu.com/s?id=1625945681925384464&wfr=spider&for=pc MybatisPlus框架的租 ...

  4. JDBC的全称是什么?

    Java DataBase Connectivity,java数据库连接

  5. elasticsearch 是如何实现 master 选举的 ?

    想了解 ES 集群的底层原理,不再只关注业务层面了. 前置前提: 1.只有候选主节点(master:true)的节点才能成为主节点. 2.最小主节点数(min_master_nodes)的目的是防止脑 ...

  6. 初识mybatis(为什么是mybatis?)

    对原生态的 jdbc 中的问题总结 1.数据库连接,使用就创建,不使用立即释放,对数据库进行频繁连接开启和关闭,造成数据库资源浪费,影响数据库性能. 设想:使用数据库连接池管理数据库连接 2.将sql ...

  7. 机器学习 machine learn

    机器学习 机器学习 概述 什么是机器学习 机器学习是一门能够让编程计算机从数据中学习的计算机科学.一个计算机程序在完成任务T之后,获得经验E,其表现效果为P,如果任务T的性能表现,也就是用以衡量的P, ...

  8. Numpy求解线性方程组

    Numpy求解线性方程组 对于Ax=b,已知A和b,怎么算出x? 1. 引入包 2. 求解 验证

  9. 顺利通过EMC实验(7)

  10. html 5 读取本地文件API

    代码: <input type="file" name="uploadfile" class="J-upload"> <s ...