【发布时间】:2021-01-10 05:28:24
【问题描述】:
我们知道malloc 在内部调用mmap。但是mmap不一定会映射到堆上,因为mmap可以将对象映射到虚拟内存中的任意区域,那么malloc在内部如何确保请求的内存大小来自堆呢?
【问题讨论】:
-
你有一个错误的前提。堆是
malloc()使用的任何内存,它不是特定的内存区域。 -
另外,
mmap()只是实现malloc()的一种可能方式。传统方式使用sbrk(),它只是扩展了数据段,所以它是连续的。 -
另外说:“堆”被定义为malloc交给你的任何内存。它从哪里获得它是一个内部细节,该细节因平台而异(例如,在嵌入式上,如果你有malloc,你通常会硬编码编译时可用的物理内存的一部分)。
-
对。堆不是虚拟内存的单个区域。它是
malloc()管理的所有内存区域的集合。 -
@Barmar Linux 进程确实有一个“特殊”的虚拟机区域,它称为“堆”。只需
grep heap /proc/self/maps。这仅适用于brk获得的内存。第一个参数为 NULL 的常规mmap(无论是由malloc调用还是其他)不会在该区域创建映射。因此,并非所有 malloc 的内存都是“堆”;-) 请不要没有真正的苏格兰人。
标签: c linux dynamic-memory-allocation virtual-memory