Ferroc:一个无锁、可移植的堆内存分配器

Ferroc:一个无锁、可移植的堆内存分配器

💡 原文中文,约2800字,阅读约需7分钟。
📝

内容提要

Ferroc是一个用Rust编写的无锁、可移植的堆内存分配器,目标是性能打平主流的内存分配器,并提供多种自定义配置。可以作为全局内存分配器使用,也可以使用config!宏进行自定义配置。还提供了Arenas、Context和Heap等结构体。支持基准测试。目前仅支持最新的Nightly通道的Rust编译器。

🔎

延伸解读

适用场景与限制

Ferroc 设计为可移植的无锁堆分配器,目标性能对齐 mimalloc、tcmalloc 等主流分配器,并支持裸机、嵌入式等环境。但当前仅支持最新 Nightly 通道的 Rust 编译器,且部分基准测试尚未跑通,因此更适合愿意跟进 Nightly 特性、对稳定性要求不苛刻的实验性项目或研究场景。

配置灵活性

通过 config! 系列宏,用户可自定义内存来源(如 mmap 或静态内存)并管理静态内存块。若需更细粒度控制,可直接使用 Arenas、Context 和 Heap 结构体,其中 Arenas 是 Send 和 Sync,而 Context 和 Heap 不是。这种分层设计便于适配不同平台,但需注意 TLS 变量默认泄露等细节。

功能特性与集成

Cargo 功能列表提供了统计内存分配(stat)、静态基础分配器(base-static)、mmap 分配器(base-mmap)、全局分配器宏(global)、C 接口(c)以及 Valgrind 跟踪(track-valgrind)等选项。默认配置基于 Mmap 和 pthread,包含所有功能。若需替换系统 malloc,可启用 c 功能并指定 --cfg sys_alloc。

性能参考与注意事项

基准测试基于 mimalloc-bench 子集,在 16GB 内存、Intel i7-10750H 的笔记本上运行,提供了耗时和内存占用数据。但测试环境单一,且部分测试未完成,因此性能结论需谨慎对待。实际选用时,建议结合自身负载和硬件进行验证,并关注 Nightly 编译器的兼容性风险。

❓

Q&A

Ferroc是什么?它有什么主要特点?

Ferroc是一个用Rust编写的无锁、可移植的堆内存分配器,主要参考了mimalloc。它的设计目标是性能打平主流内存分配器(如mimalloc、tcmalloc),并提供多种自定义配置以移植到各种环境,比如裸机和嵌入式平台。

如何将Ferroc用作全局内存分配器?

可以将Ferroc作为全局内存分配器使用,示例代码如下: ```rust use ferroc::Ferroc; #[global_allocator] static FERROC: Ferroc = Ferroc; fn main() { let _vec = vec![10; 100]; let layout = std::alloc::Layout::new::<u8>(); let ptr = Ferroc.allocate(layout).unwrap(); unsafe { Ferroc.deallocate(ptr, layout) }; Ferroc.collect(false); } ```

Ferroc支持哪些自定义配置?如何配置?

Ferroc支持通过config!系列宏进行自定义配置,例如选择从mmap系统调用获取新内存还是仅分配静态内存。示例: ```rust const HEADER_CAP: usize = 4096; ferroc::config!(pub Custom => ferroc::base::Static::<HEADER_CAP>); #[global_allocator] static CUSTOM: Custom = Custom; let chunk = unsafe { Chunk::from_static(...) }; CUSTOM.manage(chunk); let _vec = vec![10; 100]; ``` 此外,还可以直接使用内部结构体Arenas、Context和Heap进行更灵活的控制。

Ferroc提供了哪些Cargo功能?

Ferroc的Cargo功能包括:基本功能(公开Arenas、Context和Heap)、"stat"(统计内存分配数据)、"base-static"(默认静态内存基础分配器Static)、"base-mmap"(使用OS虚拟内存函数的基础分配器Mmap,依赖std)、"global"(config!和config_mod!等配置宏)、"libc"(libc依赖项)、"default"(默认分配器,基于Mmap和pthread选项)、"c"(生成C系列函数和头文件ferroc.h)、"track-valgrind"(基于crabgrind的Valgrind内存跟踪检查器)。

Ferroc的基准测试结果如何?

Ferroc的基准测试使用mimalloc-bench的一部分子集,在16GB内存和Intel i7-10750H CPU @ 2.60GHz的笔记本电脑上运行。测试结果包括花费时间和内存占用,具体数据未在文中给出,但设计目标是性能打平主流内存分配器。

Ferroc目前有哪些缺点或限制?

Ferroc目前仅支持最新的Nightly通道的Rust编译器,并且malloc-bench中其他的一部分测试还尚未跑通。

Ferroc的许可证是什么?

Ferroc的许可证是MIT OR Apache-2.0。

🏷️

标签

➡️

继续阅读