nginx 动态内存分配分析

创建一个内存池

函数源码如下

ngx_pool_t *
ngx_create_pool(size_t size, ngx_log_t *log)
{
    ngx_pool_t  *p;

/*NGX_POOL_ALIGNMENT大小对齐,分配size大小内存,返回地址为NGX_POOL_ALIGNMENT的整数倍*/

   p = ngx_memalign(NGX_POOL_ALIGNMENT, size, log);
    if (p == NULL) {
        return NULL;
    }

/*记录下一个内存池的地址*/

    p->d.last = (u_char *) p + sizeof(ngx_pool_t);

/*记录本次内存的结束地址*/
    p->d.end = (u_char *) p + size;
    p->d.next = NULL;
    p->d.failed = 0;

/*获取除本内存池大小剩下的内存大小*/

    size = size - sizeof(ngx_pool_t);

/*判断内存池分配大小是否超出已定最大值*/
    p->max = (size < NGX_MAX_ALLOC_FROM_POOL) ? size : NGX_MAX_ALLOC_FROM_POOL;

    /*本次可用的内存池地址*/

   p->current = p;
    p->chain = NULL;
    p->large = NULL;
    p->cleanup = NULL;
    p->log = log;

    return p;
}

从内存池中取可用内存分配给变量,源码如下

void *
ngx_palloc(ngx_pool_t *pool, size_t size)
{
    u_char      *m;
    ngx_pool_t  *p;

    if (size <= pool->max) {/*判断申请额度是否超过最大值,是则申请大块内存*/

        p = pool->current;
        /*分配size大小的内存,如果不够则再开辟*/
        do {
            m = ngx_align_ptr(p->d.last, NGX_ALIGNMENT);

            if ((size_t) (p->d.end - m) >= size) {
                p->d.last = m + size;

                return m;
            }

            p = p->d.next;

        } while (p);

        return ngx_palloc_block(pool, size);/*无够用内存池新开一个内存池*/
    }

    return ngx_palloc_large(pool, size);/*超出最大值新开一个大内存池*/
}

总结,nginx内存管理总体思路,建立一个内存池结构体,记录当前的内存池详细情况,够用则从内存池链表中取出内存分配给变量使用,不够则重新开辟内存池,如果分配的变量太大,则新开辟大额内存池

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值