我意识到内部malloc
调用mmap
并NULL
作为第一个参数传递给 ,mmap
以便内核将为映射选择合适的虚拟地址,这意味着malloc
不一定会在堆区域中创建映射(由 brk 指针指示)。如果这是真的,则意味着多次调用后虚拟内存中的每个块之间将存在很多间隙,malloc
因为每次调用malloc
都返回一个与前一个不连续的新虚拟地址
我的问题:
答案1
malloc
使用时mmap
,不关心程序中断。malloc
它使用两组内存:堆(程序中断之前的区域),它直接管理自己(使用 GNU C 库中的 arenas),以及mmap
ed 分配,它们委托给mmap
.程序中断跟踪第一组内存,而不是第二组。不要求第二个是连续的。释放的块由各自的分配器合并。如果内存是由
malloc
without分配的mmap
,则这是malloc
的责任(或free
s)。如果内存是使用 分配的mmap
,则这是mmap
的责任(或munmap
)。对于mmap
ed 块,合并空闲块甚至可能没有任何意义——如果它们从地址空间中删除,则无能为力。 ed 块可能会发生合并mmap
,但如果两个地址空间分配是连续的并且具有相同的权限,则它会发生在分配时。