8个版本
0.1.11 | 2024年8月11日 |
---|---|
0.1.10 | 2024年8月10日 |
0.1.7 | 2024年6月30日 |
0.0.0 |
|
#81 in 内存管理
1,095 每月下载量
在 3 个Crates中使用 (直接使用2个)
205KB
4.5K SLoC
rarena-allocator
简介
rarena-allocator
是一个无锁的并发安全ARENA实现,底层内存可以来自分配或内存映射,这意味着分配器可以被恢复。
有三种主要内存类型
对齐向量
- 基于文件的内存映射
- 匿名内存映射
有三种类型的空闲列表
-
无
禁用空闲列表,一旦主内存耗尽,则此ARENA无法再进行分配。
-
乐观
一个按段大小(降序)排序的无锁链表,在分配时弹出头部段。
例如。
空闲列表:
100 -> 96 -> 50
。头部段的大小为
100
,我们想要20
,那么头部将从链表中删除,提供20
,剩余的80
将如果大于ArenaOptions::minimum_segment_size()
则被重新插入空闲列表。在此分配之后,空闲列表将变为
96 -> 80 -> 50
。 -
悲观
一个按段大小(升序)排序的无锁链表,在分配时查找最合适的段。
例如。
空闲列表:
42 -> 84 -> 100
。如果我们想要
50
,那么将从链表中移除第二个段,并返回50
,剩余的34
如果大于ArenaOptions::minimum_segment_size()
,则将被插入到空闲列表中。此分配之后,空闲列表将是
34 -> 42 -> 100
。
实现中使用的分配策略是:首先尝试从主内存分配,主内存是只增长的,因此如果主内存有足够的空间,则非常快。同时,ARENA 将收集丢弃的段来构建空闲列表(无锁链表)。当主内存没有空间时,ARENA 将尝试从空闲列表分配。
此crate包含许多不安全代码,尽管此crate的主要功能已通过 miri
、loom
和 sanitizer
进行了充分测试,但请自行承担使用风险。
内存布局
-
纯内存布局,仅支持此布局的
Vec
和匿名内存映射支持的内存,此布局无法恢复。-------------------------------------- | 1 byte | ...... | -------------------------------------- | reserved as null pointer | data | --------------------------------------
-
统一内存布局,所有3个支持的内存都将使用相同的内存布局。由
ArenaOptions::with_unify(true)
控制。-------------------------------------------------------------------------------------------------------------- | 1 byte | 1 byte | 2 bytes | 2 bytes | 2 bytes | 32 bytes | ...... | -------------------------------------------------------------------------------------------------------------- | reserved as null pointer | freelist kind | magic text | external version | version | header | data | --------------------------------------------------------------------------------------------------------------
安装
[dependencies]
rarena-allocator = "0.1"
-
no_std
[dependencies] rarena-allocator = { version = "0.1", default-features = false, features = ["alloc"] }
-
启用内存映射支持的内存
[dependencies] rarena-allocator = { version = "0.1", features = ["memmap"] }
许可
rarena-allocator
受 MIT 许可证和 Apache 许可证(版本 2.0)的约束。
有关详细信息,请参阅 LICENSE-APACHE、LICENSE-MIT。
版权 (c) 2024 Al Liu。
依赖关系
~0.1–28MB
~413K SLoC