资源简介
通过把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
相关资源
- FastDFS与 spring 整合使用 Nginx 来显示图
- nginx for mt7621a (newifi3 d2) openwrt 18.
- nginx优化 突破十万并发
- linux0.12源码+linux源码剖析0.12PDF+linux源
- 使用nginx与nginx-rtmp-module搭建流媒体服
- Nginx + Websocket 实现推送
- Yeslab Hans全方位解析HCIE面试考试&HCI
- nginx.zip
- 海思Hi3521A移植Nginx指南
- nginx 10w并发优化项
- GrabCut-opencv源码注释
- nginx-1.15.3.tar.gz
- LCX 源码注释 解析
- fastdfs-nginx-module-master
- nginx视频教程
- echarts的axisLabel添加tooltip功能
- Nginx服务打包插件winsw
- nginx 1.11.13 安装包
- windows_nginx_log 日志分割
- nginx安装与配置详细资料+weblogic集群配
- linux安装nginx一键脚本自己用过
- 基于stm32、0.96寸OLED实现的贪吃蛇小游
- nginx-1.10.3-1.el7.ngx.x86_64.rpm
- cut_log.sh
- nginx三套视频教程
- nginx转发sftp、ftp的配置
- nginx-1.8.1.tar.gz
- Nginx安装url_hash插件.doc
- 安装nginx必备rpm
- nginx-upstream-jvm-route-0.1.tar.gz
评论
共有 条评论