您的位置:首页 > 运维架构 > Nginx

nginx共享内存管理

2014-06-07 12:21 309 查看


总共有四种类型的分配:

1、NGX_SLAB_PAGE:大于或等于ngx_pagesize/2的分配;

2、NGX_SLAB_BIG:小于ngx_pagesize/2&&大于ngx_slab_exact_size的分配;

3、NGX_SLAB_EXACT:等于ngx_slab_exact_size的分配;

4、NGX_SLAB_SMALL:小于ngx_slab_exact_size的分配;

使用ngx_slab_page_t::prev指针的低2位保存其page对应的分配类型;

对于NGX_SLAB_PAGE类型的申请,直接按page为单位分配,其ngx_slab_page_t::slab保存分配的页数;

其他类型的分配都采用bitmap的方式来记录当前页中哪些item已分配使用:

当bitmap全满,即所有item都已分配出去时,将该页从其对应slot中摘下;

当调用者释放使得该页的bitmap由全满变为不满,即又有可用item供分配时,会将该页重启链接到对应slot头部;

当释放时,bitmap变为全空,即没有一个item被上层调用者使用,该页将会被回收,将其加入到ngx_slab_pool_t::free链的头部;

ngx_slab_exact_size是使得一页刚好被划分为sizeof(uintptr_t)*8个items的大小,这时,其bitmap刚好可以用一个uintptr_t类型的数据表示;

也就是说ngx_slab_exact_size = ngx_pagesize/(sizeof(uintptr_t)*8);

对于NGX_SLAB_EXACT类型的page,使用ngx_slab_page_t::slab保存其bitmap;

对于NGX_SLAB_BIG类型的page,因为size是2的幂次方,所以只需要sizeof(uintptr_t)*4个bit就可以保存其bitmap,采用ngx_slab_page_t::slab的高位来保存其 bitmap,低位保存其shift(也就是size);

对于NGX_SLAB_SMAL类型的page,一个uintptr_t类型的数据不够保存其bitmap,所以在页开始位置为其分配一个bitmap数组:

数组大小为ngx_pagesize/size/(sizeof(uintptr_t)*8);

该数组自身占用了n = ngx_pagesize/size/8/size个item,初始化时,bitmap[0] = (2<<n) - 1,因为除了bitmap自身占用n个item,加上新分配的一共是n+1个item;

min_shift = 3,min_size = 8,是为了保证bitmap[0] = (2 << n) - 1的有效性,等价于满足n + 1 <= sizeof(uintptr_t) * 8;

32位系统,n最大为31:

当min_size为4时,n = ngx_pagesize/4/8/4 <= 31,ngx_pagesize <= 3968 < 4096;

当min_size为8时,n = ngx_pagesize/8/8/8 <= 31,ngx_pagesize <= 15872 > 4096;

64位系统,n最大为63:

当min_size为4时,n = ngx_pagesize/4/8/4 <= 63,ngx_pagesize <= 8064 < 8192;

当min_size为8时,n = ngx_pagesize/8/8/8 <= 63,ngx_pagesize <= 32256 > 8192;

综上考虑,min_size最小值为8;

使用ngx_slab_pate_t::slab保存其shift值(也就是size);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: