0

Я понимаю, что в Linux mm_struct описывает структуру памяти процесса. Я также понимаю, что start_brk и brk обозначают начало и конец секции кучи процесса соответственно.Где находится куча?

Теперь это моя проблема: у меня есть процесс, для которого я написал исходный код, который выделяет 5,25 ГБ памяти кучи, используя malloc. Однако, когда я просматриваю процесс mm_sruct с использованием модуля ядра, я нахожу, что значение равно 135168. И это отличается от ожидаемого: я ожидал, что brk - start_brk будет равен чуть выше 5,25 ГБ.

Итак, что здесь происходит?

Спасибо.

+0

@hcs избили меня. Я предлагаю прочитать http://duartes.org/gustavo/blog/post/anatomy-of-a-program-in-memory/, в котором говорится: «В Linux, если вы запрашиваете большой блок памяти через malloc(), библиотека C создаст такое анонимное сопоставление вместо использования кучной памяти. «Большой» означает больше, чем байты MMAP_THRESHOLD, по умолчанию 128 kB и настраивается через mallopt() ». Вся статья стоит прочитать. – RJinman

ответ

2

Я заметил следующее в manpage for malloc(3):

Обычно, таНос() выделяет память из кучи, и регулирует размер кучи по мере необходимости, используя sbrk (2). При распределении блоков памяти, больших байтов MMAP_THRESHOLD, реализация glibc malloc() выделяет память как личное анонимное сопоставление с помощью mmap (2). По умолчанию MMAP_THRESHOLD составляет 128 kB, но настраивается с помощью mallopt (3). Выделения, выполняемые с помощью mmap (2), не зависят от предела ресурсов RLIMIT_DATA (см. Getrlimit (2)).

Так звучит как mmap используется вместо кучи.

+0

Спасибо hcs и @Rob Jinman. Теперь вопрос в том, где это память, описанная в «mm_struct»? – hebbo

Смежные вопросы