快速业务通道

Linux SLUB分配器详解

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

  内核对象缓冲区管理

  Linux 内核在运行过程中,常常会需要经常使用一些内核的数据结构(对象).例如,当进程的某个线程第一次打开一个文件的时候,内核需要为该文件分配一个称为 file 的数据结构;当该文件被最终关闭的时候,内核释放此文件所关联的 file 数据结构.这些小块存储空间并不只在某个内核函数的内部使用,否则就可以使用当前线程的内核栈空间.同时,这些小块存储空间又是动态变化的,不可能像物理内存页面管理使用的 page 结构那样,有多大内存就有多少个 page 结构,形成一个静态长度的队列.内核无法预测运行中各种不同的内核对象对缓冲区的需求,因此不适合为每一种可能用到的对象建立一个“缓冲池”,那样的话很可能出现有些缓冲池已经耗尽而有些缓冲池中却又大量空闲缓冲区的现象.因此,内核只能采取更全局性的方法.

  我们可以看出,内核对象的管理与用户进程中的堆管理比较相似,核心问题均是:如何高效地管理内存空间,可以快速地进行对象的分配和回收并减少内存碎片.但是内核不能简单地采用用户进程的基于堆的内存分配算法,这是内核对其对象的使用具有以下特殊性:

  内核使用的对象种类繁多,应该采用一种统一的高效管理方法.

  内核对某些对象(如 task_struct)的使用是非常频繁的,用户进程堆管理常用的基于搜索的分配算法比如First-Fit(在堆中搜索到的第一个满足请求的内存块)和 Best-Fit(使用堆中满足请求的最合适的内存块)并不直接适用,而应该采用某种缓冲区的机制.

  内核对象中相当一部分成员需要某些特殊的初始化(例如队列头部)而并非简单地清成全 0.如果能充分重用已被释放的对象下次分配时无需初始化,那么可以提高内核的运行效率.

  分配器对内核对象缓冲区的组织和管理充分考虑对硬件高速缓存的影响.

  随着共享内存的多处理器系统的普及,多处理器同时分配某种类型对象的现象时常发生,因此分配器应该尽量避免处理器间同步的开销,应采用某种 Lock-Free 的算法.

  如何有效地管理缓冲区空间,长期以来都是一个热门的研究课题.90 年代初期,在 Solaris 2.4 操作系统中,采用了一种称为“slab”(原意是大块的混凝土)的缓冲区分配和管理方法,在相当程度上满足了内核的特殊需求.

  --------------------------------------------------------------------------------

  SLAB 分配器介绍

  多年以来,Linux 内核使用一种称为 SLAB 的内核对象缓冲区分配器.SLAB 分配器源于 Solaris 2.4 的分配算法,工作于物理内存页框分配器之上,管理特定大小对象的缓存,进行快速而高效的内存分配.

  SLAB 分配器为每种使用的内核对象建立单独的缓冲区.Linux 内核已经采用了伙伴系统(Buddy System)管理物理内存页框,因此 SLAB 分配器直接工作于伙伴系统之上.每种缓冲区由多个 slab 组成,每个 slab就是一组连续的物理内存页框,被划分成了固定数目的对象.根据对象大小的不同,缺省情况下一个 slab 最多可以由 1024 个物理内存页框构成.出于对齐等其它方面的要求,slab 中分配给对象的内存可能大于用户要求的对象实际大小,这会造成一定的内存浪费.

  内核对象在使用前和释放后可能需要做某些特殊处理,缓冲区拥有自己的“构造函数(constructor)”和“析构函数(destructor)”,类似于C 等面向对象编程语言中的概念(不过最新版本的 SLAB 分配器取消了析构函数).创建新 slab 时内核调用构造函数初始化每个对象,释放 slab 时则调用析构函数.这就是内核数据结构被称为对象的原因.

  内核使用 kmem_cache 数据结构管理缓冲区. kmem_cache 自身也是一种内核对象,需要一个专门的缓冲区.所有缓冲区的 kmem_cache 控制结构被组织成以 cache_chain 为队列头的一个双向循环队列,同时 cache

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号