C中的Malloc内存消耗行为

3

我编写了这个程序来了解内存消耗模式。

#include <stdio.h>
#include <stdlib.h>

int main()
{
   int i=0;

   while(1 < 2) {
   int *str = (int *) malloc(100000000);

   if(str == NULL) {
      printf("Out of memory.. %d", i);
      return(1);
   }
   printf("Attempt Count = %d\n", i++);

   }

   return(0);
}

在我的系统中,我有8GB的内存。每个malloc调用将尝试存储100MB。因此,我期望我的程序在(10*8)次循环后会崩溃。但计数器远远超过了600,000。我无法理解这种情况。请帮忙解释一下。
即使考虑所有交换空间等,它也不应该增加超过16GB,这似乎在这里不太可能。

2
这取决于malloc()的实现方式。在Linux上,malloc会进行过度分配。 - P.P
指定操作系统 - Aniket Inge
@hmjd 是的!它是Ubuntu操作系统。 - LPD
2个回答

4
这是因为在Linux中,由于未初始化内存,您还没有使用malloc的内存。您可以malloc比您拥有的内存(物理+虚拟)更多,因为内核会延迟分配内存直到您实际使用它。我认为这是为了增加程序不因内存限制而失败的机会,但这并不是问题所在。callocmalloc相同,但对内存进行零初始化。当您请求页面内存时,Linux已经将其进行了零初始化。因此,如果calloc可以确定它请求的内存刚刚从内核请求,它实际上不需要对其进行零初始化!由于它没有这样做,因此无法访问该内存,因此它应该能够请求更多内存。请查看此答案。它提供了一个非常好的解释。此外,只是通过malloc,程序不会崩溃;当空间不足时,它将返回NULL

我使用了 calloc 但仍然看到相同的结果。 - LPD

1
在现代操作系统中,你的进程使用的内存是虚拟内存,它不受物理 RAM 大小的限制。它使用磁盘上的交换空间,以允许处理比 RAM 大得多的进程。
此外,一些操作系统允许过度承诺。你可以分配比交换空间实际可用的更多虚拟内存。只有当其中一个进程尝试使用太多内存时,才会发生故障。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接