PJLIB 内存池实现

来源:互联网 发布:d3.js 鼠标右键 编辑:程序博客网 时间:2024/06/15 22:35

PJLIB内存池

1.PJLIB内存池优势

1.1 不用于其他的内存池实现方式,PJLIB内存池允许申请不同大小的内存空间
1.2 高效率的内存分配过程,内存分配算法复杂度为O(1),这都源于其内存分配
    实现简单(只需要少许指针的运算操作),而且不需要加锁.
1.3 PJLIB POOL分配的内存很"纯净".PJLIB POOL不需要跟踪应用分配的独立内
    存块儿,所以经PJLIB POOL分配的内存没有多余的"负载"(除了为了内存地
    址对齐所需的字节 PJ_POOL_ALIGNMENT - 1).
1.4 避免内存泄漏.PJLIB POOL天生具有"垃圾回收"机制.实际上,没有必要释
    放分配于内存池的内存块儿.当销毁内存池时,之前分配与该内存池的所
    有内存块儿都会自动的被释放.
1.5 而且,由于每个内存池都有自己的名字,即便出现了内存泄漏,也可以方
    便的检测系统目前激活的内存池,从而快速的追踪出内存泄漏的根源.
1.6 PJLIB POOL是线程不安全的,之所以这么设计是为了得到高效的内存池操
    作和避免不必要的加锁操作.PJLIB POOL假设更高级的结构来管理对于内存
    池的互斥操作,从而达到线程安全. 
1.7 另外,PJLIB POOL API具有类似于C++ new的操作属性,即如果内存分配失败
    其会抛出PJ_NO_MEMORY_EXCEPTION异常.调用者可以捕获该异常,并做出相应
    的处理.该机制可以避免每次分配完内存之后必须检测内存分配的结果的尴尬.
    当然,用户可以自己在pool factory中定制不同的处理方式.
1.8 PJLIB POOL支持任何底层的内存分配/回收方式.一般默认的方式为malloc/free
    方式.用户可以定义其他的方式,例如可以从一块儿静态的内存区域分配内存等.

2.PJLIB Memory POOL性能 

 集合上述诸多的优势,PJLIB POOL的内存分配和释放性能为malloc()/free()的
    30倍;
    测试环境:
    OS:Linux
    CPU:P4/3.0GHz
    测试方式:每秒超过1.5亿次的内存分配操作

3.PJLIB Memory POOL 使用注意事项

3.1 PJLIB在创建POOL的时候,需要用户制定一个POOL初始大小 initial_size,POOL
    创建成功后, 其会向系统申请initial_size大小的内存空间.应用程序的设计者
    需要"必须"谨慎的选择POOL的初始大小,否则过大的初始值会导致系统内存浪费.
    
    但是,POOL可以增长.应用程序设计者可以指定内存增长的大小,每次POOL增长的
    时必须依照该增量增长.

3.2 PJLIB POOL内存"不能"缩小! 其不具备内在的内存块儿释放功能,所以没有办法
    释放内存池未被使用的内存空间给系统.
    
    应用程序设计者需要注意频繁的从POOL中分配内存,长此以往会导致内存池不断
    增大,最终可能会导致系统运行异常.
 

4.PJLIB Memory POOL 使用方式

4.1 Pool Factory 创建
    首先,应用程序需要初始化一个pool factory(一个应用程序中一般此需要调用
    一次). PJLIB 提供了了一种pool factory的实现方式,即caching pool,可以
    通过调用 #pj_caching_pool_init()进行初始化.
4.2 Pool 创建
    通过调用 #pj_pool_create()创建内存池对象pool,同时需要传递:pool factory
    |pool name|inital size|increment/expansion size参数.
4.3 memory 分配
    应程程序可以通过调用 #pj_pool_alloc()|#pj_pool_calloc()|#pj_pool_zalloc()
    实现动态内存的申请.
4.4 Pool 销毁
   当应用程可以通过调用 #pj_pool_release()将pool对象返还给factory.依照不同类型
   的pool factory, 被释放的内存池可能会将内存资源返还给系统.   
4.4 Pool factory 销毁
   程序退出之前,需要销毁pool factory以确保所有的内存资源都返还给了操作系统.
1 0