Linux-Kernel

呼叫 malloc 後 brk 指針如何增長

  • September 23, 2020

我是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
}

mallocQ2-裡面的其他程式碼部分(上面第x行之後)brk是否增長?還是mmap在內部使brk增長?

細節取決於malloc實現,但至少在 Doug Lea 的實現中(在 GNU C 庫中預設使用),mmap並且sbrk是獨立使用的。

  1. malloc呼叫時mmap,不使用mmap基地址;實際上,它將分配委託給核心(在調整請求的大小以考慮對齊約束之後)。不期望mmaped 記憶體與現有堆連續,或者它可以重新用於任何其他分配。
  2. mmap不碰brk。如果malloc最終沒有使用mmap,它會直接呼叫sbrk。文件頂部的註釋中詳細描述了實現;如果您想遵循malloc程式碼,請查找sysmalloc函式,並記住程式碼中的mmapisMMAPsbrkis MORECORE

引用自:https://unix.stackexchange.com/questions/610939