ngx_cycle 的初始化
整个初始化过程中,最重要的就是全局变量 nginx_cycle 的初始化,很多变量都是在这个过程中初始化的
nginx_cycle 又是通过两个局部变量 init_cycle 和 cycle 实现初始化的
事实上,日志初始化也可以算是对 nginx_cyle 的初始化,因为在代码中接下来马上要发生的就是一个赋值
ngx_memzero(&init_cycle, sizeof(ngx_cycle_t)); init_cycle.log = log; ngx_cycle = &init_cycle; // 创建内存池 1KB init_cycle.pool = ngx_create_pool(1024, log); if (init_cycle.pool == NULL) { return 1; } // 保存调用参数到全局变量,init_cycle 只用于提供 log 参数 if (ngx_save_argv(&init_cycle, argc, argv) != NGX_OK) { return 1; } // 保存配置文件路径、程序运行路径、调用参数到 init_cycle if (ngx_process_options(&init_cycle) != NGX_OK) { return 1; } // 获取操作系统信息、CPU信息、最大连接数、是否支持非阻塞连接等 if (ngx_os_init(log) != NGX_OK) { return 1; } /* * ngx_crc32_table_init() requires ngx_cacheline_size set in ngx_os_init() */ // 对齐校验表 if (ngx_crc32_table_init() != NGX_OK) { return 1; } // 获取所有继承连接fd的相关信息 if (ngx_add_inherited_sockets(&init_cycle) != NGX_OK) { return 1; }
内存池
nginx 是通过资源集中管理的方式管理资源的,即打开所有即将要用的资源,以备随时取用,无论是文件还是内存
这样做的好处是避免了每次创建、打开资源造成的性能消耗
因此,便有了内存池模块,用来集中申请内存资源并进行内存资源的管理和分配
内存池结构:
// struct ngx_pool_data_t // 内存池数据块结构 {{{ typedef struct { u_char *last; // 当前内存分配的结束位置 u_char *end; // 内存池的结束位置 ngx_pool_t *next; // 下一内存池 ngx_uint_t failed; // 内存分配失败计数 } ngx_pool_data_t; // }}} // struct ngx_pool_s // 内存池结构 {{{ struct ngx_pool_s { ngx_pool_data_t d; // 内存池数据块 size_t max; // 待分配内存大小 ngx_pool_t *current; // 指向当前内存池起始位置 ngx_chain_t *chain; ngx_pool_large_t *large; // 指向大块内存分配 ngx_pool_cleanup_t *cleanup; // 析构函数 ngx_log_t *log; // 内存分配相关的log }; // }}}
在这个函数中,使用了一个封装好的函数 ngx_memalign,这个函数是对系统中按照数据对齐方式分配内存的函数的封装,在不同的系统中实现方式不同,通过宏定义,实现了操作系统的适配,这是一个很漂亮的技巧
#if (NGX_HAVE_POSIX_MEMALIGN) // void * ngx_memalign(size_t alignment, size_t size, ngx_log_t *log) // 用数据对齐的方式进行内存分配 {{{ void * ngx_memalign(size_t alignment, size_t size, ngx_log_t *log) { void *p; int err; // size 单位是 byte 而不是 bit err = posix_memalign(&p, alignment, 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 * ngx_memalign(size_t alignment, size_t size, ngx_log_t *log)
所有有关内存分配的系统调用函数的封装都定义在 ngx_alloc.c 文件中
这里用到了 posix_memalign 系统调用,使用这个系统调用分配出来的内存是默认按照第二个参数的大小对齐的,这样在进行数据读写的时候,CPU可以周期地对整块数据进行读写,很大程度的节省了CPU时间
这个系统调用所分配的内存也是存在于堆内存中的,可以使用 free 函数进行释放,不过 malloc 分配的内存默认也是对齐的,它相对于 malloc 的优势仅仅在于可以指定默认对齐大小。
函数完成了内存池的初步分配,执行后 pool 取值:
$23 = (ngx_pool_t *) 0x80fe9f0 (gdb) p *init_cycle.pool $24 = { d = { last = 0x80fea18, end = 0x80fedf0, next = 0x0, failed = 0 }, max = 984, current = 0x80fe9f0, chain = 0x0, large = 0x0, cleanup = 0x0, log = 0x80e3020 <ngx_log> }
如下图所示:
本文向大家介绍基于Nginx的Mencached缓存配置详解,包括了基于Nginx的Mencached缓存配置详解的使用技巧和注意事项,需要的朋友参考一下 简介 memcached是一套分布式的高速缓存系统,memcached缺乏认证以及安全管制,这代表应该将memcached服务器放置在防火墙后。memcached的API使用三十二比特的循环冗余校验(CRC-32)计算键值后,将数据分散在不同的
本文向大家介绍解析Nginx中的日志模块及日志基本的初始化和过滤配置,包括了解析Nginx中的日志模块及日志基本的初始化和过滤配置的使用技巧和注意事项,需要的朋友参考一下 无论在任何项目中,日志都是一个非常重要的模块,无论是问题定位还是日常信息的管理,都离不开他 在nginx中,ngx_errlog_module模块专门用于处理nginx日志信息,是nginx的core模块之一 在 main 函数
本文向大家介绍Nginx服务器搭建和基本配置详解,包括了Nginx服务器搭建和基本配置详解的使用技巧和注意事项,需要的朋友参考一下 Nginx(engine X) 是一个高性能的 HTTP 服务器和反向代理服务器,这款软件开发的目的是为了解决 C10k 问题。 Nginx 的架构利用了许多现代操作系统的特性,以实现一个高性能的 HTTP 服务器。例如在 Linux 系统上,Nginx 使用了 ep
本文向大家介绍django-初始配置(纯手写)详解,包括了django-初始配置(纯手写)详解的使用技巧和注意事项,需要的朋友参考一下 我们通过django-admin startproject zhuyu命令创建好项目后,在pycharm中打开 我们需要在在该项目中,配置一些相关操作。 1、template(存放模板的文件夹) 如果你是通过pycharm创建项目的话,那么在settings.py
本文向大家介绍图文详解Java中class的初始化顺序,包括了图文详解Java中class的初始化顺序的使用技巧和注意事项,需要的朋友参考一下 class的装载 在讲class的初始化之前,我们来讲解下class的装载顺序。 以下摘自《Thinking in Java 4》 由于Java 中的一切东西都是对象,所以许多活动 变得更加简单,这个问题便是其中的一例。正如下一章会讲到的那样,每个对象的代
大家好,我是Kotlin语言的新手,在运行Hello World代码的过程中遇到了一些错误。 无法为初始化脚本'C:\User\HP\AppData\Local\Temp\wrapper_init.gradle'打开初始化泛型类缓存(C:\User\HP. gradle\cache\6.8\script\5mjee5vr2mabvexqryui51pg)。 缺陷源单元“BuildScript”中的