Linux slab 分配器详解 - 理解 Linux 内存管理的方式Z

Linux slab 分配器详解 --- 了解 Linux 内存管理的方式Z?良好的操作系统性能部分依赖于操作系统有效管理资

Linux slab 分配器详解 --- 了解 Linux 内存管理的方式Z

?


良好的操作系统性能部分依赖于操作系统有效管理资源的能力。在过去,堆内存管理器是实际的规范,但是其性能会受到内存碎片和内存回收需求的影响。现在,Linux? 内核使用了源自于 Solaris 的一种方法,但是这种方法在嵌入式系统中已经使用了很长时间了,它是将内存作为对象按照大小进行分配。本文将探索 slab 分配器背后所采用的思想,并介绍这种方法提供的接口和用法。

每个缓存都包含了一个?slabs?列表,这是一段连续的内存块(通常都是页面)。存在 3 种 slab:

slabs_full完全分配的 slabslabs_partial部分分配的 slabslabs_empty空 slab,或者没有对象被分配

注意?slabs_empty?列表中的 slab 是进行回收(reaping)的主要备选对象。正是通过此过程,slab 所使用的内存被返回给操作系统供其他用户使用。

slab 列表中的每个 slab 都是一个连续的内存块(一个或多个连续页),它们被划分成一个个对象。这些对象是从特定缓存中进行分配和释放的基本元素。注意 slab 是 slab 分配器进行操作的最小分配单位,因此如果需要对 slab 进行扩展,这也就是所扩展的最小值。通常来说,每个 slab 被分配为多个对象。

由于对象是从 slab 中进行分配和释放的,因此单个 slab 可以在 slab 列表之间进行移动。例如,当一个 slab 中的所有对象都被使用完时,就从?slabs_partial?列表中移动到?slabs_full?列表中。当一个 slab 完全被分配并且有对象被释放后,就从?slabs_full?列表中移动到?slabs_partial?列表中。当所有对象都被释放之后,就从?slabs_partial?列表移动到?slabs_empty?列表中。


Linux slab 分配器详解 - 理解 Linux 内存管理的方式Z
Linux slab 分配器详解 - 理解 Linux 内存管理的方式Z
回页首


slab 缓存的 Linux 源代码
您可以在 ./linux/mm/slab.c 中找到 slab 缓存的源代码。?kmem_cache?结构也是在 ./linux/mm/slab.c 中定义的。本文着重讨论 2.6.21 Linux 内核中的当前实现。

然后其他 slab 缓存函数将使用该引用进行创建、删除、分配等操作。kmem_cache?结构包含了每个中央处理器单元(CPU)的数据、一组可调整的(可以通过 proc 文件系统访问)参数、统计信息和管理 slab 缓存所必须的元素。

NUMA 的 slab 分配
对于 NUMA(Non-Uniform Memory Access)架构来说,对某个特定节点的分配函数是?kmem_cache_alloc_node

通用对象分配
在 slab 源代码中,提供了一个名为kmem_find_general_cachep?的函数,可执行缓存搜索,即用来查找最适合所需对象大小的 slab 缓存。


Linux slab 分配器详解 - 理解 Linux 内存管理的方式Z
Linux slab 分配器详解 - 理解 Linux 内存管理的方式Z
回页首



Linux slab 分配器详解 - 理解 Linux 内存管理的方式Z
Linux slab 分配器详解 - 理解 Linux 内存管理的方式Z
回页首


?

limit?字段表示每个 CPU 可以缓存的对象的最大数量。?batchcount?字段是当缓存为空时转换到每个 CPU 缓存中全局缓存对象的最大数量。?shared?参数说明了对称多处理器(Symmetric MultiProcessing,SMP)系统的共享行为。

注意您必须具有超级用户的特权才能在 proc 文件系统中为 slab 缓存调优参数。

?

Linux slab 分配器详解 - 理解 Linux 内存管理的方式Z
Linux slab 分配器详解 - 理解 Linux 内存管理的方式Z
Linux slab 分配器详解 - 理解 Linux 内存管理的方式Z
回页首



Linux slab 分配器详解 - 理解 Linux 内存管理的方式Z
Linux slab 分配器详解 - 理解 Linux 内存管理的方式Z
回页首


分享这篇文章……

?

Linux slab 分配器详解 - 理解 Linux 内存管理的方式ZLinux slab 分配器详解 - 理解 Linux 内存管理的方式Z将本文提交到 DiggLinux slab 分配器详解 - 理解 Linux 内存管理的方式ZLinux slab 分配器详解 - 理解 Linux 内存管理的方式Z发布到 del.icio.usLinux slab 分配器详解 - 理解 Linux 内存管理的方式ZLinux slab 分配器详解 - 理解 Linux 内存管理的方式Z提交到 Slashdot!Linux slab 分配器详解 - 理解 Linux 内存管理的方式Z

?

slab 缓存分配器的源代码实际上是 Linux 内核中可读性较好的一部分。除了函数调用的间接性之外,源代码也非常直观,总的来说,具有很好的注释。如果您希望了解更多有关 slab 缓存分配器的内容,建议您从源代码开始,因为它是有关这种机制的最新文档。 下面的?参考资料?一节提供了介绍 slab 缓存分配器的参考资料,但是不幸的是就目前的 2.6 实现来说,这些文档都已经过时了。


Linux slab 分配器详解 - 理解 Linux 内存管理的方式Z

Linux slab 分配器详解 - 理解 Linux 内存管理的方式Z

M. Tim Jones 是一名嵌入式软件工程师,他是?GNU/Linux Application ProgrammingAI Application Programming?以及?BSD Sockets Programming from a Multilanguage Perspective?等书的作者。他的工程背景非常广泛,从同步宇宙飞船的内核开发到嵌入式架构设计,再到网络协议的开发。Tim 是位于科罗拉多州 Longmont 的

?