背景
设计一个在多线程环境下可以进行高效堆分配的内存分配器。
在多线程环境下,线程共享code, data, heap。因此,在从堆中获取数据时往往需要加锁等操作,从而降低性能。
内存分配需要考虑内容:
- thread contention
- memory fragmentation, heap 被分割成了不连续的小块
- false sharing, 多个线程修改位于同一缓存行的数据
设计思路
借鉴 Hoard 设计思路,设计多层结构,包括:
- 全局堆:管理所有内存资源,为各个处理器的本地堆提供内存。
- 本地堆:为每个线程分配自己的本地堆,本地堆管理其分配和释放的内存,减少了不同线程间的内存访问冲突
idea:
- lazy reclaim:
free()
时不直接将内存返回给system,而是加入一个free list
链表中 - 动态内存迁移:全局堆和本地堆之间的内存可以进行迁移。例如:如果一个本地堆的内存需求长期得不到满足,可以从全局堆迁移内存块给本地堆。当本地堆内存需求小时,可以将本地堆内存迁移至全局堆以便其他线程使用
- background thread for deallocation:一个线程专门定期将长期不用的block从本地堆转移至全局堆(动态内存迁移),或者释放回系统