正如标题所要求的,
是否可以知道当前可用的虚拟内存(可由malloc/mmap分配)程序化?
我要找的是某种功能
unsigned int free_mem();
它将返回malloc或mmap可分配的内存大小。
由于您明确谈论的是可用的虚拟内存,因此需要查找虚拟地址空间中当前未分配的部分。分段信息在proc/self/smaps
中可用。
然而,虚拟地址空间的大小由程序执行的cpu决定。这不是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
,但可用虚拟内存的总量仅略小于4GB。
还要注意的是,malloc
可以通过重用已请求的页面来满足您的请求,而不需要更多的虚拟内存。以这种方式可用的数量取决于许多因素(一个或多个分配的大小、堆的状态),并且不能以任何可移植的方式进行查询。如果某个LD_PRELOAD
是另一个malloc
实现,则此值为双值。