我是 Linux 和 C 的新手,只是想问brk
调用 malloc 后指针如何增长。我们知道内核维护了一个brk指针,指向堆顶。假设当我们调用malloc
分配所请求的内存时没有可用的空闲块,并且我们知道内部malloc
调用。mmap
以下是我的问题:
Q1-当内部malloc
调用时,确实作为第一个参数传递给起始地址,例如:mmap
malloc
brk
mmap
//not 100% correct onlyfor demo purpose
// void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset);
void *malloc(size_t size){
...
mmap(brk, size,...);
... //line x
}
Q2-内部的其他代码部分(上面第 x 行之后)是否malloc
会brk
增长?还是mmap
内部让其brk
成长?
答案1
具体细节取决于malloc
实现,但至少在 Doug Lea 的实现中(GNU C 库中默认使用的),mmap
并且sbrk
是独立使用的。
malloc
调用时mmap
,mmap
不带基地址;实际上,它将分配委托给内核(在调整请求的大小以考虑对齐约束之后)。不需要mmap
ed 内存与现有堆连续,或者可以将其重新用于任何其他分配。mmap
不碰brk
。如果malloc
最终没有使用mmap
,则直接调用sbrk
。实施情况文件顶部的注释中有详细描述;如果您想遵循malloc
代码,请查找该sysmalloc
函数,并记住该代码中的mmap
isMMAP
和sbrk
is 。MORECORE