linux的内存管理机制?大量malloc,大量free出现疑似泄漏。
在写一个高并发的文件服务器,发现在10K并发的任务处理完毕之后,top看到依然占用了极高的内存。但是使用valgrind并未发现泄漏。
于是写了这样一个测试程序
#include <stdlib.h>
#include <stdio.h>
int main()
{
char *p;
int i,j;
char c;
for(i = 0;i != 1024;++i)
{
p = malloc(64*1024);
for(j = 0;j != 64*1024;++j)
p = 1;//产生页错误分配实际帧
}
for(i = 0;i != 1024-1;++i)
free(p);
printf("pause,input any key\n");
scanf("%c",&c);
free(p);
while(1);
return 0;
}top里面如下
25574 tedcy 20 0 6960864m384 S0.01.8 0:00.20 pts/8 mem_test
输入一个字母以后
25574 tedcy 20 04056604392 R 99.70.0 0:11.66 pts/8 mem_test
可以看到在最后一个元素free以后,内存占用从64M降为604
很是疑惑不解。free是如何工作的? 我觉得是kernel没有得到空闲的周期去处理memory的回收任务。
改成这样试试。
for(i = 0;i != 1024-1;++i)
{
free(p);
usleep(1000);
} 你都不验证内存分配成功不成功?
还有,malloc实现方式好想是调用系统调用sys_brk据说也有用mmap的(我不确定),不知道记错了名字没有,这个系统调用可以缩小或者扩大空间,而malloc就是管理他分配的内存,但是free的时候不见得会马上掉用sys_brk缩小空间,可能暂时的保存已经分配好的空间,下次要在调用malloc的话,就可以直接分配,而不用调用sys_brk,所以会出现上述现象。
上面的回答,可能用词不准确,我没记住那些专业词语,大概就是这个意思。 顺便问一句,你们需要招人吗?大四快毕业了,求带走。
页:
[1]