zoukankan      html  css  js  c++  java
  • 再看RCU

    从昨天晚上开始,我就立志要把RCU拿下,昨晚加今天早上看了RCU的东西,太细节的原理我就不扣了,放弃,知道RCU是怎么用的就可以了,赶紧看文件系统中dcache的管理了。

    说说RCU,RCU其实是很简单,读者在读之前rcu_read_lock(); 以此来关闭本CPU上的抢占;然后读者用rcu_dereference_pointer来得到RCU上的指针;写者使用rcu_pointer_assigned来赋值,赋值的时候会发生以此CPU上的smb同步,然后在每个CPU上过了一个grace period之后出发回到函数即可。

    rcu_pointer_assigned发生了啥:

    rcu_dereferenced_pointer发生了啥?:

    两个问题和内存屏障有关系

    https://blog.csdn.net/denzilxu/article/details/8148257

    链接中有内存的发布订阅模型,

    rcu_assign_pointer(gp, p) 感觉还好理解,写屏障刷新了p所指向的内存区域的内容,所有之前的内存的操作都需要完成并且同步到内存中去,p = rcu_dereference(p)是为了说明什么问题呢?是为了防止什么优化呢?

    1 rcu_read_lock();
    2 p = rcu_dereference(gp);
    3 if (p != NULL) {
    4 do_something_with(p->a, p->b, p->c);
    5 }
    6 rcu_read_unlock();

    #define rcu_dereference(p)     ({

                                                   typeof(p)_________p1 =ACCESS_ONCE(p);

                                                   smp_read_barrier_depends();

                                                   (_________p1);

                                                   })

    如果没有优化会咋样呢?编译器很可能是先把第4行的p->a,p->b,p->c优化成gp->a;gp->b;gp->c了,并且执行的顺序是不保证的,所以这里加了smp_read_barrier_dpends屏障,能够保障p->a,p->b,->c发生在后面;没啥难的。

  • 相关阅读:
    远程支付技术方案
    软件架构设计(第2版)——程序员向架构师转型必备
    概念架构是什么
    项目报警机制
    编写有效用例
    移动支付的基本要素
    相机的日常维护和保养注意事项
    吴炜摄影教程随堂笔记1
    D80使用心得3
    项目沟通管理识别干系人
  • 原文地址:https://www.cnblogs.com/honpey/p/9064529.html
Copyright © 2011-2022 走看看