Приращение указателя разрыва
#include <stdlib.h>unsigned int _amblksiz
Глобальная переменная _amblksiz - основной элемент, используемый для выделения памяти в куче с использованием mmap(). Все базовые операции mmap(), выполняемые при выделении памяти в куче, получают память, кратную _amblksiz. По умолчанию _amblksiz устанавливается в 8 × PSIZ
, или 32 KB. Значение должно быть кратно 4 KB и на данный момент ограничено 256 KB.
В текущей реализации выделения памяти запрос на выделение памяти больше, чем в 32 KB автоматически обрабатываются прямым вызовом mmap(), в то время как меньшие размеры обрабатываются механизмом разделения-объединения выделения памяти.
Значение _amblksiz влияет на любое выделение памяти, не превышающее 32 KB и требующее от ядра выделения памяти. Освободившаяся память в итоге вернется в систему, когда вся память, связанная с определенным выделением ядра, будет возвращена аллокатору. Несмотря на то, что блок может быть полностью возвращен аллокатору, аллокатор может в целях повышения эффективности сохранить локально некоторые блоки в куче (без немедленного возвращения памяти системе). Это позволяет избежать перебоев, когда аллокатор постоянно запрашивают о выделении и освобождении памяти в системе.
Есть несколько путей изменить значение _amblksiz:
unsigned _amblksiz = 8 * PSIZ;
Никаких проверок не выполняется, но новое определяемое значение должно быть кратно 4 KB. Установить новое значение _amblksiz можно в любой момент, изменение сразу вступает в силу.
![]() | Для многопоточной программы динамическое изменение данного значения не является безопасным. Многопоточное приложение должно устанавливать это значение как глобальное во время компиляции и использовать механизмы, указанные ниже, для безопасного управления _amblksiz. |
MALLOC_ARENA_SIZE
в значение, которое нужно связать с _amblksiz. Установка происходит при первой инициализации malloc(), поэтому это делается до какого-либо выделения. Указанное значение округляется до ближайшего кратного 4 KB. Значения свыше 0x40000
(256 KB) или ниже 4 KB в данный момент не принимаются.
0x40000
(256 KB) или ниже 4 KB в данный момент не принимаются.
Если size устанавливается в ноль, mallopt() возвращает текущее значение _amblksiz.
ЗОСРВ «Нейтрино»
Предыдущий раздел: Описание API системной библиотеки