Linux-Kernel
呼叫 malloc 後 brk 指針如何增長
我是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 }
malloc
Q2-裡面的其他程式碼部分(上面第x行之後)brk
是否增長?還是mmap
在內部使brk
增長?
細節取決於
malloc
實現,但至少在 Doug Lea 的實現中(在 GNU C 庫中預設使用),mmap
並且sbrk
是獨立使用的。
malloc
呼叫時mmap
,不使用mmap
基地址;實際上,它將分配委託給核心(在調整請求的大小以考慮對齊約束之後)。不期望mmap
ed 記憶體與現有堆連續,或者它可以重新用於任何其他分配。mmap
不碰brk
。如果malloc
最終沒有使用mmap
,它會直接呼叫sbrk
。文件頂部的註釋中詳細描述了實現;如果您想遵循malloc
程式碼,請查找sysmalloc
函式,並記住程式碼中的mmap
isMMAP
和sbrk
isMORECORE
。