Как узнать размер блока виртуальной памяти в Unix

У меня есть программа, которая выделяет 4096 байт (4 КБ) в цикле, и после 4-й итерации я вижу, что размер виртуальной памяти увеличивается на 16 КБ. Это означает, что размер блока составляет 16 КБ. Что такое команда unix, чтобы найти это? Я могу использовать getconf PAGE_SIZE, чтобы получить размер страницы, который составляет 4 КБ, но мне нужно найти размер блока.


person Emil Tagiyev    schedule 21.10.2013    source источник
comment
Это похоже на деталь вашей библиотеки распределителя. стандартный размер страницы Linux составляет 4 КБ, но распределитель, вероятно, получает большие фрагменты за раз.   -  person Kerrek SB    schedule 22.10.2013


Ответы (1)


Предполагая, что вы используете glibc в обычной конфигурации, я действительно ожидаю, что ваше выделение памяти будет увеличиваться на 4 КБ за раз. Но, может быть, инструмент, который вы используете для просмотра размера, недостаточно точен, чтобы показать вам такую ​​небольшую разницу?

Очевидно, может случиться так, что ваш glibc сконфигурирован иначе, чем исходный код, который у меня есть, но он выделяет (через sbrk, который, в свою очередь, вызывает системный вызов brk) размер запрашиваемого вами блока, округленный до 4 КБ (точный исходный код). : size = (size + pagemask) & ~pagemask;, вскоре следует if (size > 0) brk = (char*)(MORECORE(size));.

Конечно, если вы сделаете x = malloc(4096);, фактическое выделение будет небольшим числом байтов, превышающим 4 КБ, поскольку malloc нужны дополнительные данные для отслеживания самого распределения (например, размер текущего выделения, размер предыдущего выделения). является). Все накладные расходы составляют как минимум 2 * sizeof(size_t) + 2 * sizeof(какой-то указатель) = 16 байтов в 32-битной системе, 32 байта в 64-битной системе. Это может быть больше, чем это.

person Mats Petersson    schedule 21.10.2013