本文共 1433 字,大约阅读时间需要 4 分钟。
数据(即DMA想把它写入内存的),用来更新Cache Line的相关部分。
//
“在line 3,GCC不会用存放b的寄存器给a赋值,而是invalidate b的Cache line,重新读内存中的b值,赋值给a。”
感觉这个是不对的。上面都说了“barrier()宏只约束gcc编译器,不约束运行时的CPU行为”, 而invalidate Cache line要调用wbinvd命令,我对GCC的代码进行grep 没有发现使用wbinvd的地方。“
4.2) IA32 CPU调用有lock前缀的指令,或者如xchg这样的指令,会导致其它的CPU也触发一定的动作来同步自 己的Cache。 CPU的#lock引脚链接到北桥芯片(North Bridge)的#lock引脚,当带lock前缀的执行执行时,北桥芯片会拉起#lock 电平,从而锁住总线,直到该指令执行完毕再放开。 而总线加锁会自动invalidate所有CPU对 _该指令涉及的内存_ 的Cache,因此barrier就能保证所有CPU的Cache一致性。 ”总线加锁的功能是保证程序执行的顺序不乱掉,一旦加LOCK指令了,CPU会将此指令前的读写操作都串行完成,这最主要的作用是使CPU的预取等无效了。在这个串行操作中,MESI协议会起作用。但保证所有CPU的Cache一致性的是MESI协议,这是硬件上保证的。barrier是对GCC编译器做约束,是软件层次上的。“因此barrier就能保证所有CPU的Cache一致性”这种说法是不对的。“4.3) 接着解释。 lock前缀(或cpuid、xchg等指令)使得本CPU的Cache写入了内存,该写入动作也会引起别的CPU invalidate其Cache。 IA32在每个CPU内部实现了Snoopying(BUS-Watching)技术,监视着总线上是否发生了写内存操作(� 赡掣鯟PU或DMA控 制器发出的),只要发生了,就invalidate相关的Cache line。 因此,只要lock前缀导致本CPU写内存,就必将导致 所有CPU去invalidate其相关的Cache line。 ”
lock指令保证程序执行的顺序不乱掉,没有将“本CPU的Cache写入了内存”的功能。 总线监视功能是由各个CPU的CACHE完成的,这个功能可以算是MESI协议的实现。MESI保证了SMP下的CACHE一致性。
memory barrier的实质是对内存的操作施加顺序上的约束。Memory barrier, also known as membar or memory fence, is a class of instructions whichcause a central processing unit (CPU) to enforce an ordering constraint on memoryoperations issued before and after the barrier instruction. 上文源于:http://www.answers.com/topic/memory-barrier 至于“SMP情况下CACHE的一致性”只是memorybarrier在执行lock,sfence,lfence等指令时的副作用 !!!!, “SMP情况下CACHE的一致性”是由MESI来做的。
转载地址:http://iyhqj.baihongyu.com/