【发布时间】:2020-08-12 17:31:54
【问题描述】:
我正在研究内存管理,并且对 malloc 的工作原理有疑问。 malloc man page 声明:
通常,
malloc()从堆中分配内存,并调整 堆大小根据需要使用sbrk(2)。分配块时 大于MMAP_THRESHOLD字节的内存,glibcmalloc()实现将内存分配为私有匿名映射 使用mmap(2)。MMAP_THRESHOLD默认为 128 kB,但 使用mallopt(3)进行调整。
为了验证,我用一段代码做了一个实验:
#include<stdlib.h>
#include<stdio.h>
int main()
{
int size = 10;
int *p = malloc(size);
if(p)
{
printf("allocated %d bytes at addr: %p \n", size, p);
free(p);
}
else
{
free(p);
}
return 0;
}
我用strace 跟踪了这个程序,看看使用了什么系统调用。结果如下:
为什么在这个例子中 malloc 调用 mmap 而不是 brk?
【问题讨论】:
-
您的屏幕截图清楚地显示了对
brk的调用,而不是对mmap的调用(尽管不确定是您的malloc引起的,因为malloc在没有系统调用的情况下分块分配和打包) .您是否对流程初始化中的mmap调用感到困惑?只是做例如printf("Hello World\n")查看初始化何时结束以及您的main何时开始。
标签: c linux memory-management malloc