1.12、为什么不全部都用brk

不全部都用 brk() 的原因主要涉及内存分配的灵活性、连续性限制和兼容性问题,具体可以从以下几个方面说明:

  1. 1. brk() 只能扩展连续的堆空间,限制较大
    brk() 和 sbrk() 通过调整进程的“break”值来扩展或缩减堆空间,这要求堆空间必须是连续的内存段。这带来两个问题:
  • • 如果堆顶附近还有未释放的小块内存,brk() 无法缩减堆空间,导致内存无法及时回收。
  • • 堆空间受限于进程初始堆的最大连续内存段大小,无法灵活扩展到任意地址。
  1. 2. brk() 不适合多线程环境
    brk() 在多线程程序中不被支持,调用会失败。而现代应用多为多线程,使用 brk() 会带来兼容性和安全性问题。
  2. 3. mmap() 提供更灵活的内存分配方式
    相比之下,mmap() 可以在虚拟地址空间中映射任意独立的内存区域,不要求连续性。这带来以下优势:
  • • 支持独立分配和释放大块内存,减少内存碎片。
  • • 不受限于堆的连续空间限制,可以映射更大或非连续的内存区域。
  • • 适合大块内存分配(如 malloc 中超过阈值的分配),提高效率和灵活性。
  1. 4. 兼顾性能和内存管理策略
    malloc 等分配器通常结合使用 brk() 和 mmap()
  • • 对小块内存使用 brk() 扩展堆,利用其连续性带来的访问局部性和性能优势。
  • • 对大块内存使用 mmap(),避免堆空间碎片和无法回收的问题。

这种混合策略兼顾了性能和内存管理的灵活性。

综上,不全部使用 brk() 是因为它的连续内存限制、多线程不支持以及堆空间扩展受限等缺陷,而 mmap() 提供了更灵活且适合大块内存分配的机制。现代内存分配器通常结合两者优势,提升整体效率和兼容性。
获取账号,可以解锁所有文章,有兴趣的朋友可以私聊我。
(加入我的知识星球,免费获取账号,解锁所有文章。)

阅读剩余
THE END