¿Cómo se usa una barrera de memoria en el núcleo de Linux?
Hay una ilustración en la fuente del kernel Documentation / memory-doors.txt, como esta:
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)
Sin intervención, la CPU 2 puede percibir los eventos en la CPU 1 en un orden aleatorio efectivo, a pesar de la barrera de escritura emitida por la 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 | +-------+
+-------+
: :
No entiendo, ya que tenemos una barrera de escritura, por lo tanto, cualquier almacén debe tener efecto cuando se ejecuta C = & B, lo que significa que B sería igual a 2. Para la CPU 2, B debería haber sido 2 cuando obtiene el valor de C, que es & B, ¿por qué percibiría B como 7. Estoy realmente confundido?