繁体   English   中英

我可以运行该程序多少次

[英]How many times could I run this program

我有一台具有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次,为什么?

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

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

由于您实际上不对内存做任何事情,因此您可以使用虚拟内存来使内核过度使用(即为您提供的内存超过实际提供的内存)。

100M的20倍几乎接近2GB,因此您似乎使用的是32位操作系统,为操作系统保留了2GB的空间,为用户空间进程保留了2GB的地址空间。 因此,无论您的计算机实际有多少内存,2GB绝对是您可以在此过程中解决的绝对最大内存量。

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

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

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

这里的基本概念是malloc虚拟内存分配可用内存块。

因此,不要指望只有128M的可用内存,而是更多,这取决于操作系统从何处分配内存。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM