调用 malloc 后,brk 指针如何增长

调用 malloc 后,brk 指针如何增长

我是 Linux 和 C 的新手,只是想问brk调用 malloc 后指针如何增长。我们知道内核维护了一个brk指针,指向堆顶。假设当我们调用malloc分配所请求的内存时没有可用的空闲块,并且我们知道内部malloc调用。mmap以下是我的问题:

Q1-当内部malloc调用时,确实作为第一个参数传递给起始地址,例如:mmapmallocbrkmmap

//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 行之后)是否mallocbrk增长?还是mmap内部让其brk成长?

答案1

具体细节取决于malloc实现,但至少在 Doug Lea 的实现中(GNU C 库中默认使用的),mmap并且sbrk是独立使用的。

  1. malloc调用时mmapmmap不带基地址;实际上,它将分配委托给内核(在调整请求的大小以考虑对齐约束之后)。不需要mmaped 内存与现有堆连续,或者可以将其重新用于任何其他分配。

  2. mmap不碰brk。如果malloc最终没有使用mmap,则直接调用sbrk实施情况文件顶部的注释中有详细描述;如果您想遵循malloc代码,请查找该sysmalloc函数,并记住该代码中的mmapisMMAPsbrkis 。MORECORE

相关内容