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

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

5 ответов

Решение

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

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

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

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

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

Наиболее важным из них будет изменение порядка доступа к памяти.

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

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

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

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

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

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

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

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

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

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

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

memory fence

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

Проблема в упорядочивании , общем ресурсе и кешировании. Процессор или компилятор может изменить порядок команд программы (порядок программирования) для оптимизации. Это создает побочные эффекты в многопоточной среде. Поэтому memory barrier

был введен, чтобы гарантировать правильную работу программы. Он медленнее, но решает проблему такого типа.

[Java Happens-before]

[Барьеры памяти iOS]

Другие вопросы по тегам