资源简介
通过把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
相关资源
- vc编写中国象棋详细源码注释并附有视
- 轻量级文件服务器Fdfs搭建(fastDFS+n
- nginx-rtmp-win32-master.rar
- yaf-2.1.17.tgz
- 自动reload nginx解决nginx对动态域名不重
- Linux中nginx安装相关资源包
- nginx-1.19.0-1.aarch64.rpm银河麒麟+飞腾
- nginx-1.19.0-1.aarch64.rpm 银河麒麟V10+飞腾
- nginx与zookeeper交互,同步数据,发送系
- linux2.6.11.12内核源码注释
- Nginx+keepalived双机热备主从模式高可用
- 搭建rtmp流媒体服务器的nginx
- NGINX Cookbook 无水印英文高清完整.pdf版
- 精通Nginx 第二版 高清 非扫描 带书签
- nginx-1.17.10.rar
- muduo源码注释非常详细
- [Nginx] Nginx HTTP Server 第2版 (英文版)
- Nginx源代码VS2010直接编译运行
- nginx服务器插件之net-snmp-5.6.1.1.tar.gz
- CentOS-6.6-x86_64 nginx 依赖 pcre-devel zli
- nginx搭建flv流媒体教程与资源
- The Complete NGINX Cookbook官网 pdf 英文高清
- nginx1.9.9 vs2015 完整项目
- nginx依赖包nginx依赖包
- Nginx运维宝典
- Nginx核心知识文档.rar
- Nginx教程从入门到精通205419
- Radware Alteon指导书中文版
- nginx rtmp转发服务器
- fastDFS+Nginx安装包(Linux版本)
评论
共有 条评论