Режим с несколькими кучами malloc
По умолчанию подсистема malloc использует одну кучу (пул свободной памяти).
Однако в ней предусмотрены средства для организации нескольких куч.
Организация нескольких куч в подсистеме malloc позволяет увеличить производительность многонитевых приложений в многопроцессорных системах. Если в подсистеме malloc применяется только одна куча, то запросы на выделение памяти, поступающие от нитей разных процессоров, обрабатываются по очереди. В этом случае подсистема malloc может в каждый момент времени обслуживать только одну нить, в результате чего значительно снижается производительность многопроцессорной системы.
В режиме нескольких куч подсистема malloc создает фиксированное количество куч. Как только процесс создает вторую нить (т.е. становится многонитевым), подсистема malloc начинает использовать несколько куч. Каждый запрос на выделение памяти обслуживается в одной из доступных куч. За счет этого подсистема malloc может распараллеливать запросы, поступающие от нескольких нитей, по крайней мере до тех пор, пока количество нитей не больше, чем число куч.
Если количество нитей, одновременно обращающихся к malloc, превысит количество куч, то лишние запросы будут обрабатываться по очереди. При условии, что такие ситуации возникают сравнительно редко, общая производительность подсистемы malloc значительно увеличится в случае, когда несколько нитей одновременно вызывают функцию malloc в многопроцессорной среде.
Включение режима нескольких куч подсистемы malloc
По умолчанию подсистема malloc работает с одной кучей. Для работы с
несколькими кучами нужно задать переменную среды
MALLOCOPTIONS.
При задании перед запуском процесса опции
MALLOCOPTIONS=multiheap поддержка нескольких куч будет использовать
параметры по умолчанию. При таком значении переменной
MALLOCOPTIONS подсистема malloc перейдет в режим
нескольких куч со стандартными параметрами (32 кучи и быстрый алгоритм выбора
кучи).
Параметры режима нескольких куч malloc
Параметры режима нескольких куч malloc перечислены ниже:
- multiheap:n
- considersize
Все эти опции подробно описаны ниже.
Они задаются в следующем формате:
MALLOCOPTIONS=[multiheap:n] | [considersize]Можно указать одну из опций или две опции через запятую. Порядок опций не важен. Например:
MALLOCOPTIONS=multiheap:3,considersizeВ данном случае будет применяться три кучи и медленный алгоритм выбора кучи, минимизирующий размер процесса.
Каждая опция конфигурации может быть указана в переменной MALLOCOPTIONS не более одного раза. Если какая-либо опция указана несколько раз, то будет применяться последнее из указанных значений.
Параметры режима нескольких куч malloc описаны ниже:
- multiheap:n
- По умолчанию максимальное число куч равно 32. С помощью опции multiheap:n можно изменить этот максимум на любое число от 1 до 32, указав его в параметре n. Если n будет находиться вне допустимого диапазона, будет применяться значение по умолчанию (32). Включайте ровно столько куч, сколько их нужно процессам. Лишние кучи приведут к увеличению фрагментации и растрате ресурсов.
- considersize
- По умолчанию при работе с несколькими кучами подсистема malloc направляет каждый запрос в следующую свободную кучу. Если будет указана опция considersize, подсистема malloc будет применять другой алгоритм выбора кучи, который выбирает ту свободную кучу, в которой достаточно памяти для выполнения запроса. Это позволяет сократить рабочий набор процесса за счет уменьшения количества вызовов функции sbrk. С другой стороны, в режиме considersize алгоритм выбора кучи выполняет дополнительные действия, поэтому он работает медленнее, чем стандартный алгоритм.
Если в кучах невозможно выделить память, то функция malloc возвращает значение NULL и код ошибки errno, равный ENOMEM. Если в текущей куче недостаточно памяти, то подсистема malloc попытается выделить память в другой свободной куче.