2015-02-13 4 views
0

Как задает заголовок,Как узнать доступную виртуальную память внутри приложения

Можно ли знать, доступную в настоящее время виртуальной памяти (который размещаемый на таНос/ттар) внутри приложения с помощью программно?

Что я ищу некоторый вид функции

unsigned int free_mem(); 

, который будет возвращать размер распределяемой памяти по таНосу или ттару.

+0

Вы всегда можете прочитать '/ proc/meminfo' –

+0

Вы уверены, что это то, что вам нужно? объем свободной памяти не означает непрерывный блок свободной памяти. Скажем, если у вас есть 100 байт свободной памяти, это не значит, что вы можете использовать это для выделения массива, которому требуется 90 байт. Память разделена на куски переменных размеров. – Pandrei

+0

@Joachim Нет, я имел в виду виртуальную память для процесса. – jaeyong

ответ

1

Поскольку вы явно говорите о имеющейся в наличии виртуальной памяти, вам нужно найти части виртуального адресного пространства, которые в настоящее время нераспределены. Информация о сегментах доступна в proc/self/smaps.

Однако размер виртуального адресного пространства определяется процессором, на котором выполняется ваша программа. Это не 64 бит на 64 битном процессоре, но может быть определена cat /proc/cpuinfo | grep "address sizes", которая дает

address sizes : 42 bits physical, 48 bits virtual 
address sizes : 42 bits physical, 48 bits virtual 
address sizes : 42 bits physical, 48 bits virtual 
address sizes : 42 bits physical, 48 bits virtual 
address sizes : 42 bits physical, 48 bits virtual 
address sizes : 42 bits physical, 48 bits virtual 
address sizes : 42 bits physical, 48 bits virtual 
address sizes : 42 bits physical, 48 bits virtual 

на виртуальной машине я в настоящее время тестирования его.

Обратите внимание, что общий объем доступного виртуального адресного пространства отличается от наибольшей суммы, выделяемой за один раз, поскольку вы можете только mmap последовательный объем памяти.

Для примера рассмотрим простой случай 32-битных указателей со следующими сегментами:

00020000-000204ff /usr/bin/executable 
00030000-0003ffff [heap] 
7ff80000-7ff9ffff [stack] 

В этом случае самый большой непрерывный сегмент является 7ffA000-ffffffff, но общее количество доступной виртуальной памяти лишь немного меньше, чем 4 GB.

Обратите внимание, что malloc может удовлетворить ваш запрос, не требуя дополнительной виртуальной памяти, повторно используя уже запрошенные страницы. Количество доступного этого способа зависит от многих факторов (размер распределения или распределения, состояние кучи) и не может быть запрошен каким-либо переносным способом. Это держит двойной, если кто-то LD_PRELOADs another malloc implementation.

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