C语言 获取最大可用堆内存



我目前正在尝试计算出能够通过 C 中的 malloc(( 命令分配的最大内存。 到目前为止,我已经尝试了一个简单的算法,该算法递增随后将分配的计数器。如果 malloc 命令返回"NULL",我知道没有足够的可用内存。

ULONG ulMaxSize = 0;
for (ULONG ulSize = /*0x40036FF0*/ 0x40A00000; ulSize <= 0xffffffff; ulSize++)
{
void* pBuffer = malloc(ulSize);
if (pBuffer == NULL)
{
ulMaxSize = ulSize - 1;
break;
}
free(pBuffer);
}
void* pMaxBuffer = malloc(ulMaxSize);

但是,由于 malloc(( 命令被证明是一项耗时的任务,因此该算法执行的时间很长。

我现在的问题是,是否有更有效的算法来找到能够分配的最大内存?

可以分配的最大内存主要取决于几个因素:

  • 进程的地址空间限制(最大内存、虚拟内存和友元(。
  • 可用的虚拟空间
  • 可用物理空间
  • 碎片,这将限制连续内存块的大小。
  • 。其他限制...

从您的描述(极慢(来看,该过程开始使用交换,与实际内存相比,这是非常慢的。

考虑以下替代方法

  • 对于地址空间限制,请查看ulimit -a(或使用getrlimit从C程序访问相同的数据( - 查找"最大内存大小"和"虚拟内存">
  • 对于交换空间,物理内存 - 顶部
ulimit -a (filtered)
data seg size           (kbytes, -d) unlimited
max memory size         (kbytes, -m) 2048
stack size              (kbytes, -s) 8192
virtual memory          (kbytes, -v) unlimited

从实际的角度来看,鉴于程序无法控制系统资源,您应该关注"最大内存大小"。

除了使用操作系统特定的API来获取这样的数字:

  • sysinfoLinux 或从/proc/meminfo中读取(
  • win32 的GlobalMemoryStatusEx

您也可以执行二叉搜索,但不建议这样做,因为系统的状态可能会发生变化,并且结果可能会随时间而变化:

ULONG getMax() {
ULONG min = 0x0;
ULONG max = 0xffffffff;
void* t = malloc(max);
if(t!=NULL) {
free(t);
return max;
}
while(max-min > 1) {
ULONG mid = min + (max - min) / 2;
t = malloc(mid);
if(t == NULL) {
max = mid;
continue;
}
free(t);
min = mid;
}
return min;
}

相关内容

  • 没有找到相关文章

最新更新