apr研究-内存池-1

来源:互联网 发布:学生p2p网络投资 编辑:程序博客网 时间:2024/05/29 02:59

APR(Apache portable Run-time libraries,Apache可移植运行库)。apr是由纯粹的c语言开发的。

主要作用:提供一个可以跨越多个操作系统的底层平台。现在著名的apache服务器就是在这个基础上开发的。可见,他的稳定性,和速度都是屈指可数的。


这里我要研究的就是他的mempool(内存池)。


http://apr.apache.org/

(从上面的网址,我们可以下载到,最新的版本。)

解压后有三个文件需要研究:apr_allocator.h,apr_pools.h,apr_pools.c


首先研究几个重要的数据结构定义:

1.【基本的内存节点】结构。

struct apr_memnode_t {

    apr_memnode *next; /* 下一个内存节点 */

    apr_memnode **ref; /* 指向自己的引用 */

    apr_uint32_t index; /* 大小 */

    apr_uint32_t free_index; /* 自由内存的大小 */

    char *first_avail;/* 指向第一块自由内存 */

    char *endp; /* 指向最后一块自由内存 */

}

2.【内存池】结构。

struct apr_pool_t {

    apr_pool_t *parent;

    apr_pool_t *child;

    apr_pool_t *sibling;

    apr_pool_t **ref;

   .../*中间省略了一些,^_^*/

   apr_memnode_t *active;

   apr_memnode_t *self;

   char *self_first_abail;

   .../*中间省略了一些,^_^*/

}

注意:通过上面可以看出,apr_memnode_t和apr_pool_t之间的联系(apr_pool_t是二叉树的结构)。

不难看出,apr_pool_t也是被保存到apr_memnode_t中的。是不是这样呢?

我们分析一下:apr_pool_t 中有一个"apr_memnode_t *self;",这个就是指向存储apr_pool_t的apr_memnode_t节点的指针,这里留的这个位置,呵呵,是不是我们所想象呢。

那么我们找一下源代码的语句来看看:

函数:apr_pool_create_ex里面有关于self的操作,我们可打开apr_pools.c文件搜索看看这个函数。apr_pool_create_ex这个函数在apr_pool_initialize函数里面被调用,用来创建global_pool。

待续。。。