我可以运行多少次这个程序

时间:2010-07-23 08:30:47

标签: c

我有一台128M内存的机器,这就是程序。

while(1)
{    
    ptr = malloc(1024 * 1024 * 100);
    if (NULL == ptr)
    {
        printf("malloc 100M Failed\n");
       return 1;
    }
    n+=100;
    printf("malloc %dM\n", n);
}

我从输出中发现malloc运行了20次,为什么?

5 个答案:

答案 0 :(得分:4)

因为您的程序正在分配virtual memory。在32位进程中(在Windows上 - 其他操作系统略有不同),您通常会获得2GB的虚拟地址空间来分配内存。操作系统将内存映射到“交换文件”和物理内存之间(在您的情况下,由于您只有128MB的物理内存,因此您分配的大部分内存仅在交换文件中)。

所以100MB * 20 =“大约”2GB,这就解释了为什么你可以运行20个循环。

答案 1 :(得分:2)

由于您实际上没有对内存执行任何操作,因此您可以通过使用虚拟内存来使内核过度提交(即,提供比实际提供的内存更多的内存)。

20倍100M非常接近2GB,所以看起来你正在使用一个32位操作系统,它可以为操作系统使用2GB,为用户空间进程留出2GB的地址空间。因此,无论您的计算机实际拥有多少内存,2GB都是您在此过程中可能解决的绝对最大内存量。

答案 2 :(得分:1)

很难说 - 这取决于底层操作系统如何为您提供内存。

它不一定是物理内存,它可以驻留在交换空间中,或者它可能根本不分配任何东西,而是选择在使用内存时进行分配,而不是在你要求时分配它。

答案 3 :(得分:1)

在未启用PAE的32位平台上,您的虚拟地址空间应为2 ^ 32字节。看起来你的平台允许你在放下脚步之前分配大约一半的费用。

答案 4 :(得分:0)

这里的基本概念是malloc虚拟内存中分配空闲内存块

所以不要指望只有128M的可用内存,而是更多,取决于操作系统从哪里分配内存。