Атомные операции всегда выполняются последовательно в одном цикле ЦП?

Если у меня есть простой неатомный код, например:

a++;

которые можно разбить на машинные инструкции, например:

MOV EAX, [a]
INC EAX
MOV [a], EAX

Я не знаком с машинным кодом, пожалуйста, извините меня, если это неверно, но в основном предполагайте, что они предварительно сформированы атомарно

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

Поскольку это связано с предварительным форматированием каждого бита машинного кода последовательно друг к другу с одним и тем же циклом.

2 ответа

На современных процессорах x86/x64 вы даже не можете предположить, что одна архитектурная инструкция сопоставляется с одной инструкцией процессора (машины). Современные процессоры обычно реализуют инструкции x86/x64 внутренне как ряд инструкций микрокода, специфичных для архитектуры. Порядок, в котором они выполняются, не сопоставляет каким-либо простым способом порядок, в котором они появляются в вашем исполняемом файле из-за не исполнения заказа, спекулятивного исполнения и т.д. Также нет простого сопоставления между тактовыми циклами ЦП и количеством выполненных команд,

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

Единственный способ получить логическую атомарность в современном многопоточном окружении - использовать соответствующие инструкции по атомной и синхронизации, предоставляемые архитектурой, которые гарантируют атомное поведение не только на уровне команд, но и по иерархии памяти (L1, L2, L3 кеш и основная память, плюс буферы хранения и т.д.).


Большинство процессоров, найденных на компьютерах, поскольку Pentium действительно использовали исполнение вне порядка. Это очень сложный процесс, с помощью которого инструкции высокого уровня сначала разлагаются на очень мелкие операции, а затем помещаются в очередь выполнения, где инструкции выполняются в порядке, в котором входные операнды становятся доступными. Вы можете прочитать более подробное описание в Википедии.

licensed under cc by-sa 3.0 with attribution.