Nginx Worker 进程通过CPU原子操作(如CAS、fetch-and-add)实现无锁协同,用于共享计数器、共享内存区访问及事件通知;仅在初始化等极少数场景使用轻量自旋锁。

Nginx 的 Worker 进程之间不依赖传统锁(如互斥锁、信号量)来同步共享资源,而是大量借助 CPU 提供的原子操作(atomic operations)配合特定数据结构与设计模式,实现高效、低开销的“无锁”(lock-free)协同。这并非完全杜绝所有同步机制,而是避免阻塞式加锁,核心在于用原子读-改-写指令(如 compare-and-swap、fetch-and-add)保障关键路径的线程安全。
原子操作在共享计数器中的应用
Nginx 使用原子整数(如 ngx_atomic_t)管理全局连接数、请求计数、缓存引用计数等。例如:ngx_atomic_fetch_add 可安全地对连接总数递增,无需加锁;多个 Worker 同时调用该函数,底层由 CPU 保证操作的不可分割性。这种设计消除了计数竞争导致的锁争用,尤其在高并发下显著降低延迟。
共享内存区域(Shared Memory Zone)的无锁访问
通过 shared memory 指令(如 limit_req_zone、ssl_session_cache)定义的共享内存块,其元数据(如哈希桶头、链表指针)均采用原子操作维护。例如,在查找或插入 SSL 会话时,Nginx 使用原子比较并交换(ngx_atomic_cmp_set)更新哈希桶的 next 指针,避免多 Worker 修改同一链表时的临界区锁定。
Worker 间事件通知的轻量同步
当主进程重载配置或 Worker 需感知状态变更时,Nginx 不依赖信号量或条件变量,而是通过共享内存中一个原子标志位(如 ngx_signal_worker_reload)+ 内存屏障(ngx_memory_barrier)实现通知。各 Worker 定期原子读取该标志,一旦发现置位,即主动执行 reload 流程。这种方式无锁、无唤醒开销,且避免了信号处理的不确定性。
注意:无锁 ≠ 完全无同步原语
严格意义上,Nginx 并非所有场景都“无锁”。部分边界情况(如共享内存初始化、大块内存分配)仍使用轻量级自旋锁(ngx_shmtx_t),但这类锁仅在极短临界区内使用,且不导致进程睡眠。真正的高性能路径(请求处理、计数、缓存查找)全部规避了系统级锁,依赖原子指令 + 精心设计的数据结构(如 lock-free 链表、带版本号的引用计数)达成事实上的无锁协作。










