Когда нам нужно использовать posix_memalign вместо malloc? - PullRequest
19 голосов
/ 20 июня 2011

Кажется posix_memalign позволяет вам выбрать пользовательский alignment, но когда это необходимо?

malloc уже выполнил выравнивание внутри.

ОБНОВЛЕНИЕ

Точная причина, по которой я спрашиваю это, заключается в том, что я вижу, что nginx делает это, ngx_memalign(NGX_POOL_ALIGNMENT, size, log);, здесь NGX_POOL_ALIGNMENT определяется как 16, nginxs.googlecode.com / svn-history /ствол / SRC / ядро ​​/ ngx_palloc.c

Ответы [ 4 ]

12 голосов
/ 20 июня 2011

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

Однако иногда вам требуется выравнивание памяти на других границах, например 4Kи т. д. В этом случае вам понадобится memalign.

Это понадобится, например,

  • при написании менеджера памяти (например, сборщика мусора).).В этом случае иногда удобно работать с памятью, выровненной по блокам большего размера.Таким образом, вы можете хранить метаданные, общие для всех объектов в данном блоке, в нижней части выделенной области и получать к ним доступ, просто маскируя младшие значащие биты указателя объекта.
  • при взаимодействии с оборудованием(никогда не делал этого сам, но IIRC, некоторые виды блочных устройств требуют согласованной памяти).См. Подробности в ответе nm.
6 голосов
/ 20 июня 2011

Насколько я могу судить, единственными преимуществами posix_memalign являются:

  1. Выделение памяти с выравниванием по страницам (обычно с выравниванием 4096 или более) для аппаратных целей.
  2. Злые хаки, где вы держите младшие N биты указателя в нуле, чтобы вы могли хранить N -битное целое число в младших битах.: -)
2 голосов
/ 20 июня 2011

Пара применений:

  • Некоторые процессоры имеют инструкции, которые будут работать только с данными, которые выровнены с степенью двойки, большей или равной размеру буфера - например, битинструкции обратной адресации, используемые в ffts (быстрые преобразования Фурье).

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

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

2 голосов
/ 20 июня 2011

Различное оборудование может иметь требования к выравниванию, которые malloc не может удовлетворить.Справочная страница Linux приводит один такой пример, который я цитирую:

Во многих системах существуют ограничения на выравнивание, например, для буферов, используемых для прямого ввода-вывода блочных устройств.POSIX определяет вызов pathconf (path, _PC_REC_XFER_ALIGN), который сообщает, какое выравнивание необходимо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...