资源说明:通过把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.
本源码包内暂不包含可直接显示的源代码文件,请下载源码包。