#allocator #allocation #slab #class #metadata #operating

slitter

一个专注于安全的C和Rust可调用的slab分配器

1个不稳定版本

0.1.0 2021年7月30日

#314内存管理

Download history 396/week @ 2024-03-13 277/week @ 2024-03-20 102/week @ 2024-03-27 133/week @ 2024-04-03 108/week @ 2024-04-10 170/week @ 2024-04-17 76/week @ 2024-04-24 262/week @ 2024-05-01 282/week @ 2024-05-08 186/week @ 2024-05-15 141/week @ 2024-05-22 136/week @ 2024-05-29 225/week @ 2024-06-05 169/week @ 2024-06-12 141/week @ 2024-06-19 163/week @ 2024-06-26

717每月下载量

MIT许可证

180KB
3.5K SLoC

Slitter是一个更安全的slab分配器

Slitter是一个经典结构的线程缓存slab分配器,旨在帮助编写可靠的长时间运行的程序。

鉴于这个目标,Slitter并不优先考虑速度。主要目标是帮助应用程序处理不可避免的内存管理错误——无论是通过内置的统计信息,还是在运行时检测,或者通过控制其爆炸半径——同时保持分配器的性能与最先进的技术相竞争。另一个重要的目标是让应用程序自定义Slitter从操作系统请求内存的方式。

有关分配性能的详细信息,请参阅doc/fast_path.md。对于分配器其余部分的概述,请参阅doc/design.md。由于类型稳定性保证,外部碎片化基本上不在考虑范围内,slab/heap pointer分配方案将内部碎片化保持在非常低的水平(仅用于元数据和保护页,大约2-3%,一旦我们添加内部保护页,还会更高)。

当前保证

  1. Slitter会在回收分配时检测到不匹配的类,并且当它收到一个它不管理的地址时,通常会崩溃。没有这个保证,堆使用统计信息很容易变得毫无用处,并且不正确的释放调用可能变成内存损坏,远远不是错误的调用。

  2. Slitter没有任何带内元数据。这意味着没有元数据靠近应用程序的分配,容易发生缓冲区溢出(我们在数据和元数据之间保持保护页),也没有易受use-after-free攻击的侵入式链表。

  3. Slitter分配的数据具有稳定的类型:一旦地址被返回给给定分配类的mutator,该地址始终有效,并且始终用于该类的数据。根据第2点,Slitter不使用侵入式链表,因此数据反映了应用程序存储的内容,即使它已经被回收。这使得应用程序代码可以在非阻塞算法中依赖无害的use-after-free,而不是例如SMR。这个保证还意味着任何双重释放或恶意use-after-free只会影响有缺陷的分配类。

未来保证

  1. Slitter将检测到内部指针被释放。

  2. Slitter将检测到大多数跨分配类的缓冲区溢出,使用保护页。

  3. 切割机将始终检测它不管理的地址的空闲。

  4. 切割机将检测大多数连续的双空闲。

未来功能

a. 切割机将允许每个分配类决定其支持内存应该如何分配(例如,冷数据可以生活在文件支持的映射中,用于可选交换)。

b. 切割机将跟踪每个分配类中分配和回收的对象数量。

c. 切割机将采样一小部分分配以进行堆分析。

依赖关系

~2–10MB
~115K SLoC