#内存分配器 #绑定 #mi-malloc #释放 #分配 #页面

sys mimalloc2-rust-sys

mimalloc_rust 手写 sys 绑定的分支

3 个版本

2.1.7-source2024年6月4日
2.1.4-source2024年4月24日
2.1.2-source2024年2月26日

#393 in 内存管理

Download history 137/week @ 2024-04-15 315/week @ 2024-04-22 296/week @ 2024-04-29 263/week @ 2024-05-06 67/week @ 2024-05-13 102/week @ 2024-05-20 136/week @ 2024-05-27 400/week @ 2024-06-03 11/week @ 2024-06-10 1/week @ 2024-06-17 216/week @ 2024-07-01 304/week @ 2024-07-08 295/week @ 2024-07-15 156/week @ 2024-07-22 87/week @ 2024-07-29

每月下载量 886
用于 2 个 crates(通过 mimalloc2-rust

MIT 许可证

520KB
10K SLoC

C 9K SLoC // 0.2% comments Rust 685 SLoC // 0.0% comments

mi-malloc

文档

  • 小巧且一致:该库大约有 8k 行代码,使用简单且一致的数据结构。这使得它在与其他项目的集成和适应性方面非常合适。对于运行时系统,它提供了用于单调心跳和延迟释放(对于有引用计数的边界最坏情况时间)的挂钩。
  • 空闲列表分片:我们不是只有一个大空闲列表(每个大小类别),而是每个“mimalloc 页面”都有多个较小的列表,这减少了碎片化并增加了局部性——时间上靠近分配的东西在内存中也靠近。 (一个 mimalloc 页面包含一个大小类别的块,在 64 位系统上通常是 64KiB)。
  • 空闲列表多分片:这个大想法!我们不仅按 mimalloc 页面对空闲列表进行分片,而且对每个页面我们还有多个空闲列表。特别是,有一个用于线程本地空闲操作的列表,还有一个用于并发空闲操作的列表。现在从另一个线程释放可以是一个单一的 CAS,而不需要线程间复杂的协调。由于将会有数千个单独的空闲列表,争用自然会分布到堆上,单个位置的争用概率会很低——这类似于跳表等随机算法,添加随机 oracle 可以消除更复杂算法的需要。
  • 渴望页面重置:当一个“页面”变成空的时候(由于空闲列表分片,增加了概率)内存被标记为操作系统上的未使用(“重置”或“清除”),减少了(实际)内存压力和碎片化,特别是在长时间运行程序中。
  • 安全:mimalloc 可以在安全模式下构建,添加保护页、随机分配、加密空闲列表等,以防止各种堆漏洞。性能损失平均只有大约 3%。在我们的基准测试中。
  • 一级堆:有效地创建和使用多个堆来在不同区域进行分配。可以一次销毁堆,而不是单独释放每个对象。
  • 有界:它不会出现爆炸现象,具有有界的最坏情况分配时间(wcat),有界的空间开销(约0.2%元数据,分配大小最多浪费12.5%),并且仅使用原子操作,没有内部争用点。
  • 快速:在我们的基准测试中(见下文),mimalloc优于所有其他主要分配器(jemalloc、tcmalloc、Hoard等),并且通常使用的内存更少(在最坏情况下多25%)。一个不错的特性是它在广泛的基准测试中都表现出色。

依赖项