Что такое забор памяти?

Что подразумевается при использовании явного забора памяти?

Ответ 1

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

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

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

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

Ответ 2

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

Самое важное - это переупорядочение доступа к памяти.

Отсутствие задержек памяти или инструкций по сериализации, процессор может свободно изменять порядок доступа к памяти. Некоторые архитектуры процессоров имеют ограничения на то, сколько они могут изменить порядок; Альфа известен как самый слабый (т.е. Тот, который может переупорядочить больше всего).

Очень хорошее отношение к этому вопросу можно найти в исходной документации ядра Linux, Documentation/memory-barriers.txt.

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

Ответ 3

По моему опыту это относится к барьер памяти, который является инструкцией (явной или неявной) для синхронизации доступа к памяти между несколькими потоками.

Проблема возникает в сочетании современных агрессивных компиляторов (у них есть удивительная свобода переупорядочивать инструкции, но обычно ничего не знают о ваших потоках) и современных многоядерных процессорах.

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

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

Ответ 4

Википедия знает все...

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

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

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