mi-malloc 1.8/2.1
 
正在加载...
正在搜索...
无匹配项
mi-malloc

这是mimalloc分配器(发音为“me-malloc”)的API文档——一个具有出色性能特点的通用分配器。最初由Daan Leijen为KokaLean语言的运行时系统开发。

它是malloc的直接替代品,无需代码更改即可在其他程序中使用,例如,在Unix上您可以这样使用它:

> LD_PRELOAD=/usr/bin/libmimalloc.so myprogram

其设计值得注意的方面包括:

  • 小巧且一致:该库大约有8k行代码,使用简单一致的数据结构。这使得它非常适合集成和适应其他项目。对于运行时系统,它提供了用于单调“心跳”和延迟释放的钩子(用于具有引用计数的有界最坏情况时间)。部分由于其简单性,mimalloc已被移植到许多系统(Windows、macOS、Linux、WASM、各种BSD、Haiku、MUSL等),并且对动态重写具有出色的支持。同时,它是一个工业强度的分配器,在数千台机器上运行(非常)大规模的分布式服务,并具有出色的最坏情况延迟。
  • 空闲列表分片:我们不是为(每个大小类别)使用一个大的空闲列表,而是为每个“mimalloc页面”提供许多较小的列表,这减少了碎片并增加了局部性——在时间上接近分配的东西在内存中也会接近分配。(mimalloc页面包含一个大小类别的块,在64位系统上通常为64KiB)。
  • 空闲列表多重分片:这是个大创意!我们不仅按mimalloc页面对空闲列表进行分片,而且每个页面都有多个空闲列表。特别是,一个列表用于线程本地的free操作,另一个列表用于并发的free操作。从另一个线程释放现在可以是一个简单的CAS操作,而无需线程之间复杂的协调。由于将有数千个独立的空闲列表,竞争自然会分布在堆上,并且在单个位置上发生竞争的可能性将很低——这与跳表等随机算法非常相似,其中添加随机预言消除了对更复杂算法的需求。
  • 主动页面清除:当一个“页面”变空时(由于空闲列表分片而增加几率),内存被标记为操作系统未使用(重置或解除提交),从而减少(实际)内存压力和碎片,尤其是在长时间运行的程序中。
  • 安全mimalloc可以构建为安全模式,添加保护页、随机分配、加密空闲列表等,以防止各种堆漏洞。在我们的基准测试中,性能损失通常平均约为10%。
  • 一流堆:高效地创建和使用多个堆以在不同区域进行分配。一个堆可以一次性销毁,而无需单独解除分配每个对象。
  • 有界:它不会出现膨胀 [1],具有有界的最坏情况分配时间(wcat)(达到操作系统原语),有界空间开销(约0.2%元数据,内部碎片少),并且只使用原子操作,没有内部争用点。
  • 快速:在我们的基准测试中(参见下文),mimalloc优于其他领先的分配器(jemalloctcmallocHoard等),并且通常使用更少的内存。一个很好的特性是它在各种基准测试中始终表现良好。它还对大型服务器程序有很好的巨型OS页支持。

您可以在技术报告中阅读更多关于mimalloc设计的信息,其中还包含详细的基准测试结果。

更多信息