12个版本

0.2.3 2019年4月13日
0.2.2 2019年4月13日
0.1.7 2019年4月12日

291内存管理

Download history 34/week @ 2024-02-26 4/week @ 2024-03-11 210/week @ 2024-04-01

214 每月下载量
context-coroutine 中使用

MIT 协议

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,可以从BumpAllocatorBitSetAllocatorMultipleBinarySearchTreeAllocator中选择。
  • MemoryMapAllocator,一个NUMA感知的mmap分配器,支持NUMA策略。
  • GlobalThreadAndCoroutineSwitchableAllocator,适用于替换全局分配器,并提供全局、线程局部和上下文(协程)局部需要的可切换分配器;必须使用宏global_thread_and_coroutine_switchable_allocator创建。

分配器使用MemorySource来获取和释放内存。提供的内存源包括:

  • MemoryMapSource,对于线程局部分配器很有用,因为它可以从NUMA本地内存中获取内存。
  • ArenaMemorySource,一个由内存源支持的固定块区域;这对于在上下文中使用时作为BumpAllocatorBitSetAllocator的源很有用。

此外,还提供了一些适配器:

  • AllocatorAdaptor,是AllocatorGlobalAllocAlloc的适配器;通过调用Allocator.adapt()来使用它。
  • GlobalAllocToAllocatorAdaptor,是GlobalAllocAllocator的适配器,对于将全局分配器分配给GlobalThreadAndCoroutineSwitchableAllocator很有用。
  • AllocToAllocatorAdaptor,是AllocAllocator的适配器。

当使用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