unix - dlmalloc 如何合并 block ?

标签 unix memory-management malloc

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

dlmalloc block 由一些元数据预订,其中包括有关 block 中空间量的信息。两个连续的空闲 block 可能看起来像

[metadata | X bytes free space | metadata ][metadata | X bytes free space | metadata]
                Block A                                     Block B

在这种情况下,我们希望将 block B 合并到 block A。现在 多少字节的空闲空间应该阻塞一个报告?

我觉得应该是2X + 2 size(metadata) bytes ,因为现在合并的 block 看起来像:
[metadata | X bytes free space   metadata  metadata   X bytes free space  | metadata]

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

最佳答案

您可以通过 looking at the source 自己查看答案.以 line 1876 开头验证您的图表。元数据只有两个 size_t无符号整数,通过别名 struct malloc_chunk (line 1847 访问)。字段 prev_size是前一个 block 的大小,size是这个的大小。两者都包括 struct malloc_chunk 的大小本身。在几乎所有机器上这将是 8 或 16 字节,具体取决于代码是针对 32 位还是 64 位寻址编译的。

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

所以 - 是的 - 在标记为 /* consolidate backward */ 的代码块中和 /* consolidate forward */ ,当他添加前面和后面的 block 的大小时,他隐含地添加了 struct malloc_chunk 的大小正如你所怀疑的那样。

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

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

关于unix - dlmalloc 如何合并 block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44213973/

相关文章:

将 malloc 转换为原始类型

bash - 删除除最后一行以外的所有以相同字符串开头的行

c - 我怎样才能终止系统()?

c - 有多个 fork 和额外的打印品

c++读取文件并将整数存储在 vector 中。最终占用的内存比实际文件大小多 5 倍

c++ - 我是否需要删除使用 new 和 placement 构造的对象

c - 为什么我要 free() 一个由 malloc() 分配的对象?

Bash 脚本,执行命令,在每一行前加上给定的字符串

ios - 尝试减少 for 循环 Swift 中的内存影响 (4)

c - 内联结构内链表的循环分配不分配内存