nginx内存池——palloc函数

ngx_palloc.h

struct ngx_pool_s {
    ngx_pool_data_t       d; //内存池的数据区域
    size_t                max; //一次可以分配的最大空间
    ngx_pool_t           *current; //指向当前内存地址,ngx_chain_t最后一个节点
    ngx_chain_t          *chain; //缓冲区链表
    ngx_pool_large_t     *large; //大块内存分配链表
    ngx_pool_cleanup_t   *cleanup; //清除分配内存
    ngx_log_t            *log; //日志
};
typedef struct {
    u_char               *last;//内存中未使用的开始地址
    u_char               *end; //内存池的结束地址
    ngx_pool_t           *next; //指向下一个内存池的指针
    ngx_uint_t            failed; //分配内存失败的次数
} ngx_pool_data_t;

struct ngx_pool_large_s {
    ngx_pool_large_t     *next; //指向下一个数据块地址
    void                 *alloc; //数据块的指针地址
};

struct ngx_pool_cleanup_s {
    ngx_pool_cleanup_pt   handler; //此存储的清除函数
    void                 *data; //指向数据的存储地址
    ngx_pool_cleanup_t   *next; //指向下一个ngx_pool_cleanup_s结构的指针
};

数据结构图
在这里插入图片描述
内存分配:

//此函数
void *
ngx_alloc(size_t size, ngx_log_t *log)
{
    void  *p;

	//使用malloc分配一块内存
    p = malloc(size);
    if (p == NULL) {
        ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,
                      "malloc(%uz) failed", size);
    }
	//生成内存分配日志
    ngx_log_debug2(NGX_LOG_DEBUG_ALLOC, log, 0, "malloc: %p:%uz", p, size);

    return p;
}

//此函数在调用ngx_alloc函数将内存分配成功后会调用ngx_memzero函数将内存设置为0
void *
ngx_calloc(size_t size, ngx_log_t *log)
{
    void  *p;

    p = ngx_alloc(size, log);

    if (p) {
        ngx_memzero(p, size);
    }

    return p;
}

内存池创建:

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

	//相当于分配一个size大小的内存,ngx_alloc(size, log)
    p = ngx_memalign(NGX_POOL_ALIGNMENT, size, log);
    if (p == NULL) {
        return NULL;
    }

    p->d.last = (u_char *) p + sizeof(ngx_pool_t);//指向数据未使用内存起始位置,即ngx_pool_t结构体结尾之后位置
    p->d.end = (u_char *) p + size;//内存的结束位置
    p->d.next = NULL; //指向下一个内存池的指针
    p->d.failed = 0; //失败次数

    size = size - sizeof(ngx_pool_t);//将size初始化为实际可用内存大小
    p->max = (size < NGX_MAX_ALLOC_FROM_POOL) ? size : NGX_MAX_ALLOC_FROM_POOL; //如果size大于内存池的最大内存,max为内存池的最大内存,否则为size
    p->current = p; //指向内存池的首地址
    p->chain = NULL;
    p->large = NULL;
    p->cleanup = NULL;
    p->log = log;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值