资源简介

通过把nginx slab的精简,把需要的头文件单独整理出来,增加了main方法,可以单独运行,代码包含了大量的中文注释,方便了了解和学习slab的运行机制 int main(int argc, char **argv) { ngx_log_t log; ngx_shm_t shm; ngx_slab_pool_t *shpool; char *ssl_session[10]; int n; ngx_pid = ngx_getpid(); memset(&log;, 0, sizeof(ngx_log_t)); memset(&shm;, 0, sizeof(ngx_shm_t)); shm.size = 512000; ngx_pagesize_shift = 0; ngx_pagesize = getpagesize(); for (n = ngx_pagesize; n >>= 1; ngx_pagesize_shift++) { /* void */ } printf("--%d\n", 1 << ngx_pagesize_shift); if (ngx_shm_alloc(&shm;) != NGX_OK) { return 1; } if (ngx_init_zone_pool(&log;, &shm;)) { return 1; } shpool = (ngx_slab_pool_t *) shm.addr; ssl_session[0] = (char *) ngx_slab_alloc_locked(shpool, 12); ssl_session[0] = (char *) ngx_slab_calloc(shpool, 56); ssl_session[1] = (char *) ngx_slab_alloc_locked(shpool, 14); ssl_session[2] = (char *) ngx_slab_alloc_locked(shpool, 11); ngx_slab_free(shpool, ssl_session[2]); ngx_slab_free(shpool, ssl_session[0]); ssl_session[2] = (char *) ngx_slab_alloc_locked(shpool, 65); return 0; } nginx的slab的内存管理方式,这种方式的内存管理在nginx中,主要是与nginx 的共享内存协同使用的。nginx的slab管理与linux的slab管理相同的地方在于均是利用了内存 的缓存与对齐机制,slab内存管理中一些设计相当巧妙的地方,也有一些地方个人感觉设计 不是很完美,或许是作为nginx设计综合考虑的结果。 nginx slab实现中的一大特色就是大量的位操作,这部分操作很多是与slot分级数组相关的。 为方便描述下面做一些说明: 1.将整个slab的管理结构称slab pool. 2.将slab pool前部的ngx_slab_pool_t结构称slab header. 3.将管理内存分级的ngx_slab_page_t结构称slot分级数组. 4.将管理page页使用的ngx_slab_page_t结构称slab page管理结构. 5.将具体page页的存放位置称pages数组. 6.将把page分成的各个小块称为chunk. 7.将标记chunk使用的位图结构称为bitmap.

资源截图

代码片段和文件信息


/*
 * Copyright (C) Igor Sysoev
 * Copyright (C) Nginx Inc.
 */


#include 
#include 

//getconf PAGE_SIZE 命令可以查看
ngx_uint_t  ngx_pagesize;//见ngx_os_init  返回一个分页的大小,单位为字节(Byte)。该值为系统的分页大小,不一定会和硬件分页大小相同。
//ngx_pagesize为4M,ngx_pagesize_shift应该为12
ngx_uint_t  ngx_pagesize_shift; //ngx_pagesize进行移位的次数,见for (n = ngx_pagesize; n >>= 1; ngx_pagesize_shift++) { /* void */ }

/*
如果能知道CPU cache行的大小,那么就可以有针对性地设置内存的对齐值,这样可以提高程序的效率。
Nginx有分配内存池的接口,Nginx会将内存池边界对齐到 CPU cache行大小  32位平台,ngx_cacheline_size=32
*/
ngx_uint_t  ngx_cacheline_size;//32位平台,ngx_cacheline_size=32


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;
}


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;
}


#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);// 分配一块 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

评论

共有 条评论