读书人

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

发布时间: 2012-08-14 10:39:57 作者: rapoo

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()

几个辅助计算函数:




这里判断一个空闲块是不是slob中的最后一个空闲块的方法就是看s的下一个空闲块地址是不是页对齐的!

再回到slob_alloc()中,当成功分配到一个对象块后,要试图将slob_list链表头转移到刚分配出去的块所处的位置。因为从上面的代码中可以看到,分配一个块有可能会因为对齐的原因产生小的碎片,移动链表头可以使得下次分配对象时从产生碎片的地方开始遍历空闲块,尽可能将碎片给分配出去。

当遍历了整个链表都没能获取对象时,则创建新的slob


读书人网 >UNIXLINUX

热点推荐