【问题标题】:Does malloc allocated fragmented chunks?malloc 是否分配了碎片块?
【发布时间】:2020-07-24 16:17:29
【问题描述】:

我发现有用于连续内存分配的内核驱动程序。我虽然 malloc 合并内存并返回最佳匹配,如果内存不可用,它将返回 0。如果 malloc 只分配连续内存,那么需要像 PMEM 这样的连续内存分配器。

我的问题如下

  1. 是不是因为虚拟内存没有碎片,而物理页面是碎片的?

// Assuming we have 20bytes of heap(excluding malloc header information)
p1 = malloc(4)
p2 = malloc(3)
p3 = malloc(3)
p4 = malloc(10) // total 20bytes allocd
free(p2)
free(p4) // free 10 + 3 = 13.
malloc(13)????? // Would this fail because of no large enough chunk or does it fragment?
// If it allocates where in the malloc header or payload does it store the next chunk information.

谢谢。

【问题讨论】:

    标签: heap-memory glibc memory-fragmentation


    【解决方案1】:

    glibc 的malloc 由于 ABI 和实现限制而向上取整分配大小。在 64 位架构上,所有分配最终都将使用相同的内部大小。

    关于碎片的问题:原始 dlmalloc 代码(glibc malloc 最终基于该代码)实际上在大多数情况下合并了空闲块,但在一些涉及较大应用程序的极端情况除外。这并不是算法上的限制,而是不想实现某种形式的平衡树数据结构的结果。 (目前的 dlmalloc 没有这个特别的限制。)

    然而,多年来,glibc 在这个低级合并分配器之上分层了各种分配器。如今,有原子 fastbin 和 tcache 分配。从较低级别的分配器的角度来看,这些仍然在使用中,因此它们不能与相邻的分配合并。

    【讨论】:

      猜你喜欢
      • 2010-10-12
      • 1970-01-01
      • 2021-01-07
      • 1970-01-01
      • 2014-02-02
      • 2018-02-12
      • 2014-07-13
      • 1970-01-01
      相关资源
      最近更新 更多