3 个版本 (稳定)
1.0.1 | 2024 年 2 月 17 日 |
---|---|
1.0.0 | 2024 年 2 月 8 日 |
0.1.3 | 2023 年 10 月 28 日 |
152 在 缓存 中排名
每月 39 次下载
68KB
1.5K SLoC
TMFAlloc: Rust 的事务内存映射文件分配器
受 POST++ 启发的交易内存映射文件分配器。允许将数据表示和存储层合并为一个层。可以用作固定模式的客户端缓存、嵌入式应用程序数据存储等。
特性
- 文件支持的内存映射存储。
- 实现
std::alloc::Allocator
特征,因此可以将常规std::collections::*
(除Hash*
外),std::boxed::Box
等. 容器存储在文件中并从文件中检索。 - 多线程代码中的单写多读。
- 写事务利用内存页面保护和写时复制日志文件。
- 存储具有用户定义的
Root
类型泛型参数,以存储所有应用程序特定的参数、集合等。 - 存储文件由
flock
保护,因此可以同时进行进程访问。 - 分配所有同样大小的块中地址最低的最小但适合的空闲块。
- 平均分配和释放成本是
O(log(空闲块数量))
(加上可能的文件操作成本)。 - 允许分配区域扩展。
- 在 Linux 和 Windows 上运行。
- 在 32 位和 64 位 CPU 上运行。
当前限制的注意事项
- 不要在父进程和
fork
子进程中同时使用相同的存储Holder
。 - 在非标准使用的情况下,无法保证避免指向未映射存储内存的悬空指针。
- 存储初始化后无法更改内存映射地址。因此,建议在存储初始化时明确指定内存映射地址。
- 内存分配量子在32位或64位架构上分别为32或64字节,这可能会被认为是浪费的。
1.0.1版本的新功能
tmfalloc::Allocator::{allocate, deallocate, grow, shrink}
现在如果当前线程没有为适当的存储地址空间打开写事务,则会触发panic。这是为了防止可能的泄露分配器的滥用。tests::allocator_leak_should_panic
用于测试这个panic。
待办事项列表
- 并发线程访问测试以检测竞争条件。
- 64字节的分配量子可能太多。两个包含空闲块的红黑树可能太慢。有什么建议可以提高这一点吗?
- 在信号处理器中通过主文件页
mlock
而不是通过日志文件立即fsync
来增加写入吞吐量和降低延迟。 - 100%代码行测试覆盖率。如何收集文档测试的覆盖率?
- 通过(重新)使用已提供的指针在(去/重新)分配时减少对红黑树的遍历。
许可协议
Apache License v2.0或MIT License
作者和反馈
Vladimir Voznesenskiy <[email protected]>。寻找Rust工作。
欢迎反馈。如果您需要更多测试等,请发邮件给我。
依赖项
~2–41MB
~631K SLoC