[英]not all malloc'ed memory is "heap" and each block is not contiguous in virtual memory?
似乎malloc
內部調用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(NULL, size,...);
...
}
所以malloc
傳遞NULL
作為mmap
作為起始地址的第一個參數,因此內核會選擇一個合適的虛擬地址進行映射,這意味着malloc
不一定會在堆區域(由brk
指針指示)創建映射。
如果這是真的,那意味着在多次malloc
調用后,虛擬內存中的每個塊之間會有很多間隙,因為每個malloc
返回一個新的虛擬地址,該地址與前一個不連續,而這些虛擬地址與brk
無關,所以一旦我們釋放了一個特定的塊,那么我們就不能將相鄰的空閑塊與我們釋放的塊合並,因為每個塊在虛擬內存中都不連續,那么這種動態內存分配是不是非常低效?
在malloc
對大塊使用mmap
的原因正是當塊被釋放時,當它被munmap
ped 時,它可以被操作系統回收。
這與標准的 brk/sbrk“堆”不同,在這種情況下幾乎不可能將程序分解,因為堆的使用正是因為分配/解除分配不需要以精確的 LIFO 順序發生 - 那么你的唯一的希望是嘗試合並相鄰的空閑內存塊......
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.