#arena-allocator #lock-free #arena #allocator #memory-map #linked-list #file-backed

no-std rarena-allocator

无锁的ARENA分配器,可用于内存和磁盘

8个版本

0.1.11 2024年8月11日
0.1.10 2024年8月10日
0.1.7 2024年6月30日
0.0.0 2024年6月4日

#81 in 内存管理

Download history 109/week @ 2024-06-03 664/week @ 2024-06-10 566/week @ 2024-06-17 449/week @ 2024-06-24 133/week @ 2024-07-01 230/week @ 2024-07-08 106/week @ 2024-07-15 113/week @ 2024-07-22 103/week @ 2024-07-29 390/week @ 2024-08-05 463/week @ 2024-08-12

1,095 每月下载量
3 个Crates中使用 (直接使用2个)

MIT/Apache

205KB
4.5K SLoC

rarena-allocator

无锁的ARENA分配器,可用于内存和磁盘。

github LoC Build codecov

docs.rs crates.io crates.io license

简介

rarena-allocator 是一个无锁的并发安全ARENA实现,底层内存可以来自分配或内存映射,这意味着分配器可以被恢复。

有三种主要内存类型

  1. 对齐向量
  2. 基于文件的内存映射
  3. 匿名内存映射

有三种类型的空闲列表

  1. 禁用空闲列表,一旦主内存耗尽,则此ARENA无法再进行分配。

  2. 乐观

    一个按段大小(降序)排序的无锁链表,在分配时弹出头部段。

    例如。

    空闲列表: 100 -> 96 -> 50

    头部段的大小为 100,我们想要 20,那么头部将从链表中删除,提供 20,剩余的 80 将如果大于 ArenaOptions::minimum_segment_size() 则被重新插入空闲列表。

    在此分配之后,空闲列表将变为 96 -> 80 -> 50

  3. 悲观

    一个按段大小(升序)排序的无锁链表,在分配时查找最合适的段。

    例如。

    空闲列表: 42 -> 84 -> 100

    如果我们想要 50,那么将从链表中移除第二个段,并返回 50,剩余的 34 如果大于 ArenaOptions::minimum_segment_size(),则将被插入到空闲列表中。

    此分配之后,空闲列表将是 34 -> 42 -> 100

实现中使用的分配策略是:首先尝试从主内存分配,主内存是只增长的,因此如果主内存有足够的空间,则非常快。同时,ARENA 将收集丢弃的段来构建空闲列表(无锁链表)。当主内存没有空间时,ARENA 将尝试从空闲列表分配。

此crate包含许多不安全代码,尽管此crate的主要功能已通过 miriloomsanitizer 进行了充分测试,但请自行承担使用风险。

内存布局

  • 纯内存布局,仅支持此布局的 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-APACHELICENSE-MIT

版权 (c) 2024 Al Liu。

依赖关系

~0.1–28MB
~413K SLoC