快速业务通道

Linux slab分配器剖析

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-04-21

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

  动态内存管理

  内存管理的目标是提供一种方法,为实现各种目的而在各个用户之间实现内存共享.内存管理方法应该实现以下两个功能:

  · 最小化管理内存所需的时间

  · 最大化用于一般应用的可用内存(最小化管理开销)

  内存管理实际上是一种关于权衡的零和游戏.您可以开发一种使用少量内存进行管理的算法,但是要花费更多时间来管理可用内 存.也可以开发一个算法来有效地管理内存,但却要使用更多的内存.最终,特定应用程序的需求将促使对这种权衡作出选择.

  每个内存管理器都使用了一种基于堆的分配策略.在这种方法中,大块内存(称为 堆)用来为用户定义的目的提 供内存.当用户需要一块内存时,就请求给自己分配一定大小的内存.堆管理器会查看可用内存的情况(使用特定算法)并返回一块内存.搜索过程中使用的一些算 法有 first-fit(在堆中搜索到的第一个满足请求的内存块 )和 best-fit(使用堆中满足请求的最合适的内存块).当用户使用完内存后,就将内存返回给堆.

  这种基于堆的分配策略的根本问题是碎片(fragmentation).当内存块被分配后,它们会以不同的 顺序在不同的时间返回.这样会在堆中留下一些洞,需要花一些时间才能有效地管理空闲内存.这种算法通常具有较高的内存使用效率(分配需要的内存),但是却 需要花费更多时间来对堆进行管理.

  另外一种方法称为 buddy memory allocation,是一种更快的内存分配技术,它将内存 划分为 2 的幂次方个分区,并使用 best-fit 方法来分配内存请求.当用户释放内存时,就会检查 buddy 块,查看其相邻的内存块是否也已经被释放.如果是的话,将合并内存块以最小化内存碎片.这个算法的时间效率更高,但是使用 best-fit 方法的缘故,会产生内存浪费.

  本文将着重介绍 Linux 内核的内存管理,尤其是 slab 分配提供的机制.

  slab 缓存

  Linux 所使用的 slab 分配器的基础是 Jeff Bonwick 为 SunOS 操作系统首次引入的一种算法.Jeff 的分配器是围绕对象缓存进行的.在内核中,会为有限的对象集(例如文件描述符和其他常见结构)分配大量内存.Jeff 发现对内核中普通对象进行初始化所需的时间超过了对其进行分配和释放所需的时间.因此他的结论是不应该将内存释放回一个全局的内存池,而是将内存保持为针 对特定目而初始化的状态.例如,如果内存被分配给了一个互斥锁,那么只需在为互斥锁首次分配内存时执行一次互斥锁初始化函数(mutex_init) 即可.后续的内存分配不需要执行这个初始化函数,从上次释放和调用析构之后,它已经处于所需的状态中了.

  Linux slab 分配器使用了这种思想和其他一些思想来构建一个在空间和时间上都具有高效性的内存分配器.

  图 1 给出了 slab 结构的高层组织结构.在最高层是 cache_chain,这是一 个 slab 缓存的链接列表.这对于 best-fit 算法非常有用,可以用来查找最适合所需要的分配大小的缓存(遍历列表).cache_chain 的每个元素都是一个 kmem_cache 结构的引用(称为一个 cache).它定义了一个要管理的给定大小的 对象池.

     图  1. slab 分配器的主要结构
图 1. slab 分配器的主要结构

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

  slabs_full

  完全分配的 slab

  slabs_partial

  部分分配的 slab

  slabs_empty

  空

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号