【发布时间】:2013-11-28 06:54:45
【问题描述】:
所以我有一个分配 256 MB 内存的程序,在用户按下 ENTER 后,它会释放内存并终止。
#include <stdio.h>
#include <stdlib.h>
int main(void) {
char *p, s[2];
p = malloc(256 * 1024 * 1024);
if ( p == NULL)
exit(1);
printf("Allocated");
fgets(s, 2, stdin);
free(p);
return 0;
}
我多次运行这个程序,并将每个程序都设置为后台,直到没有足够的内存可以分配。然而,这永远不会发生。我运行了一个 linux top 命令,即使在多次运行该程序后,可用内存也从未减少近 256 MB。
但是,另一方面,如果我使用calloc 而不是malloc,那么会有很大的不同:
p = calloc(256 * 1024 * 1024, 1);
现在,如果我运行该程序并将其置于后台,然后重复,每次运行它时,可用内存都会减少 256 MB。为什么是这样?为什么malloc 不会导致可用内存发生变化,而calloc 会?
【问题讨论】:
-
通过 strace 运行程序,看看它做了什么。 (我希望 both 版本可以匿名映射 /dev/zero,顺便说一句)
-
简短而过于简单的答案是,由于您实际上还没有使用来自
malloc的内存,因此计算机还不需要实际将其提供给您。但是使用calloc,需要使用内存(用于归零部分),因此计算机实际上需要为您提供所有内存。 -
top和free命令的“可用内存”数字毫无意义。他们充其量只是在告诉您缓存效率。实际有意义的数字,提交费用,可以在/proc/meminfo中作为Committed_AS:行找到。 -
@DennisMeng:这仅适用于extremely primitive
callocimplementations - 但Ryan 显然正在使用其中之一。例如,BSD omalloc 通常不访问内存。
标签: c linux memory-management malloc