快速业务通道

Linux SLUB分配器详解

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

  在 SLUB 中,没有单独的 Empty slab 队列.每个 NUMA 节点使用 kmem_cache_node 结构维护一个处于 Partial 状态的 slab 队列.表 3 列出它的字段(省略了调试相关的字段).

  表 3. kmem_cache_node 数据结构

  类型 名称 描述

  spinlock_t list_lock 保护 nr_partial 和 partial 字段的自旋锁

  unsigned long nr_partial 本节点 Partial slab 的数目

  atomic_long_t nr_slabs 本节点 slab 的总数

  struct list_head partial Partial slab 的双向循环队列

  创建处理器活动 slab时,第一个空闲对象的指针被复制到 kmem_cache_cpu 结构的 freelist 字段中.虽然对象分配和释放的操作只针对处理器本地的活动 slab,但是在某些特殊的情况下会为当前处理器创建新的活动 slab 并把原先未用完的活动 slab 加到 NUMA 节点 的Partial 队列中(例如,在处理器 A 上运行的某内核执行绪申请对象,但是 A 的活动 slab 中已经没有空闲对象,因此创建新的 slab.但是创建 slab 的操作可能导致睡眠,当创建操作完成后该执行绪可能被调度到处理器 B 上,这将停止使用 B 原有的活动 slab,并将其加入 B 所在节点的 Partial 队列中).相较 SLAB 而言,处于Partial 状态的 slab 的数目比较少,因此合理有效地利用了内存.当本地 slab 没有空闲对象时,SLUB 分配器优先从处理器所在节点的 Partial 队列中分配一个 slab 作为新的本地活动 slab,其次从其它节点中分配 slab.

  内核执行绪申请对象时,直接从所在处理器的kmem_cache_cpu 结构的 freelist 字段获得第一个空闲对象的地址,然后更新 freelist 字段,使其指向下一个空闲对象.释放对象时,如果对象属于所在处理器的活动 slab 中,直接将其添加到空闲对象队列的队首,并更新 freelist 字段;否则的话,对象一定属于某 Partial slab 中.如果释放操作该 Partial slab 转变成 Empty 状态,则释放该 slab.可见 SLUB 分配器不需要复杂的缓冲区内存回收机制.

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