#分配器 #无std #分箱分配器

无std rsbmalloc

一个简单但快速的Rust分箱分配器。无std情况下单线程,否则多线程

6个版本

0.4.4 2024年4月23日
0.4.3 2023年8月29日
0.4.0 2023年6月7日
0.3.1 2023年4月3日

#175 in 内存管理

每月26次下载

MIT/Apache

29KB
698 代码行

rsbmalloc

一个用于Rust的分箱分配器。它相当简单,但单线程和多线程都相当快。单线程时通常与内置分配器相似,有时更快,但有时内存使用更高。多线程时,速度从相似到相当慢。

完全依赖于线程本地缓存以支持多线程。第一次分配时创建4倍的CPU数量,之后不再创建,因此每个“线程本地”缓存都是完全线程安全的,以防在线程之间重用。

rsbmalloc 完全是一个分箱分配器,箱从4字节到16 KiB(一些ARM页面大小是16 KiB)。如果一个分配大于16 KiB,它将被计为一个大型分配,并直接转到 mmapmunmap。因此,在Rust中释放时,它会被 munmap-ed。然而,箱按需一次分配一个页面,并且永远不会释放回操作系统。释放的槽位仅作为可以由同一线程(或得分相同的线程缓存的其他线程)重用的链表。

它实现了 GlobalAllocator 特性,并附带了一个单线程的 no_std 版本。no_std 版本仍然需要带有 mmapmunmap 的 libc 或 Windows,但它不依赖于Rust标准库。请注意,no_std 版本仍然是线程安全的,它只是不使用线程本地缓存,因此在多线程操作时速度会慢很多。另一方面,它使用的内存更少,如果没有锁竞争,速度会相似。一旦 allocator-api 稳定,它应该很容易移植到那里。

rsbmalloccrsbmalloc 提供了一个稍微慢一些的C接口,包括标准名称(mallocfree)和前缀名称(rsbmallocrsbfree)。

rsbmalloc 还暴露了它底层的页面分配器。

这是一个Broch Web Solutions项目。

查看博客文章获取更多信息。

依赖项

~225KB