我有一台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次,为什么?
答案 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
的可用内存,而是更多,取决于操作系统从哪里分配内存。