apache 运行库注解(一内存池管理)

apache内存管理

apache内存管理使用了内存池,arp_poo_t结构,使用内存池是必须的。在apache的内存池技术中使用了几个数据结构,apr_memnode_t,apr_allocator_t,就是apache内存节点,apache内存分配器。
其实开始可以猜测一下apache内存池的结构,肯定有list结构,存放实际内存。为什么不用avl树而是用list呢?因为涉及内存管理的操作就是 申请释放,对应list结构就是插入删除节点,那avl树也可以呀!但是avl树结构复杂,操作复杂,占用内存过多。
下面讲解几个内存操作结构:


struct apr_allocator_t {
    /** largest used index into free[], always < MAX_INDEX */
    /*
     free[index]
     example:
        |——|     |——|   |——|     |_|   |_|   |_|   |_|  |
    ===>|  |===> |——|===>|——|===>|_|==>| |==>| |==>| |==>|
        |——|     |——|   |——|     |_|   |_|   |_|   |_|

    \-----------------used-size-----\-------unused----\

    */
    /*
     max_free_index就是内存的总大小
    */
    apr_size_t        max_index;
    /** Total size (in BOUNDARY_SIZE multiples) of unused memory before
     * blocks are given back. @see apr_allocator_max_free_set().
     * @note Initialized to APR_ALLOCATOR_MAX_FREE_UNLIMITED,
     * which means to never give back blocks.
     */
    apr_size_t        max_free_index;
    /**
     * Memory size (in BOUNDARY_SIZE multiples) that currently must be freed
     * before blocks are given back. Range: 0..max_free_index
     */
     /*
      current_free_index就是现在剩余内存大小,注意index都是下标同时也是大小的意思
     */
    apr_size_t        current_free_index;
    /*
    多线程环境下的内存池释放
    */
#if APR_HAS_THREADS
    apr_thread_mutex_t *mutex;
#endif /* APR_HAS_THREADS */
    /*
     当前的poot属于哪一个内存池结构
    */
    apr_pool_t         *owner;
    /**
     * Lists of free nodes. Slot 0 is used for oversized nodes,
     * and the slots 1..MAX_INDEX-1 contain nodes of sizes
     * (i+1) * BOUNDARY_SIZE. Example for BOUNDARY_INDEX == 12:
     * slot  0: nodes larger than 81920
     * slot  1: size  8192
     * slot  2: size 12288
     * ...
     * slot 19: size 81920
     */
    //    核心内存处理结构
    //    apr_memnode_t {
    //                 struct apr_memnode_t {
    //             /**/
    //             apr_memnode_t *next;            /**< next memnode */
    //             /*指向自己的引用*/
    //             apr_memnode_t **ref;            /**< reference to self */
    //             /*内存池的尺寸*/
    //             apr_uint32_t   index;           /**< size */
    //             /*有多少内存是已经释放的*/
    //             apr_uint32_t   free_index;      /**< how much free */
    //             /*
    //             指向第一个已经释放的内存节点位置
    //             */
    //             char          *first_avail;     /**< pointer to first free memory */
    //             /*
    //             指向内存池释放节点指针最后的位置
    //             */
    //             char          *endp;            /**< pointer to end of free memory */
    //         };
    //    }


     /*free[]memnode节点*/
    apr_memnode_t      *free[MAX_INDEX];
};

note:上面已经注释了memnode节点,这是实际存内存的结构

下面就是内存池:

struct apr_pool_t {
    apr_pool_t           *parent;
    apr_pool_t           *child;

    apr_pool_t           *sibling;
    apr_pool_t          **ref;

    cleanup_t            *cleanups;

    cleanup_t            *free_cleanups;
    /*
     分配子
    */
    apr_allocator_t      *allocator;
    struct process_chain *subprocesses;
    apr_abortfunc_t       abort_fn;
    apr_hash_t           *user_data;
    const char           *tag;

#if !APR_POOL_DEBUG
    /*
     active指向memnode节点
    */
    apr_memnode_t        *active;
    /*
     self指向节点自己
    */
    apr_memnode_t        *self; /* The node containing the pool itself */
    char                 *self_first_avail;

#else /* APR_POOL_DEBUG */
    apr_pool_t           *joined; /* the caller has guaranteed that this pool
                                   * will survive as long as ->joined */
    debug_node_t         *nodes;
    const char           *file_line;
    apr_uint32_t          creation_flags;
    unsigned int          stat_alloc;
    unsigned int          stat_total_alloc;
    unsigned int          stat_clear;
#if APR_HAS_THREADS
    apr_os_thread_t       owner;
    apr_thread_mutex_t   *mutex;
#endif /* APR_HAS_THREADS */
#endif /* APR_POOL_DEBUG */
#ifdef NETWARE
    apr_os_proc_t         owner_proc;
#endif /* defined(NETWARE) */
    cleanup_t            *pre_cleanups;
#if APR_POOL_CONCURRENCY_CHECK

#define                   IDLE        0
#define                   IN_USE      1
#define                   DESTROYED   2
    volatile apr_uint32_t in_use;
    apr_os_thread_t       in_use_by;
#endif /* APR_POOL_CONCURRENCY_CHECK */
};

apr_pool_t的结构就是一个树结构,在创建内存池时可以插入不同的内存池对象。
其他结构成员没有注释,但是不影响内存池结构的完整性接下来几天我会注释内存池的申请和释放过程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值