Я недавно читал о моделях памяти, и я был немного растерян, как это работает.
Цитировать http://cis.poly.edu/muller/CS623/weakmemory.htm
если процессор пишет новый X, затем записывает новый Y, все остальные процессоры, которые впоследствии
выполнить чтение Y затем чтение X, будет
получить доступ к новому Y и новому X,
старый Y и новый X, или старый X и
старый Y: но ни один процессор не получит доступ
новый Y и старый X. Это
Предположение о строгом порядке было, в
один раз, разумно. Текущий компьютер
производители, однако, рекомендуют
программисты не полагаются на память
упорядоченность. Это потому что новая память
системы управления пытаются изменить порядок
доступ к памяти для оптимизации
цели. Системы, которым разрешено
запрос на изменение порядка памяти
слабо упорядоченные системы памяти
(модель). Чтобы изучить, как переупорядочение
может быть использован для повышения производительности,
рассмотрим следующий код ассемблера
[2].
Load reg1, A // register1 = contents of memory A
Load reg2, B // register2 = contents of memory B
ADD reg3, reg1, reg2 // register3 = register1 + register2
Store reg3, C // contents of memory C = contents of register3
Если предположить, что местоположение B
в настоящее время в кеше и месте A
не кешируется, тогда загрузка А займет
дольше, чем B. Вместо ожидания
A, процессор может извлечь B из своего кэша,
скрывая задержку B: таким образом, процессор может
выполнить сложение, как только А
имеется в наличии. Расслабляя сильных
(последовательная) модель памяти выполнения
(т. е. сначала нужно загрузить A, а затем
Б), большая производительность
возможно ---- но переупорядочение не может быть
прозрачный для программного обеспечения. Рассмотрим
фрагмент кода ниже, это часть
код, который может быть использован для реализации
семафор спин-блокировки [2].
У меня вопрос: как это возможно, что при использовании более слабой модели памяти процессор может получить доступ к новому Y и старому X. Разве он не записан в одну и ту же память (RAM) или он работает по-другому? Я предполагаю, что если один процесс изменяет переменную, а другой читает ее после этого, он читает последнее значение.
Еще одна вещь, в которой я не уверен - какой компонент позволяет переупорядочивать доступ к памяти, теперь я предполагаю, что компилятору разрешено переупорядочивать инструкции. Но может ли процессор также изменить их порядок?
Спасибо