Linux SLUB分配器详解
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 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |