По умолчанию подсистема malloc использует одну кучу (пул свободной памяти). Однако в системе предусмотрены средства организации нескольких куч (или сложной кучи) на случай, если это понадобится.
Организация нескольких куч в подсистеме malloc может увеличить производительность многонитевых приложений в многопроцессорных системах. Если в подсистеме malloc только одна куча, то запросы на выделение памяти, поступающие от нитей с разных процессоров, ставятся в очередь, что означает, что в каждый момент времени может обслуживаться только один запрос. Это может оказать существенное влияние на производительность многопроцессорной системы.
В режиме сложной кучи подсистема malloc создает фиксированное количество куч. Как только процесс будет создавать вторую нить, подсистема malloc начнет использовать для него несколько куч. Каждый запрос на выделение памяти будет обслуживаться в одной из куч. За счет этого подсистема malloc может распараллеливать запросы, поступающие от нескольких нитей, по крайней мере до тех пор, пока количество нитей не больше, чем число куч.
Если количество нитей, одновременно обращающихся к malloc, превысит количество куч, то лишние запросы будут поставлены в очередь. Такой подход в целом должен существенно повысить производительность подсистемы malloc при работе с многонитевыми процессами в многопроцессорной среде.
Переход в режим нескольких куч осуществляется в момент запуска процесса с помощью переменной среды MALLOCMULTIHEAP. Максимальное число куч равно 32.
По умолчанию подсистема malloc работает с одной кучей. Для работы с несколькими кучами нужно задать переменную среды MALLOCMULTIHEAP.
Для создания нескольких куч с параметрами по умолчанию нужно присвоить переменной MALLOCMULTIHEAP любое непустое значение, например:
MALLOCMULTIHEAP=true
В этом случае подсистема malloc перейдет в режим нескольких куч со стандартными параметрами (32 кучи и быстрый алгоритм выбора кучи).
Для создания нескольких куч с нестандартными параметрами нужно задать переменную MALLOCMULTIHEAP следующим образом:
MALLOCMULTIHEAP=<опции>
где <опции> - список опций конфигурации, указанных через запятую.
Предусмотрены следующие опции MALLOCMULTIHEAP:
Эти опции подробно описаны ниже.
Переменная MALLOCMULTIHEAP должна быть указана в следующем формате:
MALLOCMULTIHEAP=[heaps:n] | [considersize]
Можно указать любую из опций, либо обе опции через запятую:
MALLOCMULTIHEAP=heaps:3,considersize
В данном примере будут созданы три кучи и медленный алгоритм выбора кучи, минимизирующий размер процесса.
Каждая опция конфигурации может быть указана в переменной MALLOCMULTIHEAP не более раза. Если какая-либо опция указана несколько раз, то будет применяться последнее из указанных значений.
Ниже подробно описаны все опции MALLOCMULTIHEAP:
Выделение памяти в системе с помощью подсистемы malloc
Раздел malloc, free, realloc, calloc, mallopt, mallinfo, alloca, or valloc Subroutine в книге AIX 5L Version 5.1 Technical Reference: Base Operating System and Extensions Volume 1.