1个不稳定版本
0.1.0 | 2021年7月30日 |
---|
#314在 内存管理
717每月下载量
180KB
3.5K SLoC
Slitter是一个更安全的slab分配器
Slitter是一个经典结构的线程缓存slab分配器,旨在帮助编写可靠的长时间运行的程序。
鉴于这个目标,Slitter并不优先考虑速度。主要目标是帮助应用程序处理不可避免的内存管理错误——无论是通过内置的统计信息,还是在运行时检测,或者通过控制其爆炸半径——同时保持分配器的性能与最先进的技术相竞争。另一个重要的目标是让应用程序自定义Slitter从操作系统请求内存的方式。
有关分配性能的详细信息,请参阅doc/fast_path.md
。对于分配器其余部分的概述,请参阅doc/design.md
。由于类型稳定性保证,外部碎片化基本上不在考虑范围内,slab/heap pointer分配方案将内部碎片化保持在非常低的水平(仅用于元数据和保护页,大约2-3%,一旦我们添加内部保护页,还会更高)。
当前保证
-
Slitter会在回收分配时检测到不匹配的类,并且当它收到一个它不管理的地址时,通常会崩溃。没有这个保证,堆使用统计信息很容易变得毫无用处,并且不正确的释放调用可能变成内存损坏,远远不是错误的调用。
-
Slitter没有任何带内元数据。这意味着没有元数据靠近应用程序的分配,容易发生缓冲区溢出(我们在数据和元数据之间保持保护页),也没有易受use-after-free攻击的侵入式链表。
-
Slitter分配的数据具有稳定的类型:一旦地址被返回给给定分配类的mutator,该地址始终有效,并且始终用于该类的数据。根据第2点,Slitter不使用侵入式链表,因此数据反映了应用程序存储的内容,即使它已经被回收。这使得应用程序代码可以在非阻塞算法中依赖无害的use-after-free,而不是例如SMR。这个保证还意味着任何双重释放或恶意use-after-free只会影响有缺陷的分配类。
未来保证
-
Slitter将检测到内部指针被释放。
-
Slitter将检测到大多数跨分配类的缓冲区溢出,使用保护页。
-
切割机将始终检测它不管理的地址的空闲。
-
切割机将检测大多数连续的双空闲。
未来功能
a. 切割机将允许每个分配类决定其支持内存应该如何分配(例如,冷数据可以生活在文件支持的映射中,用于可选交换)。
b. 切割机将跟踪每个分配类中分配和回收的对象数量。
c. 切割机将采样一小部分分配以进行堆分析。
依赖关系
~2–10MB
~115K SLoC