gdc2011's paper.
UnealMemoryAllocator
上来先分析了unreal的memory allocator不给力,在于:
- 不支持多个heap
- 并不是native的面向MultiThread和MultiCore
- 用一个全局lock来保证thread safe,这个性能很差
- 的确是有些operation会有很大的stall
另外一个他们game里面用的mem mgr,也有一些问题,其实也就是这个paper要解决的一部分问题:
- 线程安全
- virtual memory aware
- fragment
GlobalLock
这个可以说是最不好的多线程解决方式:
- 所有的操作(无论多小)都会有不小的代价,
- 某些类似realloc的操作代价尤其大
解决方案:
- virtual memory aware dynamic backstore and large allocations
- lock free
- multiple heaps
- tracking and debugging
使用混合的heap:
- 大size的直接用os的heap
- 中间的和小的各用不同的heap进行管理
![](http://static.oschina.net/uploads/img/201203/09140946_kzNG.gif)
其中各自占有的size和count的数据很重要:
![](http://static.oschina.net/uploads/img/201203/09140946_T8fZ.gif)
分布:
![](http://static.oschina.net/uploads/img/201203/09140947_O7qM.gif)
小内存分配:
- 使用bining allocator(分级allocator,link:)
- 使用lock striping(lock per bin, link:)
- lock free alloc
- lookaside cache(),
- 是维护一个lock free的list(也就是dlmalloc里说的cache的一种),list耗光了之后再从chunk里分配一个list
- 一些基本的lockfree做法就是典型的CAS这种
- striping lock free:(lock striping[] :use different lock for different data)