目 录CONTENT

文章目录

mimalloc:面向现代的高性能、可扩展内存分配器

Administrator
2026-05-24 / 0 评论 / 0 点赞 / 0 阅读 / 0 字

📢 转载信息

原文链接:https://www.microsoft.com/en-us/research/blog/mimalloc-a-high-performance-scalable-memory-allocator-for-the-modern-era/

原文作者:Daan Leijen


概览

  • 当今的关键服务和应用程序通常具有极高的并发性,会使用数百个线程。同时,它们还在大规模内存下运行(特别是使用大语言模型时,内存需求常达数百GB)。
  • mimalloc 是一个开源的、现代化的、可扩展的内存分配器,可直接替代 mallocfree。它代码精简(约1.2万行),内部数据结构清晰,易于构建和集成。通过几乎完全依赖原子操作,它提供了有界的最坏情况分配时间、受控的空间开销、低内部碎片以及极小的争用。
  • mimalloc 已在 GitHub 开源,并拥有超过1.2万颗星。

关于 mimalloc

在微软研究院(MSR)的 RiSE 小组,我们专注于形式化方法、编程语言和软件工程的研究。mimalloc 内存分配器最初设计于 2020 年,旨在为 RiSE 开发的 LeanKoka 编程语言提供快速分配支持。这些语言采用了创新的编译器引导引用计数技术(Perceus)。

mimalloc 的可扩展设计在微软的大型服务中表现优异。通过与产品团队的紧密合作,mimalloc 显著提升了如 Bing 等服务的响应速度。如今,它广泛应用于各种大型服务,包括 NoGIL CPython 3.13+Unreal Engine 以及《死亡搁浅》(Death Stranding)等游戏。

快速路径设计

tcmallocjemalloc 等分配器类似,mimalloc 的核心设计原则是每个线程维护自己的线程本地堆(theap)。每个 theap 拥有一组通常为 64 KiB 的页面。通过为每个线程分配独立的页面,内存的分配与释放通常无需同步。仅在不同线程间释放内存时,才会涉及原子操作。

对于大多数小于 1 KiB 的小块分配,mimalloc 提供了极简的快速路径:

void* mi_malloc( size_t size ) {
  mi_theap_t* const theap = mi_get_thread_local_theap();
  if (size > MI_MAX_SMALL_SIZE) return mi_malloc_generic(theap,size);
  const size_t index = (size + sizeof(void*))/sizeof(void*);
  mi_page_t* const page = theap->small_pages[index];
  mi_block_t* const block = page->free;
  if (block == NULL) return mi_malloc_generic(theap,size);
  page->free = block->next;
  page->used++;
  return block;
}

内存碎片与管理

mimalloc 的每个页面包含三个自由列表:用于分配的自由列表、用于释放块的 local_free 列表,以及跨线程释放块的原子 thread_free 列表。这种设计确保了缓存局部性,并有效降低了多线程下的竞争概率。

高度平衡树

在处理线程间的内存共享时,mimalloc 引入了“页面窃取”(page stealing)技术。这使得线程可以在不进行昂贵的跨线程同步的情况下,获取页面的所有权,从而在实现卓越可扩展性的同时,保持了极高的内存使用效率。




🚀 想要体验更好更全面的AI调用?

欢迎使用青云聚合API,约为官网价格的十分之一,支持300+全球最新模型,以及全球各种生图生视频模型,无需翻墙高速稳定,文档丰富,小白也可以简单操作。

0

评论区