Apache内存池内幕(5)[2]

[入库:2006年2月23日] [更新:2007年3月24日]

本文简介:

经过两轮分配之后,8K内存的布局如图3.5所示:
 ""
一旦完成了内存池结点的分配工作,我们必须将其挂结到内存池层次树上。挂结的过程无非就是设置parent,child以及sibling的过程。
    if ((pool->parent = parent) != NULL) {
        if ((pool->sibling = parent->child) != NULL)
            pool->sibling->ref = &pool->sibling;
        parent->child = pool;
        pool->ref = &parent->child;
    }
    else {
        pool->sibling = NULL;
        pool->ref = NULL;
    }
    *newpool = pool;
挂结的过程可以分为下面几个步骤:
(1)、将当前的结点的parent指针指向父结点,即pool->parent = parent。
(2)、设定当前结点的sibing。sibing应该指向那些与当前结点处于同一层次,并且父结点也相同的结点,新的结点总是被插入到子结点链表的首部,插入通过下面的两句实现:
pool->sibling = parent->child;
parent->child = pool;
不过如果父结点为空,意味着该结点未有兄弟结点,故pool->sibling = NULL。
(3)、设置ref成员。在apr_pool_t中,ref用于指向
在内存池结点创建的过程中,我们可以看到,内存池创建后active仍然为空。因此当前内存池中能够被使用的内存仅仅为8k- APR_MEMNODE_T_SIZE-SIZEOF_POOL_T大小。如果用户从内存池中申请更多的内存的时候,很明显,此时必须通过active去扩展该内存池对应的内存结点。这一点我们可以在内存池的内存分配中看出来。
关于作者
张中庆,目前主要的研究方向是嵌入式浏览器,移动中间件以及大规模服务器设计。目前正在进行Apache的源代码分析,计划出版《Apache源代码全景分析》上下册。Apache系列文章为本书的草案部分,对Apache感兴趣的朋友可以通过flydish at sina.com.cn与之联系! 

本文关键:,Apache内存池内幕(5),
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top