我目前正在尝试计算出能够通过 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来获取这样的数字:
sysinfo
Linux 或从/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;
}