Как выполняются атомные операции на аппаратном уровне?

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

Как мне кажется, выполнение инструкции должно

  • Получить значение из памяти
  • Сравнить значение
  • В зависимости от сравнения возможно сохранить другое значение в памяти

Что мешает другому ядру получить доступ к адресу памяти после того, как первый его выберет, но до того, как он установит новое значение? Контроллер памяти управляет этим?

edit: Если реализация x86 является секретной, я буду рад услышать, как это реализует семейство процессоров.

+30
07 февр. '13 в 18:13
источник поделиться
4 ответа

Ниже приведено article на сайте software.intel.com, в котором мало света на блокировки пользовательского уровня:

Блокировки на уровне пользователя включают использование атомных инструкций процессор для атомного обновления памяти. Атомные инструкции включают использование префикса блокировки в инструкции и наличие операнд назначения, назначенный для адреса памяти. Следующие инструкции могут выполняться атомарно с префиксом блокировки на текущей версии Intel процессоры: ADD, ADC, AND, BTC, BTR, BTS, CMPXCHG, CMPXCH8B, DEC, INC, NEG, NOT, OR, SBB, SUB, XOR, XADD и XCHG. [...] В большинстве инструкций префикс блокировки должен быть явно использован, за исключением инструкции xchg где префикс блокировки подразумевается, если инструкция включает в себя память адрес.

В дни процессоров Intel 486 префикс блокировки, используемый для утверждения замок на автобусе вместе с большим ударом в исполнении. Начиная с архитектура Intel Pentium Pro, блокировка шины преобразуется в блокировка кеша. Блокировка будет по-прежнему утверждаться на шине в большинстве современные архитектуры, если блокировка находится в необщиваемой памяти или если блокировка выходит за пределы линий кэширования линии кэширования. Оба этих сценария маловероятны, поэтому большинство префиксов блокировки будут преобразуется в блокировку кеша, которая намного дешевле.

Итак, что мешает другому ядру получить доступ к адресу памяти? когерентный протокол кэширования уже управляет правами доступа к строкам кэша. Поэтому, если ядро ​​имеет (временные) эксклюзивные права доступа к строке кэша, ни одно другое ядро ​​не может получить доступ к этой строке кэша. Чтобы получить доступ к этой строке кэша, другое ядро ​​должно сначала получить права доступа, а протокол для получения этих прав включает текущего владельца. Фактически, протокол когерентности кеша не позволяет другим ядрам беспрепятственно обращаться к типу кеша.

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

+19
07 февр. '13 в 21:10
источник

Пример реализации этого LL/SC, где у процессора действительно будут дополнительные инструкции, которые используются для завершения атомных операций. На стороне памяти это когерентность кэша. Одним из наиболее популярных протоколов когерентности кэш-памяти является Протокол MESI..

+4
07 февр. '13 в 21:10
источник

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

0
07 февр. '13 в 18:33
источник

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

  • Загрузите значение из кэша в регистр
  • Увеличить значение, загруженное в регистр
  • Сохранить обновленное значение в кэше

Итак, чтобы реализовать вышеуказанные 3 инструкции в атомном режиме, мы должны сначала получить эксклюзивный доступ к кешелине, которая содержит требуемое значение. Как только мы получим эксклюзивный доступ, мы не должны отказываться от эксклюзивного доступа к этой строке, пока не завершится операция "store". Это означает, что процессор, выполняющий атомарные инструкции, не должен отвечать на сообщения протокола когерентности кэша для этой линии кэширования в среднем времени. Хотя дьявол подробно описывает, как это реализовано, по крайней мере, это дает нам ментальную модель.

Ниже приведено то, что linus torvalds упоминали об атомных инструкциях

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

0
07 мая '17 в 23:59
источник

Посмотрите другие вопросы по меткам или Задайте вопрос