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 而不包括我们从能够写入元数据的额外空间.
你自己看看源码就可以找到答案。从第 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处理了这个差异。
也许这里更大的教训是——当你试图学习任何东西时——你永远不应该错过直接查阅第一手资料并自己解决问题的机会。
| 归档时间: |
|
| 查看次数: |
261 次 |
| 最近记录: |