Поскольку вы явно говорите о имеющейся в наличии виртуальной памяти, вам нужно найти части виртуального адресного пространства, которые в настоящее время нераспределены. Информация о сегментах доступна в 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_PRELOAD
s another malloc
implementation.
Вы всегда можете прочитать '/ proc/meminfo' –
Вы уверены, что это то, что вам нужно? объем свободной памяти не означает непрерывный блок свободной памяти. Скажем, если у вас есть 100 байт свободной памяти, это не значит, что вы можете использовать это для выделения массива, которому требуется 90 байт. Память разделена на куски переменных размеров. – Pandrei
@Joachim Нет, я имел в виду виртуальную память для процесса. – jaeyong