- 分配器维护空闲链表数组,每个大小类一个空闲链表
- 当分配器需要一个大小为n的块时:
- 搜索相应的空闲链表,其大小要满足m > n
- 如果找到了合适的块:
- 拆分块,并将剩余部分插入到适当的可选列表中
- 如果找不到合适的块, 就搜索下一个更大的大小类的空闲链表
- 直到找到为止
- 如果空闲链表中没有合适的块:
- 向操作系统请求额外的堆内存 (使用sbrk())
- 从这个新的堆内存中分配出 n 字节
- 将剩余部分放置在适当的大小类中
- 释放块:
- 合并,并将结果放置到相应的空闲链表中
- 分离适配的优势
- 更高的吞吐量
- log time for power-of-two size classes 按照2的幂得到各类使用 log 时间
- 更高的内存使用率
- 对分离空闲链表的简单的 首次适配搜索 搜索,其内存利用率近似于对整个堆的最佳适配搜索的内存利用率.
- 极端示例:如果每个块都属于它本身尺寸的大小类,那么就相当于最佳适应算法
- 更高的吞吐量