Когда нам нужно использовать posix_memalign вместо malloc?
Кажется, posix_memalign
позволяет выбрать настроенный alignment
, но когда это необходимо?
malloc
уже выполнил внутреннюю работу выравнивания.
UPDATE
Точная причина, по которой я спрашиваю об этом, - это то, что я вижу, что nginx делает это, ngx_memalign(NGX_POOL_ALIGNMENT, size, log);
, здесь NGX_POOL_ALIGNMENT
определяется как 16
, nginxs.googlecode.com/svn-history/trunk/src/core/ngx_palloc.c
Ответы
Ответ 1
В принципе, если вам требуется более жесткое выравнивание, чем даст вам malloc. Malloc обычно возвращает указатель, выровненный таким образом, что его можно использовать с любым из примитивных типов (часто 8 байтов на обычных настольных компьютерах).
Однако иногда вам нужна память, выровненная на других границах, например, выравнивание по 4K и т.д. В этом случае вам понадобится memalign
.
Вам понадобится это, например,
- при записи диспетчера памяти (например, сборщика мусора). В этом случае иногда удобно работать с памятью, выровненной на больших размерах блока. Таким образом, вы можете хранить метаданные, общие для всех объектов в данном блоке в нижней части выделенной области, и обращаться к этому просто путем маскирования наименее значимых бит указателя объекта.
- при взаимодействии с оборудованием (никогда не делал этого сам, но IIRC, некоторые виды блочных устройств требуют согласованной памяти). См. Пл. ответ для деталей.
Ответ 2
Единственными преимуществами posix_memalign
, насколько я могу судить, являются:
- Выделение памяти с выравниванием по страницам (обычно 4096 или больше) для аппаратных целей.
- Злые хаки, где вы храните низкие
N
биты нулевого указателя, чтобы вы могли хранить целое число N
-битное в младших битах.: -)
Ответ 3
У различных аппаратных средств могут быть требования к выравниванию, которые malloc
не может удовлетворить. На странице руководства Linux приведен один такой пример:
Во многих системах есть выравнивание ограничения, например. на буферах, используемых для прямое блочное устройство ввода/вывода. POSIX определяет pathconf (путь, _PC_REC_XFER_ALIGN) что говорит о необходимости выравнивания.
Ответ 4
Несколько применений:
-
Некоторые процессоры имеют инструкции, которые будут работать только на данных, которые выровнены по мощности, превышающей или равной размеру буфера - например, инструкции по обратному обращению бит, используемые в ffts (быстрые преобразования Фурье).
-
Чтобы выровнять данные с границами кэша, чтобы оптимизировать доступ в многопроцессорных приложениях, чтобы данные в одной и той же строке кэша не были одновременно доступны двумя процессорами.
В принципе, если вам не нужно делать абсурдные уровни оптимизации и/или ваше оборудование не требует, чтобы массив находился на определенной границе, вы можете забыть о posix_memalign.