Предположение о машинной инструкции в смысле многопоточности

Можно ли предположить, что в каждой инструкции соблюдается атомарность? Например,

mov dword ptr [eax], 0

Движение либо идет успешно, либо не происходит. в середине выполняемой инструкции нет прерывания.

Верно ли мое предположение?

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

EDIT: меня беспокоит атомарность любой отдельной инструкции, а не специальной инструкции или ветви инструкций чтения-записи, я просто использую mov < / em> например.

  1. Каждый раз, когда какое-либо ядро ​​процессора выполняет инструкцию (сложение, перемещение, сдвиг и т. Д.), Может ли выполнение быть прервано?
  2. Есть ли неопределенное состояние в регистре или памяти (размер машинного слова).

Или какой наименьший элемент может обеспечить атомарность аппаратного обеспечения?


person Chang    schedule 11.04.2011    source источник
comment
stackoverflow.com/questions/1762148/atomic-instruction   -  person Mitch Wheat    schedule 11.04.2011
comment
Ваш вопрос не имеет смысла; если K является константой (немедленной), тогда никакая память не задействуется, кроме фактического текста программы. (Надеюсь, вы не пытаетесь рассуждать о поведении самомодифицирующегося кода в присутствии SMP / потоков ...) Таким образом, другие потоки не могут даже увидеть или быть затронутыми этими инструкциями ...   -  person R.. GitHub STOP HELPING ICE    schedule 11.04.2011
comment
в каждой инструкции соблюдается атомарность - ›не английский. можно сказать, наблюдается атомарно или наблюдает атомарность. а они разные.   -  person v.oddou    schedule 20.03.2014


Ответы (2)


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

Префикс LOCK в x86 нужен для обеспечения атомарности.

РЕДАКТИРОВАТЬ: вопрос был отредактирован, чтобы показать сохранение константы в памяти. И мой ответ по-прежнему в целом отрицательный. Могут быть некоторые ситуации, когда, если память выровнена, и ЦП гарантирует, что это будет атомарным, но я бы не стал на это полагаться, так как это может вызвать у вас проблемы.

Также см. Здесь: Чтение / запись int на машине x86 без блокировки

person Guy Sirton    schedule 11.04.2011
comment
Я снова обновил вопрос. так ты хочешь сказать, что единственная инструкция будет прервана? на самом деле я спрашиваю, может ли выровненная память оказаться в неопределенном состоянии. - person Chang; 11.04.2011
comment
В x86 простые загрузки и сохранения (инструкции MOV) являются атомарными при применении к выровненным операндам в обычной памяти. Для всего остального, кроме XCHG и инструкций с префиксом LOCK, лучше всего предположить, что это НЕ атомарно. Даже простые загрузки и хранилища не обязательно являются атомарными на платформах, отличных от x86. См. Мою статью о неатомарности INC: devx.com/cplus/Article/42725 - person Anthony Williams; 11.04.2011

Вы пометили этот вопрос тегами C и C ++, но ни в одном из языков нет mov инструкций или каких-либо понятий отдельных инструкций. Если ваш вопрос действительно касается сборки x86, тогда да mov инструкции являются атомарными, по крайней мере, пока операнд памяти выровнен, и, возможно, даже если это не так. Однако обратите внимание, что это ничего не имеет отношения к тому, является ли присвоение переменным C или C ++ атомарным.

person R.. GitHub STOP HELPING ICE    schedule 11.04.2011
comment
Что ж, инструкция MOV, которая сохраняет значение на границе строки кэша, не является атомарной. Также нельзя перемещать строки (MOVS), которые спроектированы для прерывания / перезапуска. В общем, инструкции MOV не атомарны (не говоря уже о более сложных). Есть особые случаи, когда инструкции MOV являются атомарными: в частности, доступ к загруженному / сохраненному операнду осуществляется на границе, равной по размеру операнду, для элементов размером в слово и выше. В противном случае вам лучше использовать инструкции по синхронизации. Как ни странно, XCHG является атомарным, потому что Intel сделала это еще в ранних процессорах. - person Ira Baxter; 11.04.2011
comment
@Ira: Я уже ограничил свой ответ как минимум до тех пор, пока операнд памяти выровнен, что исключает пересечение границ строки кеша. - person R.. GitHub STOP HELPING ICE; 11.04.2011
comment
@Ira Baxter говорит о строке кеша, я сбит с толку, как вы пересекаете границу целочисленной строки кеша размером с машинное слово? - person Chang; 11.04.2011
comment
@Chang: сохранить слово по адресу, соответствующему последнему байту строки кэша. - person Ira Baxter; 11.04.2011
comment
@Ira Baxter, я могу заключить, что выровненный адрес не будет затронут строкой кеша, и, следовательно, он является атомарным, как R .. писал выше, можно? - person Chang; 11.04.2011
comment
@Chang: адреса, выровненные по операндам, не пересекают границы строки кеша, правильно. Они атомарны только для операндов размером слово и вверх, IIRC; Я не думаю, что байтовые обновления атомарны. Если вы хотите узнать уродливые подробности, вам действительно нужно прочитать руководство по архитектуре Intel. Он есть на сайте Intel. - person Ira Baxter; 11.04.2011
comment
В любой разумной архитектуре байтовые обновления являются атомарными. Конечно на любом x86. Я на 99% уверен, что обновления полуслова (16-битные) тоже, если они не пересекают границы строк кеша. - person R.. GitHub STOP HELPING ICE; 11.04.2011