Ngnix 源码学习(4)----内存池的申请

嗨,由于最近一周都在忙着工作的时候,江门移动割接,配合华为的一些无理要求。烦死。而且,我最近都打算每天晚上要跑2.5公里。锻炼身体。

本节主要将要讲述Ngnix是如何使用内存池的。

下面这些函数都是在文件 ngx_palloc.c 中实现。

首先我们结构已经定下来了。那么我们就要在内存上申请了。 看如下定义函数。

调用的时候代码:

pool = ngx_create_pool(NGX_CYCLE_POOL_SIZE, log);


ngx_create_pool 函数如下:

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

    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;
}
下面是ngx_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;
}

函数ngx_create_pool 的第一个参数是要申请内存的大小。

下面一个图片比较直观的反映了申请的内存结构

 

今天就只说这些。内存池的申请。

更多文章欢迎关注:http://blog.csdn.net/wallwind

你可能感兴趣的:(Ngnix 源码学习(4)----内存池的申请)