jak jest używana bariera pamięci w jądrze Linuksa
W źródle jądra Documentation / memory-barrier.txt znajduje się ilustracja, taka jak ta:
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)
Bez interwencji CPU 2 może postrzegać zdarzenia na CPU 1 w pewnej efektywnej kolejności losowej, pomimo bariery zapisu wydawanej przez 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 | +-------+
+-------+
: :
Nie rozumiem, ponieważ mamy barierę zapisu, więc każdy sklep musi działać, gdy C = & B jest wykonywane, co oznacza, że skąd B równa się 2. W przypadku CPU 2, B powinno być 2, gdy otrzyma wartość C, czyli & B, dlaczego miałoby postrzegać B jako 7. Naprawdę jestem zdezorientowany.