dlmalloc如何合并大块?

Mar*_*ark 7 unix malloc memory-management

以下是dlmalloc算法的详细说明:http://g.oswego.edu/dl/html/malloc.html

dlmalloc块由一些元数据预订,其中包含有关块中空间量的信息.两个连续的免费块可能看起来像

[metadata | X bytes free space | metadata ][metadata | X bytes free space | metadata]
                Block A                                     Block B
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我们希望将块B合并到块A中.现在有多少字节的可用空间应该阻止A报告?

我认为它应该是2X + 2 size(metadata) bytes,因为现在合并的块看起来像:

[metadata | X bytes free space   metadata  metadata   X bytes free space  | metadata]
Run Code Online (Sandbox Code Playgroud)

但我想知道这是否正确,因为我有一本教科书说元数据将报告,2X bytes 而不包括我们从能够写入元数据的额外空间.

Gen*_*ene 2

你自己看看源码就可以找到答案。从第 1876 行开始验证您的图表。元数据只是两个size_t无符号整数,通过别名 a 访问struct malloc_chunk(第 1847 行)。Field prev_size是前一个块的大小,size也是当前块的大小。两者都包括其本身的大小struct malloc_chunk。在几乎所有机器上,这将是 8 或 16 字节,具体取决于代码是针对 32 位还是 64 位寻址进行编译。

“正常情况”合并代码从第 3766 行开始。您可以看到size它用于跟踪合并的变量是大小。

所以 - 是的 - 在标记为/* consolidate backward */和 的代码块中,当他添加前面和后续块的大小时,他隐式添加了您怀疑/* consolidate forward */的大小。struct malloc_chunk

这说明你的理解是正确的。我的期望是,教科书作者只是对块大小(包括元数据)和分配给用户的内存块大小之间的差异感到草率。顺便说一句,在第 3397 行malloc处理了这个差异。

也许这里更大的教训是——当你试图学习任何东西时——你永远不应该错过直接查阅第一手资料并自己解决问题的机会。