【发布时间】:2021-01-10 07:11:15
【问题描述】:
似乎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无关,所以一旦我们释放了一个特定的块,那么我们就不能将相邻的空闲块与我们释放的块合并,因为每个块在虚拟内存中不连续,那么这种动态内存分配是不是非常低效?
【问题讨论】:
-
您的 64 位 CPU 有多少 TB 的内存?一个 64 位 CPU 可以寻址多少地址空间?假设您只有 16 TiB 的内存;它使用了可能的地址空间的 1/1024(小于 0.1%)。你暂时不会遇到问题。如果你只有 16 GiB 的内存,你说的是 16 TiB 机器使用的空间的 1/1024 - 你使用的地址空间甚至更小。
-
“堆”是一个逻辑概念-您发布的图表将通过
brk/sbrk从操作系统获得的实际内存与“堆”的逻辑概念混为一谈。 “堆”内存是实现想要用来满足对malloc()、calloc()等的调用的任何内存。例如,Hoard memory allocator 为其“堆”使用多个内存池。
标签: c linux dynamic-memory-allocation virtual-memory