星期六, 三月 31, 2007

Apache 中内存管理的三种境界

Apache 中内存管理的三种境界

zhaozg http://zhaozg.googlepages.com

中国文化中几乎所有的数字都被冠以特殊的意义,《易》曰:"道生一,一生二,二生三,三生万物"。由于个人知识与经历的限制,无法完成对于万物的探究,但是三以下的数字数字还是可以追述的。

Apache作为万维网首屈一指的高性能Web服务器,如果能够从科学与哲学的角度进行分析,将会对我们的软件开发者的学习工作工作带来极大的好处.

正如《易》曰"书不尽言,言不尽意",写出来的未必能够表达我说出来的,说出来的未必能够表到我想说出来的。所以如果我不能描绘出我体会到的Apache中内存管理的三种境界,请不要责怪。

APR(Apache Platform Protable) Library 是Apache为了实现跨平台而抽象出来的一套开发库,内存管理作为与系统紧密相关的软件开发的基础之一,在APR中得到了充分的体现。

第一层境界,基于apr_pool的内存管理。apr_poll简单易用,但是只能申请内存而无法释放或返回缓存池,只能到apr_pool_t到清除(clear)或消毁(destory)才能够继续使用,而且如果根pool没有被消毁之前,内存是无法返回系统的,不够灵活,apr_pool中用了一个全局的根pool,而高级方式的apr_pool可以在第三层境界的基础上直接创建。所以如果Apache中使用了比较大的内存,尤其是在频繁使用的情况下,最好不要用Apache中已近存在的pool结构,而是采用apache中的第二层境界来解决。

第二层境界,基于apr_bucket_alloc的内存管理。与apr_pool向相比,apr_bucket_alloc,最大的特点是可以将以申请的内存通过释放而返回到内存池,但不返回系统,以后申请内存可以直接从内存池中获取,并且对于小块内存的管理作了优化,接单易用而且灵活,并且apr_bucket_alloc在apr_util中实现,apache中内存管理的第一层与第三曾境界是在apr中实现的。可笑的是apr_bucket_alloc可以通过第一层apr_pool来创建,不过在创建的时候使用的是apr_pool中的allocator(第三层结构的指针)。

第三层境界,基于apr_allocator的内存管理。apr_allocator的内存管理更为低级,内存申请返回一个表示内存的结构而不是实现可用的内存指针,可以在此基础上实现诸如小块内存的优化管理,apr_pool与apr_bucket_alloc都是在apr_allocator的基础上实现的。apr_allocator的基础就是标准的malloc/free函数了。

整理一下,关系如下

malloc/free-->apr_allocator-------->apr_bucket_alloc
/
/
/
apr_pool


第二层境界,基于apr_bucket_alloc的内存管理使用举例

初始化操作

       apr_pool_t *pool;
apr_allocator_t* alloc;
apr_bucket_alloc_t* balloc;
       apr_allocator_create(&lloc);
apr_pool_create_ex(&pool, NULL, NULL, alloc);
balloc = apr_bucket_alloc_create(pool);

内存申请与释放

char* p= apr_bucket_alloc(size, balloc);
apr_bucket_free(p);
         

终止化操作:

       apr_bucket_alloc_destroy(balloc);
apr_pool_destroy(pool);
apr_allocator_destroy(alloc);