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

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

100 голосов
/ 13 ноября 2008

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

Ответы [ 4 ]

94 голосов
/ 13 ноября 2008

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

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

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

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

15 голосов
/ 13 ноября 2008

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

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

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

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

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

6 голосов
/ 13 ноября 2008

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

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

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

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

1 голос
/ 13 ноября 2008

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

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

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

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

...