Nginx-ngx_alloc

Nginx中,内存都是交由自己管理,一方面是为了提高内存的使用率,另外一方面是减小系统开销,提供程序运行的效率。为了清晰的理解内存管理的思路,先需要从内存分配,然后再到内存管理,这里先看下ngx_alloc 这源代码,这个文件在 nginx-1.4.2/src/os/unix/这个目录下。

这个文件没有相关的数据结构说明,只有几个实现内存分配的行数,可以一个一个看下来

void *
ngx_alloc(size_t size, ngx_log_t *log)
{
    void  *p; 

    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;
}
这个函数主要是实现c里常用malloc来分配内存。 

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_calloc函数是对ngx_alloc的封装,但是多一个操作就是内存的初始化,将申请到的内存空间都初始化为0

#if (NGX_HAVE_POSIX_MEMALIGN)

void *
ngx_memalign(size_t alignment, size_t size, ngx_log_t *log)
{
    void  *p;
    int    err;

    err = posix_memalign(&p, alignment, size);

    if (err) {
        ngx_log_error(NGX_LOG_EMERG, log, err,
                      "posix_memalign(%uz, %uz) failed", alignment, size);
        p = NULL;
    }

    ngx_log_debug3(NGX_LOG_DEBUG_ALLOC, log, 0,
                   "posix_memalign: %p:%uz @%uz", p, size, alignment);

    return p;
}
#elif (NGX_HAVE_MEMALIGN)

void *
ngx_memalign(size_t alignment, size_t size, ngx_log_t *log)
{
    void  *p;

    p = memalign(alignment, size);
    if (p == NULL) {
        ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,
                      "memalign(%uz, %uz) failed", alignment, size);
    }

    ngx_log_debug3(NGX_LOG_DEBUG_ALLOC, log, 0,
                   "memalign: %p:%uz @%uz", p, size, alignment);

    return p;
}

#endif     
这两个函数是在某些系统条件编译时才会生效可以替代ngx_alloc函数。 这两个函数的好处就是编译器和c库可以透明的帮助处理内存对其问题,其返回的内存大小一定是alignment的整数倍,详情还可以参考【 memalign说明


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值