Вопрос x86 LOCK о многоядерных процессорах

Верно ли, что префикс команды x86 ASM "LOCK" заставляет все ядра замораживаться, пока выполняется команда, следующая за "LOCK"?

Я прочитал это в блоге, и это не имеет смысла. Я не могу найти ничего, что указывает, верно это или нет.

Ответы

Ответ 1

Это о блокировке шины памяти для этого адреса. Руководство разработчика программного обеспечения для архитектуры Intel 64 и IA-32 - Том 3A: Руководство по системному программированию, часть 1 сообщает нам:

7.1.4. Эффекты операции LOCK на внутренних кэшах процессора.

Для процессоров Intel486 и Pentium сигнал LOCK # всегда утверждается на автобусе во время блокировки даже если область памяти блокировка кэшируется в процессор.

Для P6 и более поздних процессоров семейств, если область памяти заблокирована во время LOCK-операции кэшируется в процессоре, который выполняя операцию LOCK как памяти обратной записи и полностью содержащихся в строке кэша, процессор не может утверждать, что LOCK # сигнал на шине. Вместо этого изменить внутреннюю область памяти и разрешить [его] согласованность кеша механизм для обеспечения того, чтобы операция выполняется атомарно. Эта операция называется "блокировка кеша". Механизм когерентности кеша автоматически предотвращает два или более процессоры, имеющие одну и ту же область памяти одновременно с изменением данных в этой области. (выделено мной)

Здесь мы узнаем, что P6 и более новые чипы достаточно умны, чтобы определить, действительно ли им нужно блокировать шину или просто полагаться на интеллектуальное кэширование. Я думаю, что это аккуратная оптимизация.

Я больше обсуждал это в своем сообщении в блоге " Как блокировать блокировки?"

Ответ 2

Нет, но это может заставить другие процессоры ждать, пока тот обращается к памяти. Являются ли эти состояния ожидания когда-либо различимыми, зависят от степени, в которой процессоры работают от кеша.