每一篇关于内存分配的文章似乎都解释了如何mmap
使用或如何sbrk
使用,而不考虑如何将这些与堆关联起来。
我已经收集到堆在内存分配中的作用几乎是微不足道的——事实上,我不确定它的作用:D,我请求有人让我感到困惑。
这是我的理解:
1) 当内存被分配时,未初始化数据段的末尾,BSS,被扩展。这种扩展(例如将地址移动x
到x-n
)是调用 的结果sbrk
。在这个模型中,内存被分配到将 BSS 段头的位置减少了的n
字节(假设每个地址对应一个字节) 。sbrk
这个模型现在已经过时了。有些人将堆定义为所有此类扩展的聚合空间。其他人没有——在后一种情况下,堆有什么作用?
2)在现代内存分配方案中,堆确实存在(出于什么原因,我也不确定)。为了分配内存,malloc
内部用于mmap
将数据存储到作为页面集合的内存区域中。这些内存区域独立于堆。
TLDR:
对于旧系统:如果内存分配存储在增加末端 BSS 的偏移量后获得的地址空间中,那么堆是否有任何用途?
对于较新的系统:假设 mmap 主要用于内存分配,那么堆的用途是什么?
在这两种情况下,堆真的有用吗?