程序员效率工具:Walloc( 二 )


小对象小对象是从独立的空闲列表中分配的 。 最小单位为8个字节 。 小对象分配打包在统一分配大小的块中 。 对于从1到6个字节 , 然后是8、10、16和32个字节的每种大小分配 。 共有10种尺寸 。
例如 , 从16个字节的块中满足12个字节的分配 。 每个尺寸类别都有其自己的空闲列表 。
struct small_object_freelist {struct small_object_freelist * next; }; struct small_object_freelist small_object_freelists [10];分配时 , 如果相应的空闲列表上没有任何内容 , walloc将分配一个新的大对象 , 然后将其页眉中的块类型更改为size类 。 然后 , 它遍历新的块 , 将对象彼此穿线到空闲列表上 。
程序员效率工具:Walloc文章插图
在此示例中 , 假设4字节空闲指针列表为空 , 并且大对象空闲指针列表仅包含大对象2 , 一直到页面末尾 。 这里分配了一个新的4字节块 , 将第一个块从大对象中分离出来 , 然后将新裁剪的大对象推回到大对象空闲指针列表中 , 从而适当地更新了页眉 。 然后 , 将新块中的4字节(分配线程组合在一起(该块可容纳8个字节) , 将它们视为struct freelist实例 , 将它们推入4字节 的全局空闲列表分配 。
程序员效率工具:Walloc文章插图
释放一个小对象会将其推回其大小所在的空闲指针列表 。 给定一个指针 , 我们可以通过查看页面标题中的块类型来了解其大小分类 。