[ Страница назад | Страница вперед | Содержание | Индекс | Библиотека | Юридическая информация | Поиск ]

Программирование: Разработка и отладка программ


Наборы функции Malloc

Наборы функции 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 отключены. Для их включения и настройки предназначены следующие переменные среды:

Для того чтобы включить поддержку наборов malloc с параметрами по умолчанию, присвойте следующее значение переменной среды MALLOCTYPE:

MALLOCTYPE=buckets

Для того чтобы включить поддержку наборов malloc с пользовательскими параметрами присвойте переменным MALLOCTYPE и MALLOCBUCKETS следующие значения:

MALLOCTYPE=buckets

MALLOCBUCKETS=опции

Где опции - список разделенных запятыми предопределенных опций настройки, которые обсуждаются в следующем разделе, Опции настройки наборов malloc.

Примечание: Следующие возможности подсистемы 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

Опции переменной MALLOCBUCKETS

number_of_buckets:n
Опция number_of_buckets:n задает число наборов в куче, где n - число наборов. Значение n применяется ко всем доступным кучам.

По умолчанию число наборов в куче равно 16. Минимальное значение - 1. Максимальное значение - 128.

bucket_sizing_factor:n
Опция bucket_sizing_factor:n задает коэффициент размера набора, где n - коэффициент размера набора в байтах.

Значение параметра bucket_sizing_factor должно быть кратно 8 в 32-разрядном приложении, и 16 - в 64-разрядном приложении. По умолчанию применяется коэффициент размера набора 32 для 32-разрядных приложений и 64 - для 64-разрядных приложений.

blocks_per_bucket:n
Опция blocks_per_bucket:n задает первоначальное число блоков в каждом наборе, где n - число блоков. Это значение применяется ко всем наборам. Значение n также применяется при автоматическом увеличении набора, если все его блоки уже распределены.

По умолчанию для параметра blocks_per_bucket установлено значение 1024.

bucket_statistics:[stdout|stderr|полное_имя_файла]
Если указана опция bucket_statistics и включена поддержка наборов malloc, подсистема malloc выводит статистический отчет по наборам malloc по завершении каждого процесса, вызывающего подсистему malloc. Этот отчет содержит информацию о параметрах наборов и число запросов на выделение памяти, выполненных для каждого набора. При применении поддержки нескольких куч malloc, число запросов на выделение памяти, указанное для каждого набора, представляет собой сумму всех запросов на выделение памяти, выполненных для этого набора из всех куч.

Статистический отчет по наборам направляется в один из следующих выводов, в соответствии со значением опции bucket_statistics.

Если указано пользовательское полное_имя_файла, статистические данные добавляются в конец файла.

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

По умолчанию опция bucket_statistics отключена.

Примечания:

  1. Для первого набора будет показан один дополнительный запрос для функции atexit(), которая выводит статистический отчет.
  2. Статистические данные для процессов с нитями будут содержать дополнительные запросы на выделение памяти для некоторых наборов из-за вызовов подсистемы malloc из библиотеки pthreads.

Опции настройки наборов Malloc по умолчанию

Приведенная ниже таблица содержит значения опций настройки наборов 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.


[ Страница назад | Страница вперед | Содержание | Индекс | Библиотека | Юридическая информация | Поиск ]