【发布时间】:2019-07-07 09:37:20
【问题描述】:
我正在写一个C测试程序,每隔一秒就连续调用一次malloc函数,目的是测试linux系统中运行的基于ARM的处理器的RAM限制,
我写了下面的代码,我之前在我的电脑(操作系统:ubuntu 16.04)上测试过,但是内存占用(VmRSS)并不是每秒都在变化,但我猜是每 10 秒一次,谁能解释一下原因?
FILE *trace;
int compteur=0;
char *var;
while (1)
{
trace=fopen("trace.txt","a");
compteur++;
var=(char *)malloc(100000);
fprintf(trace,"%d\n",compteur);
fclose(trace);
sleep(1);
}
我启动这个命令来检查程序的 RAM 占用情况
cat /proc/prog_pid/status | grep "VmRSS"
预期结果:RAM 每秒增加 100K
实际结果:RAM 每 10+ 秒增加 1M
【问题讨论】:
-
malloc的实现可能会以大块的方式从系统中获取内存。 -
操作系统不必每次都给它确切的内存量。对于执行大量小分配的程序来说,这将产生巨大的开销。相反,它可以只为程序提供一大块内存,然后在用完之前不必提供更多。
-
每次进程 malloc() 都会得到一个内存管理单元分配给它的页面,页面大小取决于你的系统配置。在此页面中存在内存之前,它不会增加大小。一旦它再次需要超过这个分配的空间,它就会得到一个新页面。所以你看到了这种行为。
-
获得内存限制比尝试耗尽它更明智的方法。以
/proc/meminfo为例。