分类: LINUX
2015-09-06 17:24:55
内存池
内存池是一种内存分配的方式,一般情况下用new、malloc等API申请。
内存池设计的目的是在给定的buffer上建立内存管理机制,根据用户需求从该buffer上分配内存或者将已经分配的内存释放回buffer中。
其目的是减少内存碎片,平均效率高于c语言的maclloc和free。
设计思路是将buffer分为四个部分,
第一是mem_pool结构体
第二部分是内存映射表
第三部分是内存chunk结构体缓冲区
第四部分是实际可分配的内存区。
内存池是在真正使用内存之前,先申请分配一定数量的、大小相等的内存块留作备用,当有新的内存需求,就从内存池中分配出一部分,如果不够就继续申请,优点是快速,缺点是会造成内存碎片。
在内核中很多地方内存分配失败,内核创建了一个已知为内存池的抽象。
一个内存池真实的只是一类后备缓存。它尽力已知保持一个空闲内存列表给紧急时使用,一个内存池的一个类型mempool_t,可以使用mempool_create创建一个。
Mempool_t *mempool_create()
min_nr参数是内存池应当已知保留的最小数量的分配的对象。实际的分配和释放对象由alloc_fn和free_fn处理。
Typedef void:typedef void,给mempool_create最后的参数(pool_data)被传递给alloc_fn和free_fn。
当内存池创建了,分配函数江北调用足够的次数来创建一个预先分配的对象池,因此,对mempool_alloc的调用是从分配函数请求额外的对象,如果那个分配失败,一个预先分配的丢向被返回,当一个对象被用mempool_free释放,它保留在池中,如果对齐与分配的对象数目小于最小量,否则,它将被发回给系统。
一个mempool可被重新定大小,使用:int mempool_resize();这个调用,如果成功,调整内存池的大小至少有new_min_nr个对象,如果你不再需要一个内存池,返回给系统调用。
Void mempool_destroy(),你编写返回所有的分配的对象,在销毁mempool之前,否则会产生一个内核oops。如果你考虑在你的驱动中使用一个mempool,mempools分配一块内存在一个链表中,对任何真实的使用是空闲的无用的。
容易使用mempools小号大量的内存,在几乎每个情况下,首选的可选项是不使用mempool并且代替以简单处理分配失败的可能性。
如果你的驱动有任何方法以不危害到系统完整性的方式来响应一个分配失败。