#allocator #memory-allocator #slab #kernel #lock-free #no-std #set-bit

nightly no-std slaballoc

no_std系统提供的安全无锁固定大小内存分配器

1个不稳定版本

0.1.0 2021年7月31日

#17#set-bit

Apache-2.0/MIT

13KB
202行(不包括注释)

slaballoc:一个兼容no-std、线程安全的固定大小内存分配器

你在裸机系统上需要分配单一类型的对象,并使用#[no_std]吗?你是否有需要多个线程或CPU核心同时访问分配器的需求?

无需再寻找!

这个crate提供了一个无锁的no_std兼容的slab分配器,用于固定大小分配。

这个slab分配器使用固定大小的内存块以及用于分配的[Sized]类型。slab分配器将内存块分为两部分:分配对象区域和分配位图区域。

位图将有mem_size / size_of::<T>()的位数,这样每个可能的槽位都有一个位。所以,对于4096字节的内存块和每个16字节的对象,位图将占用256位,或32字节。

| objects........................................ - bitmap |

请注意,位图将比必要的略大,因为它考虑了整个内存块(包括它所占用的部分)。这可以计算出来,但这是一种令人烦恼的自依赖关系,所以可能需要一些迭代。

然后可以使用原子内省无锁访问分配位图。在分配时,我们只需在位图中设置一个位,如果成功,则返回对应位对应的内存。在释放时,我们可以简单地清除位,从而释放内存。

替代方案

如果你在提供std的托管环境中使用Rust,你可能对使用sharded-slab感兴趣。这个crate提供了与这个crate相同的语义,而不需要使用固定大小的内存块。

无运行时依赖