日期:2014-05-16  浏览次数:20816 次

Linux Slob分配器(二)--分配对象

 水平有限,描述不当之处还请指出,转载请注明出处http://blog.csdn.net/vanbreaker/article/details/7705559      

       上节介绍了Slob分配器的相关概念和思想,这节来看Slob分配器是如何分配对象的。kmem_cache_alloc_node()函数用来分配一个专用缓存的对象:

 


由于slob为PAGE_SIZE大小,因此首先要判断要求分配的对象的大小是否在这个范围内,如果是,则通过Slob分配器来分配,否则的话通过伙伴系统分配。

来看Slob分配对象的具体过程

 

  • 首先要根据对象的大小来决定从哪个全局链表中寻找slob进行分配
  • 遍历选取的链表,找到一个空间足够满足分配要求的slob
  • 从选取的slob中分配对象块(slob_page_alloc())
  • 如果遍历完整个链表都没能分配到对象,则创建一个新的slob(slob_new_page()),然后设置slob的属性,再进行分配,可以看到一个新的slob中只有一个块,并且下一个空闲对象的指针指向了下一页的起始处,也就是页对齐的

来看分配的细节操作slab_page_alloc()