44

哪些因素有助于决定 Linux 内核中内存分配器的选择?

在当前的 Linux 内核中,我们可以选择 SLAB、SLUB 或 SLOB。我读过 SLOB 用于占用空间较小的内核。但我想知道有助于在 Slab Allocator 和 Slub Allocator 之间做出决定的因素。

4

1 回答 1

56

在寻找答案的过程中,我在 Quora 上发布了同样的问题,Robert Love 回答了这个问题:

我假设您是从系统用户的角度提出这个问题,或者是从某个为特定产品构建内核的人的角度来问这个问题。作为内核开发人员,您并不关心正在使用什么“slab”分配器。API 是一样的。

首先,“slab”已经成为一个通用名称,指的是使用对象缓存的内存分配策略,从而实现内核对象的高效分配和释放。它首先由 Sun 工程师 Jeff Bonwick 1记录并在 Solaris 2.4 内核中实现。

Linux 目前为其“slab”分配器提供了三种选择:

Slab 是原始的,基于 Bonwick 的开创性论文,自 Linux 内核版本 2.2 起可用。这是对 Bonwick 提议的忠实实现,并通过 Bonwick 后续论文2中描述的多处理器更改进行了增强。

Slub 是下一代替换内存分配器,自 2.6.23 以来一直是 Linux 内核中的默认值。它继续采用基本的“slab”模型,但修复了 Slab 设计中的几个缺陷,特别是在具有大量处理器的系统周围。Slub 比 Slab 简单。

SLOB(简单块列表)是一种内存分配器,针对内存非常少的嵌入式系统进行了优化——大约为兆字节。它在块列表上应用了一个非常简单的首次拟合算法,与旧的 K&R 风格的堆分配器不同。在消除内存分配器的几乎所有开销方面,SLOB 非常适合处于极端内存限制下的系统,但它没有提供1中描述的任何好处,并且可能会遭受病态碎片的影响。

你应该用什么?Slub,除非您正在为内存有限的嵌入式设备构建内核。在这种情况下,我将对 Slub 与 SLOB 进行基准测试,看看哪种方法最适合您的工作负载。没有理由使用 Slab;它可能会从未来的 Linux 内核版本中删除。

请参阅此链接以获取原始回复。

于 2013-03-18T17:31:45.910 回答