参考学习博客http://www.cnblogs.com/whyandinside/archive/2012/06/24/2560099.html中的Write Barrier Support中总结到:
write barrier support是为了enforce an ordering constraint on memory operations
在linux kernel中
memory barrier的实现就是使用mb()函数(该函数表示这个操作之前的所有内存操作不会被重排序到这个操作之后)
参考博客http://www.linuxidc.com/Linux/2011-06/37403.htm文章。
有关barrier的实例参考博客http://www.cppblog.com/tx7do/archive/2011/08/30/154701.aspx
我关注如下例子:
barrier实际上也是内存屏障。
include/linux/kernel.h:
#define barrier() __asm__ __volatile__("": : :"memory")
内存屏障也是一种避免锁的技术。
它在进程上下文中将一个元素插入一个单向链表:
new->next=i->next;
wmb();
i->next=new;
同时,如果不加锁地遍历这个单向链表。或者在遍历链表时已经可以看到new,或者new还不在该链表中。Alan Cox书写这段代码时就注意到了这一点,两个内存写事件的顺序必须按照程序顺序进行。否则可能new的next指针将指向一个无效地址,就很可能出现 OOPS!
不论是gcc编译器的优化还是处理器本身采用的大量优化,如Write buffer, Lock-up free, Non-blocking reading, Register allocation, Dynamic scheduling, Multiple issues等,都可能使得实际执行可能违反程序序,因此,引入wmb内存屏障来保证两个写事件的执行次序严格按程序顺序来执行。
===================================================================================================================================
我根据工作开发的qcom8939的android手机的kernel结合这个内存屏障的概率继续深入学习。
我使用的android手机的kernel版本如下:
Linux version 3.10.49-perf-gcd8aa24 (buildslave@xmws74) (gcc version 4.9.x-google 20140827 (prerelease) (GCC) ) #1 SMP PREEMPT Mon Aug 3 05:15:47 CST 2015
根据代码查找内核的内存屏障定义在文件kernel/arch/arm64/include/asm/barrier.h文件中,mb(), wmb(), rmb()。
memory barrier有几种类型:
acquire barrier : 不允许将barrier之后的内存读取指令移到barrier之前(linux kernel中的wmb())。
release barrier : 不允许将barrier之前的内存读取指令移到barrier之后 (linux kernel中的rmb())。
full barrier : 以上两种barrier的合集(linux kernel中的mb())。
在分析中,我接触到一个rcu机制,详见博客
http://m.blog.csdn.net/blog/xzongyuan/20382995