• 再看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发生在后面;没啥难的。

  • 相关阅读:
    紫书 例题8-6 UVa 1606(扫描法)
    紫书 例题8-5 UVa11054(等价转换)
    紫书 例题8-4 UVa 11134(问题分解 + 贪心)
    紫书 例题8-3 UVa 1152(中途相遇法)
    紫书 例题8-2 UVa 11605(构造法)
    Codeforces Round #437 (Div. 2, based on MemSQL Start[c]UP 3.0
    2016ACM/ICPC亚洲区沈阳站
    Tenka1 Programmer Contest D
    [Gym-101512C] 凸包+最远点对
    ZOJ
  • 原文地址:https://www.cnblogs.com/honpey/p/9064529.html
Copyright © 2020-2023  润新知