Ferroc 内存分配器:现已发布第一个预发布正式版

💡 原文中文,约3900字,阅读约需10分钟。
📝

内容提要

Ferroc v1.0.0-pre.1已在crates.io上发布,包括减小allocate_*函数接口大小、优化代码生成和添加对C/C++的支持等改进。文章还解释了TLS缓存的使用,并提供了手动和自动管理缓存生命周期的示例。此外,还讨论了使用THREAD_DATA作为全局分配器的挑战,并提供了手动管理的替代方法。文章最后给出了C/C++用户下载和安装Ferroc库的说明。

🔎

延伸解读

预发布版的核心变化

Ferroc v1.0.0-pre.1 作为首个预发布正式版,主要调整了 allocate_* 系列函数的接口,将 Result 的错误类型简化为 core::alloc::AllocError,并新增 error-log 功能来记录错误日志。同时,TLS 变量改用专门的缓存结构体,减少线程交替时的内存重复分配,并进行了尾调用、冷热路径分离等代码生成优化。此外,暂时移除了数据统计和大于 10MB 对齐的内存块分配支持,但增加了 C/C++ 的使用支持。

TLS 缓存的生命周期管理选择

ferroc::heap::ThreadLocal 提供了手动和自动两种缓存生命周期管理方式。自动管理通过 ThreadData 实现,可分配在栈上作为临时上下文,或存储在 TLS 变量中。但文章指出,由于 Rust 的 TLS 变量存储和销毁依赖堆内存,直接将 ThreadData 包装为全局分配器会导致递归爆栈,此时自动管理不再有效,需要改用手动管理。手动管理依赖 ThreadLocal 的 assign、get 和 put 方法,其中后两者为 unsafe,并需配合 register_thread_dtor

手动管理的两种模式与优化

文章给出了手动管理缓存的两种示例:一是存储线程唯一的缓存 ID,二是直接存储线程本地堆的引用。前者优势是简单,后者则能优化代码路径——deallocate 不需要当前 Heap 初始化,而 allocate 可能需要。后者的 fallback 可作为参数传入 Heap::allocate_with 成员函数,用于当前堆未初始化时的替代。此外,直接使用 ferroc::config! 或默认的 ferroc::Ferroc 最为方便,其内部默认使用了 ThreadLocal。

C/C++ 用户的构建与配置要点

C/C++ 用户需先通过 rustup 安装 nightly 工具链,然后使用 cmake 和 make 构建,注意目标目录不要改为 build 等其他名称。生成的文件包括 target/libferroc.so、target/libferroc.a 和 ferroc.h,可通过 sudo make install 安装。CMake 支持通用配置选项如 -DCMAKE_BUILD_TYPE 和 --install-prefix,还提供自定义选项:FE_TRACK_VALGRIND 用于 valgrind 追踪内存

❓

Q&A

Ferroc v1.0.0-pre.1的主要改动是什么?

主要改动包括减小allocate_*函数接口的Result大小、优化代码生成和增加C/C++支持。

如何在C/C++中使用Ferroc库?

C/C++用户可以通过Rust工具链下载和安装Ferroc库,并使用CMake进行构建。

Ferroc的TLS缓存是如何工作的?

Ferroc的TLS缓存使用专门的缓存结构体,支持手动或自动管理缓存的生命周期,减少内存重复分配。

Ferroc支持哪些内存管理方式?

Ferroc支持手动和自动管理缓存生命周期,用户可以根据需要选择不同的管理方式。

Ferroc的基准测试结果如何?

基准测试结果更新了时间和内存消耗,具体数据在文章中未提供,欢迎用户试用并反馈。

Ferroc的错误处理机制是怎样的?

Ferroc通过开启新增的error-log功能来记录错误日志,具体Error类型变为core::alloc::AllocError。

🏷️

标签

➡️

继续阅读