malloc()
часто удовлетворяет запросы памяти, запрашивая у ОС новые страницы, например, через mmap
. Такие страницы обычно распределяются лениво: фактическая страница не выделяется до первого доступа .
То, что происходит затем, зависит от типа первого доступа: когда вы выполняете чтение сначала, Linux отобразит на общей доступной только для чтения COW страницу нулей, чтобы удовлетворить ее, а затем, если вы позже Вы пишете, что требуется вторая ошибка, чтобы выделить частную страницу для записи.
Когда вы просто делаете запись первым, первый шаг пропускается. Это обычный случай, так как код обычно не читает из недавно выделенной памяти, которая имеет неопределенное содержимое (по крайней мере, когда вы получаете его из malloc
).
Обратите внимание, что выше приведено описание того, как недавно выделенные страницы работают в Linux - когда вы используете malloc
, существует другой уровень: malloc
обычно будет пытаться удовлетворить запросы блоков, освобожденных ранее процессом, а не постоянно запрашивать новая память. В случае повторного использования памяти, она, как правило, уже будет выгружена, и вышеописанное не будет применяться. Конечно, для вашего первоначального большого выделения в 1024 МБ, где нет памяти для повторного использования, так что вы можете быть уверены, что распределитель получает его из ОС.