Linux 内存管理: Kmalloc(2)

上一篇文章中简单说了下slab分配器下kmalloc是如何分配内存的。在看cache_alloc_refill这个函数的时候逻辑上还有一些困惑。

主要是关于 batchcount = ac->batchcount; 的问题。在默认初始化的时候即在kmem_cache_init中系统的cache都会调用到__kmem_cache_create中setup_cpu_cache的有这样一段代码:

那么我是不是就可以认为ac->batchcount的值就是1了呢?那么 ac_put_obj的时候只放一个obj到array中。每次都这样,那么在__cache_alloc中

它的意义又何在呢? 因为batchcount为1的话,每次放入一个obj到array 设置avail从0到1,但是get一个obj后,avail又为0了。当然这样效率很低。
后来才发现是自己代码没看全- -, 我们看这样一段代码它在kmem_cache_init初始化后,调用的

这个函数就是把slab_caches链表上的所有cache都调用enable_cpucache(cachep, GFP_NOWAIT)一遍!

对我们看到了limit 、shared 、 batchcount的新初始化.

而具体实现在

我们就看看do_ccupdate_local做了什么

这样就和函数cache_alloc_refill接起来了
我们可以看看实际的内核开启slab的信息:

或许你看ubuntu系统的时候发现limit batchcount值为0 ,其实它是用了slub分配器.在slub.c中

这里顺便说明一下关于slab、slub、slob的简单区别:(具体如何实现的请参考内核代码slab.c /slub.c/slob.c)
slab是slub和slob的基础。

SLOB的目标是针对嵌入式系统的,主要是适用于那些内存非常有限的系统,比如32MB以下的内存,它不太注重large smp系统,虽然最近在这方面有一些小的改进

SLUB allocator,用于替代 slab 代码。通过取消了大量的队列和相关开销、简化 slab 的结构,SLUB 承诺提供更好的性能和更好的系统可伸缩性,并且可以同时保持现有的 slab 分配器接口

说了这么多,我们用个图来简单描述下slab机制:

1 3 收藏 评论

相关文章

可能感兴趣的话题



直接登录
跳到底部
返回顶部