12个版本
0.2.3 | 2019年4月13日 |
---|---|
0.2.2 | 2019年4月13日 |
0.1.7 | 2019年4月12日 |
291 在 内存管理
214 每月下载量
在 context-coroutine 中使用
235KB
4.5K SLoC
context-allocator
这提供了一些适用于各种用例的分配器。
所有这些分配器都实现了::std::alloc::GlobalAlloc
和::std::alloc::Alloc
特质,以及一个通用的基特质Allocator
。
最有用的是全局分配器,它允许使用宏global_thread_and_coroutine_switchable_allocator()
在线程、协程和全局(以及可加锁的)内存分配器之间切换。
提供的分配器包括:
BumpAllocator
,一个不会释放的bump分配器,对重新分配最后一个分配进行了轻微优化。BitSetAllocator
,一个使用空闲块位集的分配器;使用64位块以优化搜索。MultipleBinarySearchTreeAllocator
,一个高效的分配器,通过使用多个空闲块的红黑树来最小化碎片。ContextAllocator
,可以从BumpAllocator
、BitSetAllocator或
MultipleBinarySearchTreeAllocator
中选择。MemoryMapAllocator
,一个NUMA感知的mmap分配器,支持NUMA策略。GlobalThreadAndCoroutineSwitchableAllocator
,适用于替换全局分配器,并提供全局、线程局部和上下文(协程)局部需要的可切换分配器;必须使用宏global_thread_and_coroutine_switchable_allocator
创建。
分配器使用MemorySource
来获取和释放内存。提供的内存源包括:
MemoryMapSource
,对于线程局部分配器很有用,因为它可以从NUMA本地内存中获取内存。ArenaMemorySource
,一个由内存源支持的固定块区域;这对于在上下文中使用时作为BumpAllocator
和BitSetAllocator
的源很有用。
此外,还提供了一些适配器:
AllocatorAdaptor
,是Allocator
到GlobalAlloc
和Alloc
的适配器;通过调用Allocator.adapt()
来使用它。GlobalAllocToAllocatorAdaptor
,是GlobalAlloc
到Allocator
的适配器,对于将全局分配器分配给GlobalThreadAndCoroutineSwitchableAllocator
很有用。AllocToAllocatorAdaptor
,是Alloc
到Allocator
的适配器。
当使用GlobalThreadAndCoroutineSwitchableAllocator
时,可以保存和恢复当前运行上下文(协程)的分配器状态。还可以创建一个无锁、快速的线程局部分配器,它利用NUMA内存,与传统的malloc不同。
未来
- 调查包装Rampant Pixel的内存分配器。
- 调查使用DPDK的分配器。
- 调查基于B树的分配器。
- 调查使用多个双链表'空闲'块的设计;块的大小可以是可变的,但空闲列表是排序的
- 在特定空闲列表范围内迭代时,可能会遇到块太小,或者块太大以至于可以分割的情况。
- 此设计与DPDK使用的类似。
- 为了使分配器多线程,DPDK会在特定的'堆'上执行自旋锁,该'堆'是一组空闲列表。
- 调查为线程局部分配器提供一个备用的过大小分配器,这可能使用底层的
NumaMemoryMapSource
。 - 调查通过扫描最大的二叉搜索树中的连续块来在
MultipleBinarySearchTreeAllocator
中支持过大小分配。 - 调查基于持久内存的分配器。
- 正确支持过量分配和Alloc的grow_in_place函数,但仅当这些由下游集合使用时。
- 调查使用BMI1内建函数
_blsi_u64
(提取最低设置位)、_blsmsk_u64
和_blsr_u64
。
许可
本项目的许可协议是MIT。
依赖关系
~40–295KB