[英]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.