在障碍之前写作之前,如何在障碍之后看到作家?

时间:2014-08-04 23:01:19

标签: linux-kernel shared-memory memory-model

在linux内核的内存屏障文档(Documentation / memory-barriers.txt)中,有一些示例显示在内存屏障之前的内存屏障之前的编写器在其他CPU的内存屏障之前是可见的。怎么会发生这种情况?为什么写入屏障不足以命令这些写入?

特别是以下内容:

843         CPU 1                   CPU 2
844         ======================= =======================
845                 { B = 7; X = 9; Y = 8; C = &Y }
846         STORE A = 1
847         STORE B = 2
848         <write barrier>
849         STORE C = &B            LOAD X
850         STORE D = 4             LOAD C (gets &B)
851                                 LOAD *C (reads B)
852 
853 Without intervention, CPU 2 may perceive the events on CPU 1 in some
854 effectively random order, despite the write barrier issued by CPU 1:
855 
856         +-------+       :      :                :       :
857         |       |       +------+                +-------+  | Sequence of update
858         |       |------>| B=2  |-----       --->| Y->8  |  | of perception on
859         |       |  :    +------+     \          +-------+  | CPU 2
860         | CPU 1 |  :    | A=1  |      \     --->| C->&Y |  V
861         |       |       +------+       |        +-------+
862         |       |   wwwwwwwwwwwwwwww   |        :       :
863         |       |       +------+       |        :       :
864         |       |  :    | C=&B |---    |        :       :       +-------+
865         |       |  :    +------+   \   |        +-------+       |       |
866         |       |------>| D=4  |    ----------->| C->&B |------>|       |
867         |       |       +------+       |        +-------+       |       |
868         +-------+       :      :       |        :       :       |       |
869                                        |        :       :       |       |
870                                        |        :       :       | CPU 2 |
871                                        |        +-------+       |       |
872             Apparently incorrect --->  |        | B->7  |------>|       |
873             perception of B (!)        |        +-------+       |       |
874                                        |        :       :       |       |
875                                        |        +-------+       |       |
876             The load of X holds --->    \       | X->9  |------>|       |
877             up the maintenance           \      +-------+       |       |
878             of coherence of B             ----->| B->2  |       +-------+
879                                                 +-------+
880                                                 :       :
881 
882 
883 In the above example, CPU 2 perceives that B is 7, despite the load of *C
884 (which would be B) coming after the LOAD of C.

2 个答案:

答案 0 :(得分:1)

写屏障 正确地命令写入。

如下文所述,问题是CPU 2可以在*C之前阅读C,因为它不使用任何类型的读屏障。

答案 1 :(得分:0)