当前位置: 技术问答>linux和unix
请教,使用malloc函数分配内存的问题!
来源: 互联网 发布时间:2016-10-10
本文导语: 在Linux下,想了解下内存分配,于是简单写了一个小逻辑,主要代码为: #define ONE_KB 1024 int main() { char *p = NULL; int count = 0; while (1) { p = (...
在Linux下,想了解下内存分配,于是简单写了一个小逻辑,主要代码为:
#define ONE_KB 1024
int main()
{
char *p = NULL;
int count = 0;
while (1)
{
p = (char*)malloc(ONE_KB);
if (p != NULL)
{
count++;
printf("%d KB Memory allocated !n", count);
}
else
{
sleep(5);
printf("Memory allocate error!");
exit(0);
}
}
exit(0);
}
运行的时候,通过资源管理器,可以看到这个程序的进程内存占用不断增大,最后因为内存不够程序自动退出,内存被释放。到这里大家都能理解。
但是我把程序修改一下,每次分配1MB的内存:
#define ONE_MB 1024*1024
p = (char*)malloc(ONE_MB);
这时运行的时候,从资源管理器里再查看进程内存情况,发现该进程内存只有几百来K,并且几乎不怎么增加,按理说应该快速以1MB的速度递增,但是内存几乎保持不便,从标准输出情况来看,内存不断被分配:
printf("%d MB Memory allocated !n", count);
最终程序执行结束,可通过查看内存占用情况则明显没有被分配。
难道Linux在动态分配内存时,单次分配较小内存(比如1KB)时则直接分配真实内存,分配较大内存时则是虚拟的分配,即不直接分配真实的物理内存,而是分配一个地址,当真的需要用到该内存时才真正分配内存。 是这样的吗?搞不清楚,请高手指点。
#define ONE_KB 1024
int main()
{
char *p = NULL;
int count = 0;
while (1)
{
p = (char*)malloc(ONE_KB);
if (p != NULL)
{
count++;
printf("%d KB Memory allocated !n", count);
}
else
{
sleep(5);
printf("Memory allocate error!");
exit(0);
}
}
exit(0);
}
运行的时候,通过资源管理器,可以看到这个程序的进程内存占用不断增大,最后因为内存不够程序自动退出,内存被释放。到这里大家都能理解。
但是我把程序修改一下,每次分配1MB的内存:
#define ONE_MB 1024*1024
p = (char*)malloc(ONE_MB);
这时运行的时候,从资源管理器里再查看进程内存情况,发现该进程内存只有几百来K,并且几乎不怎么增加,按理说应该快速以1MB的速度递增,但是内存几乎保持不便,从标准输出情况来看,内存不断被分配:
printf("%d MB Memory allocated !n", count);
最终程序执行结束,可通过查看内存占用情况则明显没有被分配。
难道Linux在动态分配内存时,单次分配较小内存(比如1KB)时则直接分配真实内存,分配较大内存时则是虚拟的分配,即不直接分配真实的物理内存,而是分配一个地址,当真的需要用到该内存时才真正分配内存。 是这样的吗?搞不清楚,请高手指点。
|
首先,如果只使用malloc申请了一块内存,但没有使用它,那么Linux只为其分配一个虚拟空间(VmSize增大),实际的物理内存没有变化,而且分配时最小单位是4K。
当进程想glibc申请内存时,大于某个阈值(M_MMAP_THRESHOLD),glibc便会采用mmaps来为进程分配一块虚拟地址空间。小于这个值使用brk。缺省情况下是128K。可以通过下面函数来设置:
上述内容摘自我提到的这本书,相信你的问题这本书里能找到答案。
当进程想glibc申请内存时,大于某个阈值(M_MMAP_THRESHOLD),glibc便会采用mmaps来为进程分配一块虚拟地址空间。小于这个值使用brk。缺省情况下是128K。可以通过下面函数来设置:
#include
int mallopt(int param,int value)
上述内容摘自我提到的这本书,相信你的问题这本书里能找到答案。
|
malloc后memset(p,0xff,ONE_KB)试试。