0

似乎内部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传递,因此内核会为映射选择一个合适的虚拟地址,这意味着不一定会在堆区域中创建映射(由指针指示)。 NULLmmapmallocbrk在此处输入图像描述

malloc如果这是真的,这意味着在多次调用后虚拟内存中的每个块之间会有很多间隙,因为每个都malloc返回一个与前一个不连续的新虚拟地址,而这些虚拟地址与 无关brk,所以一次我们释放了一个特定的块,然后我们不能将相邻的空闲块与我们释放的块合并,因为每个块在虚拟内存中不连续,那么这种动态内存分配不是非常低效吗?

4

1 回答 1

0

大块mmap使用in的原因正是当块被释放时,它可以在被ped时被操作系统回收。mallocmunmap

这与标准的 brk/sbrk“堆”不同,在该“堆”中,几乎不可能移动程序崩溃,只是因为堆的使用正是因为分配/解除分配不需要以精确的 LIFO 顺序发生 - 然后你的唯一的希望是尝试合并相邻的空闲内存块......

于 2020-09-24T04:35:29.120 回答