- 博客(912)
- 问答 (3)
- 收藏
- 关注
原创 ngx_list_init
void *elts;// 指向实际元素数组的指针// 当前已使用的元素个数// 指向下一个 part// 指向最后一个 part// 第一个 part(内嵌,非指针)// 每个元素的大小(字节)// 每个 part 可容纳的元素个数// 所属的内存池所以就是初始化这样一个结构:分配第一个 part 的元素数组,并设置好各个字段。是 Nginx 列表结构的初始化函数为列表的第一个数据块分配内存(n * size字节);初始化列表头结构中的各个字段;
2025-12-23 15:59:14
289
原创 ngx_str_rbtree_insert_value
函数作用该函数实现了基于字符串的红黑树插入比较逻辑整数 key(通常为哈希值)→ 快速过滤;字符串长度→ 处理哈希冲突;字符串内容(字典序)→ 精确比较。它只负责定位插入位置并建立父子关系,不负责红黑树的再平衡。分离“比较逻辑”与“平衡逻辑”,使红黑树可复用于不同键类型。
2025-12-22 21:23:25
583
原创 ngx_rbtree_init
在2. 代码分析这段代码是 Nginx 1.24.0 源码中的一个宏定义:,用于初始化一个红黑树(Red-Black Tree)结构。在 Nginx 中,红黑树是一种高效的自平衡二叉搜索树,常用于定时器管理、缓存索引、等需要快速插入、查找和删除的场景。这是一个带参数的 C 宏,接受三个参数:作用:初始化哨兵节点 。详细说明:在红黑树实现中,哨兵节点(sentinel) 是一个特殊的“空”节点,通常用作叶子节点的子节点(代替 ),简化边界条件处理。 是另一个宏哨兵节点不存储实际数据,
2025-12-22 17:59:34
266
原创 ngx_array_init
void *elts;// 指向元素存储区// 当前元素个数// 单个元素大小(字节)// 已分配的容量(最多可存元素数)// 所属内存池。
2025-12-22 14:05:13
186
原创 ngx_pstrdup
在指定内存池中分配一块与源字符串等长的内存,并将源字符串的内容(src->data的src->len字节)完整复制过去,返回新内存的指针。
2025-12-21 19:23:25
306
原创 ngx_destroy_pool
执行所有注册的清理函数(如关闭 fd、释放外部资源)。(调试时)打印将要释放的内存地址和未使用空间。释放所有 large 分配的内存块(直接 malloc 的大内存)。释放内存池自身所有 ngx_pool_t 块(包括主块和后续扩展块)。
2025-12-21 16:02:05
500
原创 ngx_palloc_large
直接系统分配大内存(因 size 太大,不适合用 pool 的小块)。尝试复用已释放的 large 节点(alloc == NULL 的节点),最多检查 4 个。若无法复用,则在 pool 的小块内存中分配一个 large 结构体,用于跟踪这块大内存。将新 large 节点插入链表头,便于后续管理和释放。最终返回大内存地址。
2025-12-21 10:47:15
829
原创 ngx_palloc_small
函数整体逻辑从 pool->current 开始,遍历内存池的现有内存块。在每个块中:获取空闲起始位置 last。如果需要对齐,则对齐指针。检查剩余空间是否足够。如果足够,更新 last 并返回地址。如果所有现有块都不够用,则调用 ngx_palloc_block 分配一个新块,并在其中分配内存。
2025-12-20 23:07:47
788
原创 ngx_palloc_block
分配一个与原始主块等大的新内存块;初始化该块的管理结构(end/next/failed/last);在新块中立即分配请求的 size 字节;将新块追加到内存池块链表末尾;更新 pool->current 指针以优化后续分配效率;返回分配到的内存地址。
2025-12-20 23:05:40
812
原创 ngx_timezone_update
函数的返回值是 void,且其内部计算的结果(尤其是在 Linux 分支中的 buf)确实没有被外部使用。那么,它的意义何在?答案是:这个函数的意义不在于“返回结果”,而在于其“副作用”——即通过调用某些系统函数,强制 C 运行时库(libc)刷新内部缓存的时区状态,从而确保后续调用 时间相关函数 时使用的是系统当前最新的时区设置。触发时区状态的重新加载操作系统和 C 标准库为了性能,通常会在进程启动时一次性读取时区信息并缓存。如果系统管理员在 nginx 运行期间修改了系统时区。
2025-12-20 22:17:07
715
原创 ngx_preinit_modules
该函数的整体作用ngx_preinit_modules() 是 Nginx 模块系统初始化的关键前置步骤,主要完成以下工作:为每个静态模块分配唯一 index(等于其在 ngx_modules 数组中的位置);关联模块名称(从 ngx_module_names 数组);统计静态模块数量(ngx_modules_n);预分配最大模块容量(ngx_max_module = 静态数 + 动态预留),为后续动态模块支持做准备。
2025-12-20 17:35:39
814
原创 ngx_slab_sizes_init
ngx_slab_sizes_init() 的核心作用是:设定 slab 分配上限(ngx_slab_max_size = page/2),区分小块分配与大块(页级)分配。计算 exact 策略下的最优块大小(ngx_slab_exact_size),使得每页的块数等于一个 uintptr_t 的位数,从而用单个整数位图高效管理。计算对应的移位数(ngx_slab_exact_shift),用于后续快速地址计算。
2025-12-20 16:54:08
309
原创 ngx_crc32_table_init
函数整体作用ngx_crc32_table_init() 的作用是:确保 ngx_crc32_table_short 指向一个缓存行对齐的 CRC32 查找表副本,以优化 CPU 缓存性能。如果原始表已对齐,则直接返回;否则分配新内存、对齐、复制数据,并更新指针。
2025-12-20 15:31:42
569
原创 ngx_os_init
功能涉及变量/函数页面大小探测CPU 核心数探测ngx_ncpu缓存行大小优化进程标题初始化文件描述符限制非阻塞 socket 支持标志随机数初始化srandomOS 特定扩展这些初始化为 Nginx 的高性能、可移植性和资源管理奠定了坚实基础。
2025-12-20 15:06:11
661
原创 sysconf(_SC_NPROCESSORS_ONLN)
sysconf(_SC_NPROCESSORS_ONLN) 是 POSIX 标准中用于查询系统信息的一个系统调用,常用于 C 语言程序中获取当前系统中在线(可用)的处理器核心数量(逻辑 CPU 数量)。
2025-12-20 14:50:56
190
原创 ngx_init_setproctitle
该函数的核心作用:计算并分配堆内存,用于存放环境变量的副本。定位原始命令行参数(argv)和环境变量(environ)在内存中的连续区域末尾。将 environ 中指向该连续区域的字符串指针,重定向到新分配的堆内存。记录可安全覆盖的内存区域边界(ngx_os_argv_last),供后续 ngx_setproctitle() 使用。这样做的最终目的是:释放出从 argv[0] 开始的一段连续、可写的内存空间,用于动态修改进程标题,而不会破坏环境变量(因为 environ 已指向安全副本)。
2025-12-20 14:38:35
958
原创 ngx_os_specific_init
函数整体作用ngx_os_specific_init 的主要任务是在 Linux 平台上:获取内核信息(系统名称和版本)并保存到全局变量注册 Linux 专用的 I/O 操作函数集,使 Nginx 能高效利用 Linux 内核特性。
2025-12-19 16:33:23
593
原创 ngx_process_options
该函数的核心作用确定 Nginx 运行根目录(prefix):确定配置文件路径(conf_file):提取配置文件所在目录作为 conf_prefix:设置 error_log 路径保存额外配置参数和测试模式标志该函数是 Nginx 启动早期(main → ngx_init_cycle → ngx_process_options)的关键步骤,为后续读取配置、打开日志、加载模块奠定路径基础。
2025-12-19 15:31:56
653
原创 ngx_conf_full_name
ngx_conf_full_name 的主要用途是在 Nginx 配置解析过程中,将用户在配置文件中指定的相对路径转换为基于配置目录(或安装目录)的绝对路径。当 conf_prefix = 1(true)时:路径相对于配置文件所在目录解析当 conf_prefix = 0(false)时:路径相对于安装目录解析。
2025-12-19 15:22:16
600
原创 ngx_create_pool
的作用创建一个初始内存池,用于高效、低碎片地管理小块内存分配,并支持大内存、清理函数等扩展机制。核心设计理念:ngx_pool_t存在于分配的内存块头部,节省额外指针开销。小内存池内分配,大内存单独管理:通过 max限制,避免大块内存浪费池空间。链式扩展:当一块用完,可分配新块并链接(d.next),current 指向当前活跃块。统一生命周期管理:所有从池中分配的内存、大块、注册的清理函数,在 ngx_destroy_pool 时一次性释放/执行,无需逐个 free。
2025-12-19 12:37:17
787
原创 ngx_time_update 函数
的作用目标:高效、线程安全地缓存多种格式的时间字符串,避免在每次日志记录或 HTTP 响应时都调用系统时间函数和格式化函数。优化:循环缓冲区(slot 机制):避免覆盖正在被读取的数据。秒级去重:同 1 秒内只更新毫秒,不重新格式化。写时加锁、读时不加锁:通过指针切换实现高效并发读。多格式预生成:HTTP、日志、syslog 等格式一次性生成,供多处复用。内存屏障:保证多核一致性。
2025-12-18 22:04:10
714
原创 ngx_gmtime
函数作用ngx_gmtime是一个不依赖标准库的 UTC 时间分解函数,将 Unix 时间戳转换为年、月、日、时、分、秒、星期,并考虑:仅支持非负时间戳;最大到 9999-12-31;使用基于 March 1 的日历算法(便于处理闰年);
2025-12-18 19:56:31
898
原创 ngx_monotonic_time
函数作用的作用是:获取系统自启动以来的单调时间(不受系统时钟调整影响),并以毫秒为单位返回。典型应用场景HTTP 请求超时计算连接 keepalive 计时事件循环中的定时器管理避免因系统时间回拨导致的逻辑错误(如“未来时间”变成“过去”)
2025-12-18 15:35:55
296
springboot文件上传云服务器出错,无法写入磁盘
2021-05-28
springboot文件上传到云服务器错误?
2021-05-27
springboot项目部署到阿里云服务器后文件上传功能无法实现,如何解决?
2021-05-22
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅