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

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

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

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

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

«Я узнал, что автобус в его простейшей форме – это нечто вроде мультиплексора, за которым следует демультиплексор. Каждый из концов”

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

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

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

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

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

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