【发布时间】:2013-06-03 17:09:05
【问题描述】:
内核源码Documentation/memory-barriers.txt中有一个图解,像这样:
CPU 1 CPU 2 ======================= ======================= { B = 7; X = 9; Y = 8; C = &Y } STORE A = 1 STORE B = 2 <write barrier> STORE C = &B LOAD X STORE D = 4 LOAD C (gets &B) LOAD *C (reads B)如果没有干预,CPU 2 可能会在某些情况下感知 CPU 1 上的事件 尽管 CPU 1 发出了写屏障,但实际上是随机顺序:
+-------+ : : : : | | +------+ +-------+ | Sequence of update | |------>| B=2 |----- --->| Y->8 | | of perception on | | : +------+ \ +-------+ | CPU 2 | CPU 1 | : | A=1 | \ --->| C->&Y | V | | +------+ | +-------+ | | wwwwwwwwwwwwwwww | : : | | +------+ | : : | | : | C=&B |--- | : : +-------+ | | : +------+ \ | +-------+ | | | |------>| D=4 | ----------->| C->&B |------>| | | | +------+ | +-------+ | | +-------+ : : | : : | | | : : | | | : : | CPU 2 | | +-------+ | | Apparently incorrect ---> | | B->7 |------>| | perception of B (!) | +-------+ | | | : : | | | +-------+ | | The load of X holds ---> \ | X->9 |------>| | up the maintenance \ +-------+ | | of coherence of B ----->| B->2 | +-------+ +-------+ : :
我不明白,因为我们有写屏障,所以,任何存储都必须在执行 C = &B 时生效,这意味着 B 将等于 2。对于 CPU 2,B 在它得到时应该是 2 C的值,也就是&B,为什么会认为B是7。我真的很困惑。
【问题讨论】:
标签: linux memory linux-kernel memory-barriers smp