Наборы функции Malloc представляют собой дополнительное расширения стандартного распределителя на основе наборов. Эти наборы предназначены для повышения производительности приложений, создающих большое количество запросов на выделение небольшого объема памяти. Если данное расширение включено, запросы на выделение блока памяти, размер которых соответствует заданному диапазону, обрабатываются наборами функции malloc. Все остальные запросы обрабатываются обычным образом стандартным распределителем.
По умолчанию наборы Malloc отключены. Эта функция настраивается и включается до запуска процесса с помощью переменных среды MALLOCTYPE и MALLOCBUCKETS.
Набор состоит из блока памяти, который делится на заданное число меньших блоков равного размера, каждый из которых может быть отдельно выделен. Каждому набору соответствует свой номер. Первый набор имеет номер 0, второй набор - 1, третий - 2, и т.д. Первый набор имеет наименьший размер, размер каждого последующего набора больше и вычисляется по формуле, описанной ниже в этом разделе. В куче может быть не более 128 наборов.
Размер блока каждого набора кратен коэффициенту размера набора. Коэффициент размера набора равен размеру блока первого набора. Размер блоков второго набора в два раза больше, размер блоков третьего набора - в три раза больше, и т.д. Таким образом, размер блока конкретного набора вычисляется по формуле:
размер блока = (номер набора + 1) * коэффициент размера набора
Например, при значении коэффициента размера набора 16, размер блока первого набора (набора 0) будет равен 16 байт, размер блока второго набора (набора 1) - 32 байта, размер блока третьего набора (набора 2) - 48 байт, и т.д.
Для обеспечения соответствия адресов, возвращаемых функциями подсистемы malloc, различным типам данных коэффициент размера набора должен быть кратен 8 в 32-разрядной среде и 16 в 64-разрядной среде.
Размер набора вычисляется по следующей формуле:
размер набора = число блоков в наборе * (затраты malloc + ((номер набора + 1) * коэффициент размера набора))
Приведенная выше формула позволяет вычислить фактический размер каждого набора. В этой формуле затраты malloc обозначают размер внутренней структуры malloc, необходимой для каждого блока набора. Размер внутренней структуры составляет 8 байт в 32-разрядных приложениях и 16 байт в 64-разрядных приложениях. Этот объем памяти не может быть выделен для пользовательских данных, однако включается в общий размер набора.
Число блоков в наборе, число наборов и коэффициент размера набора могут быть заданы с помощью переменной среды MALLOCBUCKETS.
Блоки выделяются из одного из наборов, если включена функция наборов malloc и запрос на выделение памяти соответствует диапазону размеров блоков наборов. Для экономии объема память выделяется из наименьшего возможного набора.
Если при получении запроса все блоки набора уже выделены, функция malloc автоматически увеличит набор для обработки запроса. При увеличении набора его к нему добавляется число блоков равное первоначальному числу блоков, которое может быть настроено с помощью переменной среды MALLOCBUCKETS.
Поддержка в функции malloc нескольких куч позволяет реализовать работу с несколькими кучами malloc для повышения производительности приложений с нитями в системах с несколькими процессорами. Функция наборов malloc поддерживает до 128 наборов в куче. Это позволяет подсистеме malloc поддерживать параллельное применение наборов malloc с несколькими кучами malloc для увеличения производительности процессов с нитями, работающих в системах с несколькими процессорами, за счет применения наборов.
По умолчанию наборы Malloc отключены. Для их включения и настройки предназначены следующие переменные среды:
Для того чтобы включить поддержку наборов malloc с параметрами по умолчанию, присвойте следующее значение переменной среды MALLOCTYPE:
MALLOCTYPE=buckets
Для того чтобы включить поддержку наборов malloc с пользовательскими параметрами присвойте переменным MALLOCTYPE и MALLOCBUCKETS следующие значения:
MALLOCTYPE=buckets
MALLOCBUCKETS=опции
Где опции - список разделенных запятыми предопределенных опций настройки, которые обсуждаются в следующем разделе, Опции настройки наборов malloc.
Примечание: Следующие возможности подсистемы malloc не могут применяться одновременно.
Переменная среды MALLOCBUCKETS позволяет включить поддержку наборов malloc со следующими предопределенными опциями настройки:
number_of_buckets:n
bucket_sizing_factor:n
blocks_per_bucket:n
bucket_statistics:[stdout|stderr|pathname]
Эти опции подробно обсуждаются в разделе Опции переменной MALLOCBUCKETS.
При настройке переменной среды MALLOCBUCKETS применяется следующий синтаксис:
MALLOCBUCKETS=[[ number_of_buckets:n | bucket_sizing_factor:n | blocks_per_bucket:n | bucket_statistics:[stdout|stderr|pathname]],...]
В определении может быть указано несколько опций (в любом порядке), разделенных запятыми, например:
MALLOCBUCKETS=number_of_buckets:128,bucket_sizing_factor:8,bucket_statistics:stderr
MALLOCBUCKETS=bucket_statistics:stdout,blocks_per_bucket:512
Для разделения опций настройки применяются запятые. При использовании других разделителей (например, пробелов) опции конфигурации будут интерпретированы неправильно.
При настройке значения переменной MALLOCBUCKETS каждая опция настройки может быть определена только один раз. Если опция настройки указана несколько раз, применяется только последнее значение.
Если опция конфигурации указана с неправильным значением, функция наборов malloc направит предупреждение в стандартный вывод и продолжит выполнение, применяя значение по умолчанию.
Важно помнить, что подсистема malloc обрабатывает переменную среды MALLOCBUCKETS, только если для переменной MALLOCTYPE указано значение buckets, как это показано в следующем примере:
MALLOCTYPE=buckets
MALLOCBUCKETS=number_of_buckets:8,bucket_statistics:stderr
По умолчанию число наборов в куче равно 16. Минимальное значение - 1. Максимальное значение - 128.
Значение параметра bucket_sizing_factor должно быть кратно 8 в 32-разрядном приложении, и 16 - в 64-разрядном приложении. По умолчанию применяется коэффициент размера набора 32 для 32-разрядных приложений и 64 - для 64-разрядных приложений.
По умолчанию для параметра blocks_per_bucket установлено значение 1024.
Статистический отчет по наборам направляется в один из следующих выводов, в соответствии со значением опции bucket_statistics.
Если указано пользовательское полное_имя_файла, статистические данные добавляются в конец файла.
Для процесса, выходные данные которого являются входными данными для другого процесса, не следует применять стандартный вывод.
По умолчанию опция bucket_statistics отключена.
Примечания:
Приведенная ниже таблица содержит значения опций настройки наборов malloc,
применяемые по умолчанию.
Опция настройки | Значение по умолчанию (32-разрядное приложение) | Значение по умолчанию (64-разрядное приложение) |
---|---|---|
число наборов в куче | 16 | 16 |
коэффициент размера набора | 32 байта | 64 байта |
диапазон выделения памяти | 1 - 512 байт (включительно) | 1 - 1024 байт (включительно) |
первоначальное число блоков в наборе | 1024 | 1024 |
статистический отчет по наборам | отключен | отключен |
Стандартная конфигурация функции наборов malloc обеспечивает увеличение производительности множества приложений, создающих большое число запросов на выделение небольшого объема памяти. Однако изменение конфигурации наборов с помощью переменной MALLOCBUCKETS может повысить производительность. Для изменения заданных по умолчанию значений разработчик приложения должен знать требования к оперативной памяти и особенности ее использования в приложении. Для оптимизации настройки наборов malloc можно воспользоваться опцией bucket_statistics.
Наборы malloc могут поддерживаться только в приложениях, применяющих стандартный распределитель. Наборы не поддерживаются функцией malloc AIX 3.1.
Из-за различных требований и особенностей использования памяти в применение наборов malloc может не повысить производительность некоторых приложений. По этой причине не рекомендуется включать поддержку наборов malloc во всей системе. Для максимальной производительности поддержку наборов malloc следует включать и настраивать для каждого приложения на индивидуальной основе.
Функции malloc, free, realloc, calloc, mallopt, mallinfo, alloca и valloc в книге AIX 5L Version 5.1 Technical Reference: Base Operating System and Extensions Volume 1.
Сложная куча malloc, Общие принципы программирования в AIX 5L версии 5.1, Глава 19.