快速业务通道

Linux SLUB分配器详解

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-04-15
解决以上 SLAB 分配器的不足之处,内核开发人员 Christoph Lameter 在 Linux 内核 2.6.22 版本中引入一种新的解决方案:SLUB 分配器.SLUB 分配器特点是简化设计理念,同时保留 SLAB 分配器的基本思想:每个缓冲区由多个小的 slab 组成,每个 slab 包含固定数目的对象.SLUB 分配器简化了kmem_cache,slab 等相关的管理数据结构,摒弃了SLAB 分配器中众多的队列概念,并针对多处理器、NUMA 系统进行优化,从而提高了性能和可扩展性并降低了内存的浪费.为了保证内核其它模块能够无缝迁移到 SLUB 分配器,SLUB 还保留了原有 SLAB 分配器所有的接口 API 函数.

  本文所列的数据结构和源代码均摘自 Linux 内核 2.6.25 版本.

  每个内核对象缓冲区都是由 kmem_cache 类型的数据结构来描述的,表 1 列出了它的字段(省略了统计和调试相关的字段).

  表 1. kmem_cache 数据结构

  类型 名称 描述

  unsigned long flags 描述缓冲区属性的一组标志

  int size 分配给对象的内存大小(可能大于对象的实际大小)

  int objsize 对象的实际大小

  int offset 存放空闲对象指针的位移

  int order 表示一个 slab 需要 2^order 个物理页框

  kmem_cache_node local_node 创建缓冲区的节点的 slab 信息

  int objects 一个 slab 中的对象总个数

  gfp_t allocflags 创建一个 slab 时使用的一组额外标志

  int refcount 缓冲区计数器.当用户请求创建新的缓冲区时,SLUB 分配器重用已创建的相似大小的缓冲区,从而减少缓冲区的个数.

  void (*)(…) ctor 创建 slab 时用于初始化每个对象的构造函数

  int inuse 元数据的位移

  int align 对齐

  const char * name 缓冲区名字

  struct list_head list 包含所有缓冲区描述结构的双向循环队列,队列头为 slab_caches

  int remote_node_defrag_ratio 该值越小,越倾向从本节点中分配对象

  struct kmem_cache_node * [] node 为每个节点创建的 slab 信息的数据结构(创建缓冲区的节点除外,使用 local_node 字段)

  struct kmem_cache_cpu * [] cpu_slab 为每个处理器创建的 slab 信息的数据结构

  我们可以看到,SLUB 分配器的 kmem_cache 结构相对 SLAB 而言简化了不少,没有了队列的相关字段.值得注意的是 SLUB 分配器具有缓冲区合并的功能:当内核执行绪请求创建新的缓冲区 C2 时,SLUB 分配器会先搜索已创建的缓冲区,如果发现某缓冲区 C1 的对象大小略大于 C2,则重用 C1.测试表明,这项功能减少了大约 50% 的缓冲区数目,从而减少了 slab 碎片并提高了内存利用率.

  在 SLUB 分配器中,一个 slab 就是一组连续的物理内存页框,被划分成了固定数目的对象.slab 没有额外的空闲对象队列(这与 SLAB 不同),而是重用了空闲对象自身的空间.slab 也没有额外的描述结构, SLUB 分配器在代表物理页框的 page 结构中加入 freelist,inuse 和 slab 的 union 字段,分别代表第一个空闲对象的指针,已分配对象的数目和缓冲区 kmem_cache 结构的指针, slab 的第一个物理页框的 page 结构就可以描述自己.

  每个处理器都有一个本地的活动 slab,由 kmem_cache_cpu 结构描述.表 2 列出它的字段(省略了统计相关的字段).

  表 2. kmem_cache_cpu 数据结构

  类型 名称 描述

  void ** freelist 空闲对象队列的指针,即第一个空闲对象的指针

  struct page * page slab 的第一个物理页框描述符

  int node 处理器所在 NUMA 节点号,值 -1 用于调试

  unsigned int offset 用于存放下一个空闲对象指针的位移,以字(word)为单位

  unsigned int objsize 对象实际大小,与 kmem_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号