ChinaUnix.net
相关文章推荐:

内存区管理和slab分配器

一:准备知识: 前面我们分析过了大内存分配的实现机制,事实上,若为小块内存而请求整个页面,这样对于内存来说是一种极度的浪费。因此linux采用了slab管理小块内存的分配与释放。slab最早是由sun的工程师提出。它的提出是基于以下因素考虑的: 1:内核函数经常倾向于反复请求相同的数据类型。比如:创建进程时,会请求一块内存来存放mm结构。 2:不同的结构使用不同的分配方法可以提高效率。同样,如果进程在撤消的时候,内核不...

by xgr180 - Linux文档专区 - 2008-02-01 16:40:02 阅读(774) 回复(0)

相关讨论

九:几点补充: 1: slab中使用的页面都会加上“PG_slab”标志,以跟一般的页面别。另外,在释放内存的时候,经常需要用到从页面到slab的对应转换关系。那是怎样标识的呢? 关于标志: 注意有以下代码: static void *kmem_getpages(kmem_cache_t *cachep, int flags, int nodeid) { …… while (i--) { //为分得的每一个页面设置PG_slab标志 SetPageslab(page); page++; } …… } 关于...

by thewayma - Linux文档专区 - 2009-10-03 20:18:12 阅读(691) 回复(0)

七:kmem_cache_free()的实现 kmem_cache_free用于把从slab中分配的对象释放掉,同分配一样,它首先会把它放到AC中,如果AC满了,则把对象释放到share链中,如果share也满了,也就把它释放至slab。来看具体的代码: void kmem_cache_free (kmem_cache_t *cachep, void *objp) { unsigned long flags; local_irq_save(flags); __cache_free(cachep, objp); local_irq_restore(flags); } 函数调用__cache_fr...

by thewayma - Linux文档专区 - 2009-10-03 20:17:42 阅读(735) 回复(0)

六:kmem_cache_alloc的实现分析: 我们在上面可以看到,创建一个cache描述符的时候,并没有这之分配slab数据。现在我们来看一下怎么从cache中申请对象 void * kmem_cache_alloc (kmem_cache_t *cachep, int flags) { return __cache_alloc(cachep, flags); } 实际上会调用__cache_alloc 如下: static inline void * __cache_alloc (kmem_cache_t *cachep, int flags) { unsigned long save_flags; void* objp; ...

by thewayma - Linux文档专区 - 2009-10-03 20:17:05 阅读(813) 回复(0)

五:kmem_cache_create()分析 我们以一个例子来跟踪分析一下slab的机制: 下面是一个测试模块的代码: #include #include #include MODULE_LICENSE("GPL"); MODULE_AUTHOR("ericxiao "); MODULE_DESCRIPTION("slab test module"); static kmem_cache_t *test_cachep = NULL; struct slab_test { int val; }; void fun_ctor(struct slab_test *object , kmem_cache_t *cachep , unsigned long flags ) { ...

by thewayma - Linux文档专区 - 2009-10-03 20:16:27 阅读(801) 回复(0)

在cache这个结构里,有两个很重要的结构:struct array_cache *array[NR_CPUS]与struct kmem_list3 lists;详细分析一下 struct array_cache { unsigned int avail; //当前空闲对象的位置 unsigned int limit; //允许的空闲对象的最大值 unsigned int batchcount; //一次要填充给数组的对象数,或者一次要释放的对象数 unsigned int touched; //如果从该组中分配了对象,则把此值置为1 } ...

by thewayma - Linux文档专区 - 2009-10-03 20:14:02 阅读(747) 回复(0)

七:kmem_cache_free()的实现 kmem_cache_free用于把从slab中分配的对象释放掉,同分配一样,它首先会把它放到AC中,如果AC满了,则把对象释放到share链中,如果share也满了,也就把它释放至slab。来看具体的代码: void kmem_cache_free (kmem_cache_t *cachep, void *objp) { unsigned long flags; local_irq_save(flags); __cache_free(cachep, objp); local_irq_restore(flags); } 函数调用__cache_f...

by Tom_Chou - Linux文档专区 - 2008-06-07 12:20:51 阅读(607) 回复(0)

五:kmem_cache_create()分析 我们以一个例子来跟踪分析一下slab的机制: 下面是一个测试模块的代码: #include #include #include MODULE_LICENSE("GPL"); MODULE_AUTHOR("ericxiao "); MODULE_DESCRIPTION("slab test module"); static kmem_cache_t *test_cachep = NULL; struct slab_test { int val; }; void fun_ctor(struct slab_test *object , kmem_cache_t *cachep , unsigned long flags ) { ...

by Tom_Chou - Linux文档专区 - 2008-06-07 12:19:41 阅读(551) 回复(0)

一:准备知识: 前面我们分析过了大内存分配的实现机制,事实上,若为小块内存而请求整个页面,这样对于内存来说是一种极度的浪费。因此linux采用了slab管理小块内存的分配与释放。slab最早是由sun的工程师提出。它的提出是基于以下因素考虑的: 1:内核函数经常倾向于反复请求相同的数据类型。比如:创建进程时,会请求一块内存来存放mm结构。 2:不同的结构使用不同的分配方法可以提高效率。同样,如果进程在撤消的时候,内核不...

by Tom_Chou - Linux文档专区 - 2008-06-07 12:15:04 阅读(792) 回复(0)

九:几点补充: 1: slab中使用的页面都会加上“PG_slab”标志,以跟一般的页面别。另外,在释放内存的时候,经常需要用到从页面到slab的对应转换关系。那是怎样标识的呢? 关于标志: 注意有以下代码: static void *kmem_getpages(kmem_cache_t *cachep, int flags, int nodeid) { …… while (i--) { //为分得的每一个页面设置PG_slab标志 SetPageslab(page); page++; } …… } 关...

by xgr180 - Linux文档专区 - 2008-02-01 16:46:43 阅读(618) 回复(0)

七:kmem_cache_free()的实现 kmem_cache_free用于把从slab中分配的对象释放掉,同分配一样,它首先会把它放到AC中,如果AC满了,则把对象释放到share链中,如果share也满了,也就把它释放至slab。来看具体的代码: void kmem_cache_free (kmem_cache_t *cachep, void *objp) { unsigned long flags; local_irq_save(flags); __cache_free(cachep, objp); local_irq_restore(flags); } 函数调用__cache_f...

by xgr180 - Linux文档专区 - 2008-02-01 16:46:03 阅读(695) 回复(0)