Linux 物理内存分配器中 kmem_cache 的使用
2010-12-28 20:31
169 查看
转自: http://blog.csdn.net/unbutun/archive/2010/06/02/5643177.aspx
在内核编程中,可能经常会有一些数据结构需要反复使用和释放,按照通常的思路,可能是使用kmalloc和kfree来实现。
但是这种方式效率不高,Linux为我们提供了更加高效的方法——Slab高速缓存管理器
通过先使用kmem_cache_create函数创建一个高速缓存的头指针——在内核中是struct kmem_cache结构,具体用法可以这样:
struct kmem_cache *cachep = NULL;
cachep = kmem_cache_create("cache_name", sizeof(struct yourstruct), 0, SLAB_HWCACHE_ALIGN, NULL, NULL);
这样我们就获得了一个可用的cachep头指针。
当需要分配一个struct yourstruct的结构体空间时,我们只需要调用kmem_cache_alloc函数,就可以获得一个足够我们使用的空间的指针(为什么我要说足够呢?因为刚才的声明中我使用了一个标志——SLAB_HWCACHE_ALIGN,这个标志会让分配的空间对于硬件来说是对齐的,而不一定恰好等于sizeof(struct yourstruct)的结果)。范例代码如下:
struct yourstruct *bodyp = NULL;
bodyp = (struct yourstruct *) kmem_cache_alloc(cachep, GFP_ATOMIC & ~__GFP_DMA);
这样就可以使用bodyp指针所对应的空间存贮你需要的结构体信息了。
当用完结束后,我们需要释放空间,如何操作呢?代码很简单:
kmem_cache_free(cachep, bodyp);
在内核编程中,可能经常会有一些数据结构需要反复使用和释放,按照通常的思路,可能是使用kmalloc和kfree来实现。
但是这种方式效率不高,Linux为我们提供了更加高效的方法——Slab高速缓存管理器
通过先使用kmem_cache_create函数创建一个高速缓存的头指针——在内核中是struct kmem_cache结构,具体用法可以这样:
struct kmem_cache *cachep = NULL;
cachep = kmem_cache_create("cache_name", sizeof(struct yourstruct), 0, SLAB_HWCACHE_ALIGN, NULL, NULL);
这样我们就获得了一个可用的cachep头指针。
当需要分配一个struct yourstruct的结构体空间时,我们只需要调用kmem_cache_alloc函数,就可以获得一个足够我们使用的空间的指针(为什么我要说足够呢?因为刚才的声明中我使用了一个标志——SLAB_HWCACHE_ALIGN,这个标志会让分配的空间对于硬件来说是对齐的,而不一定恰好等于sizeof(struct yourstruct)的结果)。范例代码如下:
struct yourstruct *bodyp = NULL;
bodyp = (struct yourstruct *) kmem_cache_alloc(cachep, GFP_ATOMIC & ~__GFP_DMA);
这样就可以使用bodyp指针所对应的空间存贮你需要的结构体信息了。
当用完结束后,我们需要释放空间,如何操作呢?代码很简单:
kmem_cache_free(cachep, bodyp);
相关文章推荐
- Linux的内存机制:cache,buffer,swap(物理内存充足的情况下,swap区使用量大于0?!)
- Linux 物理内存使用的一个问题
- Linux 下使用 Zend Framework File Cache的权限问题
- linux中内存使用,swap,cache,buffer的含义总结
- linux 未跑程序 内存 cache使用过大
- linux下查看内存使用情况以及buffer内存与cache内存有何区别
- 内核IPSec代码中xfrm_input.c中关于kmem_cache_alloc的使用分析
- 如何查看linux系统中空闲内存/物理内存使用/剩余内存
- linux中内存使用,swap,cache,buffer的含义总结
- linux中内存使用,swap,cache,buffer的含义
- 提升Linux物理内存使用方法
- Linux开发心得总结9 - Linux中的内存分配和释放之kmem_cache_alloc()函数分析
- linux中内存使用,swap,cache,buffer的含义总结
- 【翻译自mos文章】在使用Linux大页内存的配置中,使用drop_cache时导致的ORA-600 [KGHLKREM1]问题
- Linux 2.6.36以后file_operations和DECLARE_MUTEX 和kmem_cache_create的变化
- linux中内存使用,swap,cache,buffer的含义
- linux中内存使用,swap,cache,buffer的含义
- Linux中的内存分配和释放之kmem_cache_alloc()函数分析
- Linux安装mkimage工具 - 使用apt-cache命令
- linux内存管理之kmem_cache_init