Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1270490
  • 博文数量: 482
  • 博客积分: 13297
  • 博客等级: 上将
  • 技术积分: 2890
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-12 16:25
文章分类

全部博文(482)

文章存档

2012年(9)

2011年(407)

2010年(66)

分类: LINUX

2011-05-12 09:44:00

8.2.2. 内存池 
在内核中有不少地方内存分配不允许失败. 作为一个在这些情况下确保分配的
方式, 内核开发者创建了一个已知为内存池(或者是 "mempool" )的抽象. 一个
内存池真实地只是一类后备缓存, 它尽力一直保持一个空闲内存列表给紧急时
使用. 一个内存池有一个类型 mempool_t ( 在 中定义); 你可以
使用 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)(int 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 分配器为你处理这个任务. 有 2 个函数 
( mempool_alloc_slab 和 mempool_free_slab) 来进行在内存池分配原型和 
kmem_cache_alloc 和 kmem_cache_free 之间的感应淬火. 因此, 设置内存池
的代码常常看来如此: 
cache = kmem_cache_create(. . .);  
pool = mempool_create(MY_POOL_MINIMUM,mempool_alloc_slab, 
mempool_free_slab, cache);  
一旦已创建了内存池, 可以分配和释放对象,使用: 
void *mempool_alloc(mempool_t *pool, int gfp_mask); 
void mempool_free(void *element, mempool_t *pool); 
当内存池创建了, 分配函数将被调用足够的次数来创建一个预先分配的对象池. 
因此, 对 mempool_alloc 的调用试图从分配函数请求额外的对象; 如果那个分
配失败, 一个预先分配的对象(如果有剩下的)被返回. 当一个对象被用 
mempool_free 释放, 它保留在池中, 如果对齐预分配的对象数目小于最小量; 
否则, 它将被返回给系统.

http://cyuyanbiancheng.blog.hexun.com/

一个 mempool 可被重新定大小, 使用: 
int mempool_resize(mempool_t *pool, int new_min_nr, int gfp_mask); 
这个调用, 如果成功, 调整内存池的大小至少有 new_min_nr 个对象. 如果你
不再需要一个内存池, 返回给系统使用: 
void mempool_destroy(mempool_t *pool);  你编写返回所有的分配的对象, 在销毁 mempool 之前, 否则会产生一个内核 
oops. 
如果你考虑在你的驱动中使用一个 mempool, 请记住一件事: mempools 分配一
块内存在一个链表中, 对任何真实的使用是空闲和无用的. 容易使用 mempools 
消耗大量的内存. 在几乎每个情况下, 首选的可选项是不使用 mempool 并且代
替以简单处理分配失败的可能性. 如果你的驱动有任何方法以不危害到系统完
整性的方式来响应一个分配失败, 就这样做. 驱动代码中的 mempools 的使用
应当少.

====

http://cyuyanbiancheng.blog.hexun.com/61087997_d.html

阅读(861) | 评论(0) | 转发(3) |
给主人留下些什么吧!~~