как используется барьер памяти в ядре Linux
В исходном коде ядра есть файл Documentation / memory-barriers.txt, например:
CPU 1 CPU 2
======================= =======================
{ B = 7; X = 9; Y = 8; C = &Y }
STORE A = 1
STORE B = 2
STORE C = &B LOAD X
STORE D = 4 LOAD C (gets &B)
LOAD *C (reads B)
Без вмешательства ЦП 2 может воспринимать события на ЦП 1 в некотором фактически случайном порядке, несмотря на барьер записи, создаваемый ЦП 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. Я действительно смущен.