簡體   English   中英

並非所有 malloc 的內存都是“堆”,並且每個塊在虛擬內存中都不連續?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM