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

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;

最新文章

  1. Unity AssetBundle爬坑手记
  2. JavaScript算法(冒泡排序、选择排序与插入排序)
  3. 关于安卓APP的启动界面
  4. git和SVN交互(待完善)
  5. 【笔记】select2的使用
  6. 【读书笔记《Android游戏编程之从零开始》】1.Android 平台简介与环境搭建
  7. nodejs调试工具node-inspector入门随笔
  8. Java加密算法 AES
  9. 24种设计模式--多例模式【Multition Pattern】
  10. strcmp() Anyone?
  11. BZOJ 3230: 相似子串( RMQ + 后缀数组 + 二分 )
  12. linux常用命令(不断更新)
  13. Spring Boot整合Quartz实现定时任务表配置
  14. 手机app数据的爬取之mitmproxy安装教程
  15. BeanFactory和ApplicationContext的比较
  16. 基于Java的REST架构风格及接口安全性设计的讨论
  17. 【SqlServer】聚集索引与主键、非聚集索引
  18. 1.strcpy使用注意
  19. 十一、springcloud之链路追踪Sleuth
  20. [Visual Studio] 安装清单

热门文章

  1. IE6图片透明问题
  2. ES6 class 于 继承 extends
  3. S2-019、S2-020
  4. JS实现数组去重(重复元素保留一个)
  5. Iterator 其实很简单(最好理解的工厂模式的例子)
  6. Aop动态代理和cglib
  7. Windows10关闭自动更新方法
  8. 作业十一——LL(1)文法的判断
  9. bitset 来计算位
  10. c# json数据解析——将字符串json格式数据转换成对象或实体类