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



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

538   4  

4 ответов:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Comments

    Ничего не найдено.