炫意html5
最早CSS3和HTML5移动技术网站之一

内存管理 – Linux内核API mempool_resize

mempool_resize函数功能描述:mempool_resize( )函数是重新设置内存池最多包含的元素个数,即是改变内存池描述符结构中element数组所包含的元素个数。

mempool_resize文件包含

#include<linux/mempool.h>

mempool_resize函数定义

在内核源码中的位置:linux-3.19.3/mm/mempool.c

函数定义格式:

int mempool_resize(mempool_t *pool, int new_min_nr, gfp_t gf p_mask)

mempool_resize输入参数说明

  • pool:内存池对象指针,指向创建的内存池,其定义参考 mempool_create( )函数的分析。
  • new_min_nr:内存池最多所包含的新元素个数。
  • gfp_mask:内存分配标志,其常见取值和定义参考alloc_pages( )函数的分析。

mempool_resize返回参数说明

返回值是一个整型值,如果成功,则返回0,否则返回负值。

mempool_resize实例解析

编写测试文件:mempool_resize.c

头文件及全局变量声明如下:

#include <linux/mm.h>
#include <linux/slab.h>
#include <linux/module.h>
#include <linux/mempool.h>
#include <linux/blkdev.h>
#include <linux/writeback.h>
MODULE_LICENSE("GPL");
static int __init mempool_resize_init(void);
static void __exit mempool_resize_exit(void);
static struct kmem_cache * kmem = NULL;
static mempool_t * pool = NULL;

模块初始化函数:

int __init mempool_resize_init(void)
{
// 创建一个名为"my_buffer"的slab缓存
kmem = kmem_cache_create("my_buffer", 10000, 0, SLAB_HWCACHE_ALIGN, NULL);
if(kmem == NULL )
{
printk("kmem_cache_create failed! \n");    //输出失败信息
return 0;
}
else
{
printk("kmem_cache_create scessfully! \n");
// 基于创建的slab缓存创建一个包含5个初始元素的内存池
pool = mempool_create(5, mempool_alloc_slab, mempool_free_slab, kmem);
if(pool == NULL )
{
printk("mempool_create failed! \n");
return 0;
}
else
{
// 输出所创建的内存池中元素的最大个数
printk("mempool_create successfully! min_nr = %d\n", pool->min_nr);
int new_min_nr = 6;
// 调用mempool_resize函数重新设置内存池所允许的最多元素个数
int result = mempool_resize(pool, new_min_nr, GFP_KERNEL);
// 重新设置之后,输出新的内存池中最大元素个数
printk("after resize, min_nr = %d\n", pool->min_nr);
}
}
return 0;
}

模块退出函数:

void __exit mempool_resize_exit(void)
{
if(pool ! = NULL)
mempool_destroy(pool);        //销毁创建的内存池
if(kmem ! = NULL)
kmem_cache_destroy(kmem);     //销毁创建的slab缓存
printk("exit! \n");
}

模块初始化及退出函数调用:

module_init(mempool_resize_init);
module_exit(mempool_resize_exit);

实例运行结果及分析:

首先编译模块,执行命令insmod mempool_resize.ko插入模块,然后执行命令dmesg -c,会出现如图所示的结果。

Linux内核API mempool_resize

结果分析:

为测试mempool_resize( )函数的功能,首先需要创建一个内存池,这里调用内存池创建函数mempool_create( )基于slab缓存kmem(由 kmem_cache_create( )创建)创建了一个内存池pool。初始创建该内存池中包含的元素个数为5,然后调用mempool_resize( )函数将内存池中所最多允许包含的元素个数为6。由输出结果可以看出,创建的内存池描述符pool的min_nr字段明显由5变为了6。最后在模块退出时,分别调用mempool_destroy和kmem_cache_destroy(kmem)销毁创建的内存池和slab缓存。

关于函数kmem_cache_create ( )、mempool_destroy( )和kmem_cache_destroy( )的功能,请参考本教程网关于它们的分析。

炫意HTML5 » 内存管理 – Linux内核API mempool_resize

Java基础教程Android基础教程