Что такое блокировка шины в контексте атомарных переменных?

Я использую C ++ уже давно, и теперь я начинаю изучать ассемблер и изучать, как работают процессоры (не просто для удовольствия, а как часть тестовой программы). Изучая ассемблер, я начал слышать некоторые термины, которые слышу здесь и там при обсуждении многопоточности, учитывая, что я занимаюсь многопоточностью в научных вычислениях. Я изо всех сил пытаюсь получить полную картину, и я был бы признателен за помощь в расширении моей картины.

Я узнал, что автобус, в его самой простой форме, является чем-то вроде мультиплексор с последующим демультиплексором. Каждый из концов принимает адрес в качестве входа, чтобы соединить два конца с некоторым внешним компонентом. Два конца могут, в зависимости от адреса, указывать на память, графическую карту, ОЗУ, регистры ЦП или что-либо еще.

Теперь перейдем к моему вопросу: я продолжаю слышать, как люди спорят о том, использовать ли мьютекс или атом для безопасности потоков (я знаю, что нет окончательного ответа, это не мой вопрос, но мой вопрос о сравнении). Вот например, было заявлено, что атомы настолько плохи, что не позволят процессору делать достойную работу из-за блокировки шины.

Может кто-нибудь объяснить, пожалуйста что такое блокировка шины, в нескольких деталях, и почему это не похоже на мьютексы, в то время как AFAIK, мьютексам требуется по крайней мере две атомарные операции для блокировки и разблокировки.

2

Решение

«Я узнал, что шина, в ее самой простой форме, является чем-то вроде мультиплексора, за которым следует демультиплексор. Каждый из концов»

Ну, это не правильно. В своем самый простой Форма нечего мультиплексировать или демультиплексировать. Это просто две вещи, говорящие напрямую друг с другом. И в простейшем случае к шине может быть подключено три или более устройств. В этом случае вы начинаете нуждаться в адресах шины, потому что вы больше не можете говорить о «другом конце».

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

В конкретном контексте шины памяти x86 это означает, что она должна быть заблокирована во время цикла чтения-изменения-записи (как указано в комментариях Kerrek SB). Теперь это может звучать как простая шина с двумя устройствами (память и процессор), но DMA и многоядерные чипы делают это не так просто.

2

Другие решения

Из Руководства разработчика программного обеспечения для архитектуры Intel® 64 и IA-32:

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

Есть специальные Non-Temporal хранить инструкции, чтобы обойти кеш. Все другие загрузки и хранилища обычно проходят через кэш, если страница памяти не помечена как не кешируемая (например, память устройства GPU или PCIe).

2