1个不稳定版本
0.1.0 | 2021年7月31日 |
---|
#17 在 #set-bit
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相同的语义,而不需要使用固定大小的内存块。