Распределение памяти имеет два разных значения, которые обычно пересекаются в подобных вопросах.
- память сделана доступной для процесса системным вызовом sbrk
- памяти назначается для некоторой цели в контексте программы с помощью malloc ()
системный вызов sbrk сообщает ядру, чтобы он подготовил больше памяти на случай, если процесс понадобится. память фактически не отображается в адресное пространство процессов до тех пор, пока она непосредственно не будет записана. Это называется поиском по запросу. Обычно право доступа к этой памяти никогда не отменяется операционной системой, пока процесс не завершится. Если памяти становится мало, то kswapd (часть ядра) переставляет на диск наименее используемые части, чтобы освободить место. Ядро может принудительно установить жесткое ограничение на количество памяти в рабочем наборе процессов, если хотите :)
Второй контекст - это то, о чем вы говорите, когда вызываете malloc / free. malloc хранит список доступной памяти и передает запросы на ваши функции по запросу. если он обнаружит, что у него недостаточно памяти для выполнения запроса, он вызовет sbrk, чтобы позволить процессу получить больше доступа.
когда вы посмотрите на вывод top, вы увидите два числа для использования памяти процессами. Один для «виртуального размера» и «резидентного размера», виртуальный размер - это общая сумма, к которой процесс запросил доступ. размер резидента - это сумма, которая активно используется процессом в данный момент.