内核中有些地方的内存分配是不允许失败的,为了确保这种情况下的成功分配,内核开发者建立了一种称为内存池的抽象;内存池其实就是某种形式的后备高速缓存,它试图始终保存空闲的内存,以便在紧急状态下使用;

mempool会分配一些内存块,空闲且不会真的得到使用;因此,使用mempool很容易浪费大量内存;几乎在索欧情况下,最好不使用mempool而是处理可能的分配失败;而如果系统分配内存失败会导致对系统的一致性破坏,为了应对这种情况,则应该使用mempool;

内存池对象的类型为mempool_t,在<linux/mempool.h>中定义;

创建

函数mempool_create用于创建内存池对象;

 mempool_t *mempool_create(int min_nr, mempool_alloc_t *alloc_fn,
mempool_free_t *free_fn, void *pool_data)

min_nr参数标识的是内存池应始终保持的已分配对象的最少数目;对象的实际分配和释放由alloc_fn和free_fn函数处理,原型如下:

 typedef void * (mempool_alloc_t)(gfp_t gfp_mask, void *pool_data);
typedef void (mempool_free_t)(void *element, void *pool_data);

mempool_create的最后一个参数,即pool_data,被传入alloc_fn和free_fn;

如有必要,我们可以为mempool编写特定用途的函数来处理内存分配;但是,通常我们仅会让内核的slab分配器为我们处理这个任务;内核中有两个函数mempool_alloc_slab和mempool_free_slab和mempool_free_slab,它们的原型和上述内存池分配的原型匹配,并利用kmeme_cache_alloc和kmem_cache_free处理内存分配和释放;

构造内存池的代码通常如下:

 cache = kmem_cache_careate(...);
pool = mempool_create(MY_POOL_MININUM,mempool_alloc_slab,mempool_free_slab,cache);
分配

在建立了内存池之后,可使用下面函数分配对象:

 void *mempool_alloc(mempool_t *pool, gfp_t gfp_mask)

在创建mempool时,就会多次调用分配函数为预先分配的对象创建内存池;之后,对mempool_alloc的调用将首先通过分配函数获得该对象;如果分配失败,就会返回预先分配的对象(如果存在的话);

释放

内存对象使用完毕之后,使用下面的函数释放对象:

 void mempool_free(void *element, mempool_t *pool)

如果使用mempool_free释放一个对象,则如果预先分配的对象数目小于要求的最低数目,就会将对象保留在内存池中;否则,该对象就会返回给系统;

调整大小

可以利用下面函数来调整mempool的大小:

 int mempool_resize(mempool_t *pool, int new_min_nr)

该函数调用成功,将把内存池的大小调整为至少有new_min_nr个预分配对象;

销毁

如果不再需要使用内存池,可使用下面的函数将其返回给系统:

 void mempool_destroy(mempool_t *pool);

在销毁mempool之前,必须将所有已分配的对象返回到内存池中,否则会导致内核oops;

Linux设备驱动程序 之 内存池的更多相关文章

  1. Linux设备驱动程序学习之分配内存

    内核为设备驱动提供了一个统一的内存管理接口,所以模块无需涉及分段和分页等问题. 我已经在第一个scull模块中使用了 kmalloc 和 kfree 来分配和释放内存空间. kmalloc 函数内幕 ...

  2. linux设备驱动程序该添加哪些头文件以及驱动常用头文件介绍(转)

    原文链接:http://blog.chinaunix.net/uid-22609852-id-3506475.html 驱动常用头文件介绍 #include <linux/***.h> 是 ...

  3. 【转】linux设备驱动程序中的阻塞机制

    原文网址:http://www.cnblogs.com/geneil/archive/2011/12/04/2275272.html 阻塞与非阻塞是设备访问的两种方式.在写阻塞与非阻塞的驱动程序时,经 ...

  4. Linux设备驱动程序 第三版 读书笔记(一)

    Linux设备驱动程序 第三版 读书笔记(一) Bob Zhang 2017.08.25 编写基本的Hello World模块 #include <linux/init.h> #inclu ...

  5. Linux设备驱动程序学习----1.设备驱动程序简介

    设备驱动程序简介 更多内容请参考Linux设备驱动程序学习----目录 1. 简介   Linux系统的优点是,系统内部实现细节对所有人都是公开的.Linux内核由大量复杂的代码组成,设备驱动程序可以 ...

  6. Linux设备驱动程序学习----2.内核模块与应用程序的对比

    内核模块与应用程序的对比 更多内容请参考Linux设备驱动程序学习----目录 1. 内核模块与应用程序的对比 内核模块和应用程序之间的不同之处: 大多数中小规模的应用程序是从头到尾执行单个任务,而模 ...

  7. Linux设备驱动程序学习----3.模块的编译和装载

    模块的编译和装载 更多内容请参考Linux设备驱动程序学习----目录 1. 设置测试系统 第1步,要先从kernel.org的镜像网站上获取一个主线内核,并安装到自己的系统中,因为学习驱动程序的编写 ...

  8. linux设备驱动程序-设备树(1)-dtb转换成device_node

    linux设备驱动程序-设备树(1)-dtb转换成device_node 本设备树解析基于arm平台 从start_kernel开始 linux最底层的初始化部分在HEAD.s中,这是汇编代码,我们暂 ...

  9. linux设备驱动程序-设备树(3)-设备树多级子节点的转换

    linux设备驱动程序--设备树多级子节点的转换 在上一章:设备树处理之--device_node转换成platform_device中,有提到在设备树的device_node到platform_de ...

随机推荐

  1. GraphQL实战篇(一)

    看过基础篇的都知道,GraphQL创建Schema有两种方式,Schema First和Graph Type,前者使用GraphQL Schema Language类似于EF的DB First:后者和 ...

  2. 数据库入门(mySQL):创建数据库

    基于JetBrains DataGrip创建数据库.SQL语句创建数据库 MySQL数据库存储引擎和数据类型 创建数据库表及基本操作 导出数据库.删除数据库.导入数据库 一.基于JetBrains D ...

  3. process exporter 配置项解释

    process exporter在prometheus中用于监控进程,通过process exporter,可从宏观角度监控应用的运行状态(譬如监控redis.mysql的进程资源等) 配置文件样例如 ...

  4. vSphere

    VMware vSphere集成容器(VIC)建立了一个在轻量级虚拟机内部署并管理容器的环境.全新的虚拟机环境提供了更高级别的硬件隔离度,灵活性以及可扩展性使得容器对开发人员以及企业应用具有如此大的吸 ...

  5. ORACLE归档日志满了之后,如何删除归档日志

    当ORACLE归档日志满后如何正确删除归档日志 版权声明:本文为博主原创文章,未经博主允许不得转载. 当ORACLE 归档日志满了后,将无法正常登入ORACLE,需要删除一部分归档日志才能正常登入OR ...

  6. java_字符串

    一.字符串变量 由一个专门的字符串类来进行存储处理字符串的,String类 二.字符串的连接 连接符:+ 转义字符 每个转义字符都是由两个符号组成,但是编译器把它当成一个字符. 三.字符串处理 1.求 ...

  7. python django uwsgi nginx安装

    python django uwsgi nginx安装 已安装完成python/django的情况下安装 pip install uwsgi cd /usr/share/nginx/html/ vim ...

  8. PAT Basic 1055 集体照 (25 分)

    拍集体照时队形很重要,这里对给定的 N 个人 K 排的队形设计排队规则如下: 每排人数为 /(向下取整),多出来的人全部站在最后一排: 后排所有人的个子都不比前排任何人矮: 每排中最高者站中间(中间位 ...

  9. python中使用uwsgi启动wsgi应用

    uwsgi --http :8000 --wsgi-file wxhttpapi2.py --callable application --processes 4 --threads 2

  10. Spring-Spring配置-依赖注入

    5.Spring配置 5.1.别名 <!--别名,如果添加了别名,我们也可以使用别名获取到这个对象--> <alias name="user" alias=&qu ...