slub分配机制

2020-02-16  本文已影响0人  橡树人

slub分配机制

一个内存块就是一个object。

​单个物理页之内分配小内存使用slub分配,页级别的物理内存分配使用伙伴Buddy系统分配​。

slub系统如何分配内存块?

从整体上看,

slub系统分配内存块object,需要考虑的情形有:

  1. 一个slub初始化结束
  2. 初始化完成后,第一次申请对象
  3. 运行时申请内存
    3.1 当前cpu使用的slab有多余的空闲对象
    3.2 当前cpu使用的slab没有多余的空闲对象
    3.2.1 当前cpu的部分空slab链表为空
    3.2.2 当前cpu的部分空slab链表不为空

一个slub初始化完成时

当一个slub初始化完成时,该slub是没有slab的。


slub刚初始化完成.png

第一次申请内存块object

如果此时是用户第一次申请内存块object,则slub系统会做如下工作:

当前cpu使用的slab有多余的空闲对象

如果此时用户申请内存块object,则slub系统会做如下工作:
直接从这些多余的空闲对象中分配一个出去给用户。
具体地讲,就是直接将kmem_cache_cpu中保存的一个空闲object返回给用户,并把freelist指向下一个空闲的object。

营业厅kmem_cache_cpu使用的slab中有多余的空闲对象.png

当前cpu使用的slab满了

当前cpu的部分空slab链表不为空

如果此时用户申请内存块时,则slub系统会做如下工作:

当前cpu的部分空slab链表为空

如果此时用户申请内存块时,则slub系统会做如下工作:

slub系统如何释放内存?

从整体上看,

slub系统释放内存块需要考虑的情形有:

  1. 部分空的slab释放其中一个已占用的内存块object后仍是部分空slab;
  2. 满slab释放一个内存块object后,变成了部分空slab
  3. 部分空slab释放一个内存块object后,变成了空闲slab

部分空的slab释放内存块object后仍是部分空slab

直接释放该内存块即可。

部分空slab释放后还是部分空.png

满slab释放一个内存块object后变成了部分空slab

将该部分空slab放入kmem_cache_cpu的部分空链表中。

满slab释放后变部分空.png

部分空slab释放一个内存块object后,变成了空闲slab

slub系统会做有如下工作:

类比机制

从整体上看:slub系统相当于零售商,先向伙伴系统批发内存,然后再零售出去

具体地看:

参考资料

上一篇 下一篇

猜你喜欢

热点阅读