apr内存池阅读笔记-申请内存

本文是关于APR内存池的阅读笔记,重点关注内存申请过程。内存池采用父子层次结构,通过current_free_index和max_free_index限制分配器内存。分配内存时,会进行8字节对齐,并通过active链表进行管理。内存释放时先归还分配器,再统一返还系统。文章详细阐述了内存索引计算与内存节点查找策略。
摘要由CSDN通过智能技术生成

以注释的方式记录一下。
如有错误和建议欢迎留言。

current_free_index:这个值表示的是分配器当前还能接收的内存大小。
max_free_index:这个值表示分配器最大可以接收的内存大小。
在整个内存池的设计上,是有父子层次结构的,并且分配器可以为多个内存池使用,考虑这样一种情况,多个内存池从一个分配器中向系统申请了大量内存,其中几个内存池生命周期结束被销毁,则节点都归还给分配器,此时只要分配器所属的内存池不释放就会有大量内存滞留在分配器中,这样显然是不合适的。上面2个值的作用就是限制分配器可以存放的内存数量,多余的内存都还给系统。
 
 
 

APR_DECLARE(void *) apr_palloc(apr_pool_t *pool, apr_size_t in_size)

从pool中分配size大小的内存。

{
    apr_memnode_t *active, *node;   //active指向当前内存池中活跃的(已使用)节点,node指向分配内存的节点。
    void *mem;                      //返回的内存块指针
    apr_size_t size, free_index;

    //将size内存对其,并判断合法性。
    size = APR_ALIGN_DEFAULT(in_size);
    if (size < in_size) {
        if (pool->abort_fn)
            pool->abort_fn(APR_ENOMEM);

        return NULL;
    }
    active = pool->active;

define APR_ALIGN_DEFAULT(size) APR_ALIGN(size, 8)
使in_size8字节对齐,方便后续的内存的计算。
ps:没想出来这个计算会有错误的结果。


    /* If the active node has enough bytes left, use it. */
    //如果当前活跃的节点中足够,则从活跃的节点中分配内存返回。
    if (size <= node_free_space(active)) {
        mem = active->first_avail;
        active->first_avail += size;

        return mem;
    }

    //判断active链表第二个节点是否有足够空闲内存(第二个是有可能比第一个空闲内存大的),
    //当active链表中的节点没有足够空闲内存时,从分配器中分配内存。
    node = active->next;
    if (size <= node_free_space(node)) {
        list_remove(node);
    }
    else {
        
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值