nginx内部锁的实现

简介: 多进程或者多线程的程序,涉及到对共享资源的修改,都需要使用到锁。最常见的情况(也一般是然并卵的情况)是对一个全局变量进行++操作,比如有个全局变量i,如果多个线程同时执行i++,教科书已经提到,是会出问题的。因为i++并不是一个原子操作,汇编之后会是三个操作: movl i(%rip

多进程或者多线程的程序,涉及到对共享资源的修改,都需要使用到锁。最常见的情况(也一般是然并卵的情况)是对一个全局变量进行++操作,比如有个全局变量i,如果多个线程同时执行i++,教科书已经提到,是会出问题的。因为i++并不是一个原子操作,汇编之后会是三个操作:

    movl    i(%rip), %eax
    addl    $1, %eax
    movl    %eax, i(%rip)

这时候就需要锁了(当然,这里的情况,你也可以嵌入汇编的方式使用fetch-and-add的方式来避免使用锁,不过,在多核情况下,你仍然需要加上lock前缀)。Nginx 是一个多进程的服务,并且引入了线程池,不可避免也需要用到锁。

Nginx内部锁的种类

读写锁

相关的代码在src/core/ngx_rwlock.[hc]

自旋锁

相关的代码在src/core/ngx_spinlock.c

基于共享内存的互斥锁

相关的代码在src/core/ngx_shmtx.[hc]。之所以需要这个,是因为Nginx中存在多个进程,在某些操作时,比如对监听的fd执行accept()操作,需要互斥进行。而由于跨了多个进程,只能将用于实现lock的内存放在共享内存。

锁的实现

看下ngx_spinlock()ngx_shmtx_lock()的代码,会发现都使用了ngx_atomic_cmp_set()这个函数。

未完待续。。

目录
相关文章
9kr
|
应用服务中间件 网络安全 nginx
通过宝塔Nginx反代HomeAssistant并添加SSL实现隐藏端口号与域名访问
HomeAssistant默认使用8123端口,带端口访问既不美观也不方便。 通过宝塔Nginx默认反代配置会出现各种意外错误,本文将通过修改HomeAssistant与反代配置解决该问题。
9kr
3937 1
通过宝塔Nginx反代HomeAssistant并添加SSL实现隐藏端口号与域名访问
|
缓存 负载均衡 算法
Nginx实现负载均衡(整合SpringBoot小demo)
Nginx实现负载均衡(整合SpringBoot小demo)
381 4
Nginx实现负载均衡(整合SpringBoot小demo)
|
存储 应用服务中间件 Linux
FastDFS+Nginx实现文件服务器
FastDFS+Nginx实现文件服务器
FastDFS+Nginx实现文件服务器
|
存储 Java 应用服务中间件
线程池设计, 从简单的我们平常设计线程池图解,到生活中的类似线程池的处理现实场景, 到简单的C++模拟nginx写的单链表组织工作队列的简单线程池实现 + nginx 部分源码刨析
线程池设计, 从简单的我们平常设计线程池图解,到生活中的类似线程池的处理现实场景, 到简单的C++模拟nginx写的单链表组织工作队列的简单线程池实现 + nginx 部分源码刨析
线程池设计, 从简单的我们平常设计线程池图解,到生活中的类似线程池的处理现实场景, 到简单的C++模拟nginx写的单链表组织工作队列的简单线程池实现 + nginx 部分源码刨析
|
存储 网络协议 Java
内存池组件以及根据nginx内存池源码设计实现简易内存池
内存池组件以及根据nginx内存池源码设计实现简易内存池
内存池组件以及根据nginx内存池源码设计实现简易内存池
|
SQL 负载均衡 应用服务中间件
nginx安装 、分发实现多域名访问同一主机不同端口
nginx安装 、分发实现多域名访问同一主机不同端口
962 0
nginx安装 、分发实现多域名访问同一主机不同端口
|
监控 数据可视化 应用服务中间件
Nginx系列:用GoAccess实现可视化并实时监控access日志
Nginx系列:用GoAccess实现可视化并实时监控access日志
372 0
Nginx系列:用GoAccess实现可视化并实时监控access日志
|
域名解析 JavaScript 前端开发
Linux安装NodeJs并配合Nginx实现反向代理
Linux安装NodeJs并配合Nginx实现反向代理
380 0
|
负载均衡 网络协议 应用服务中间件
nginx实现负载均衡
nginx实现负载均衡
342 0
nginx实现负载均衡
|
域名解析 网络协议 安全
nginx配置ssl证书实现https
nginx配置ssl证书实现https
487 0
nginx配置ssl证书实现https