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。
待续。。。