nginx自旋锁ngx_spinlock分析

2024-01-10 14:18
文章标签 分析 nginx 自旋 spinlock ngx

本文主要是介绍nginx自旋锁ngx_spinlock分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

以前也看过linux内核自旋锁的实现代码,现在工作主要是应用程序开发,对应用程序开发不是太了解,我喜欢通过看优秀的开源软件学习软件开发,之前对linux kernel感兴趣就是看内核代码,现在工作需要http,数据库,网络编程这方面的只是,我想学习http和网络编程看完nginx我想也差不多了。


void ngx_spinlock函数代码:

void
ngx_spinlock(ngx_atomic_t *lock, ngx_atomic_int_t value, ngx_uint_t spin)
{#if (NGX_HAVE_ATOMIC_OPS)ngx_uint_t  i, n;for ( ;; ) {// 没有上锁则上锁,上锁成功则返回  if (*lock == 0 && ngx_atomic_cmp_set(lock, 0, value)) {return;}if (ngx_ncpu > 1) {  //SMPfor (n = 1; n < spin; n <<= 1) {for (i = 0; i < n; i++) {ngx_cpu_pause();}if (*lock == 0 && ngx_atomic_cmp_set(lock, 0, value)) {return;}}}ngx_sched_yield();  // 看具体实现,任务调度或者usleep。}#else}





最值得研究的在我看来是应该是ngx_atomic_cmp_set函数的实现。下面是这个函数(其实是个宏定义)
的一个实现。
这和linux内核的自旋锁本质是一样的,核心是在锁总线的情况下,原子完成比较和交换操作,也就是mem和newval
的比较和交换操作。如果上锁成功返回值大于O。
    #define LOCK_PREFIX    "lock;"  
    #define __sync_bool_compare_and_swap(mem, oldval, newval) \  
      ({ __typeof (*mem) ret;                             \  
             __asm __volatile (LOCK_PREFIX "cmpxchgl %2, %1;sete %%al; movzbl %%al,%%eax"                \  
                                : "=a" (ret), "=m" (*mem)                  \  
                                : "r" (newval), "m" (*mem), "a" (oldval)\  
                                :"memory");         \  
                                  ret; })  

我用cscope查找 ngx_sched_yield()函数定义,下面是查找结果。我们可以发现这个函数nginx
根据不同情况有三种实现,*nix提供usleep和sched_yield,win32是SwitchToThread()。
win32我不了解,不过看名字就知道什么意思,切换进程。我们说一下*nix的实现。
*** src/os/unix/ngx_process.h:
ngx_sched_yield[71]            #define ngx_sched_yield() sched_yield()
ngx_sched_yield[73]            #define ngx_sched_yield() usleep(1)

*** src/os/win32/ngx_process.h:
ngx_sched_yield[56]            #define ngx_sched_yield() SwitchToThread()
打开ngx_process.h头文件
有下面几行代码。这意思就很清晰了,不多说。
#if (NGX_HAVE_SCHED_YIELD)
#define ngx_sched_yield()  sched_yield()
#else
#define ngx_sched_yield()  usleep(1)
#endif

*nix OS应用层提供的任务调度函数。
#include <sched.h>
sched_yield()

这篇关于nginx自旋锁ngx_spinlock分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/591092

相关文章

Nginx设置连接超时并进行测试的方法步骤

《Nginx设置连接超时并进行测试的方法步骤》在高并发场景下,如果客户端与服务器的连接长时间未响应,会占用大量的系统资源,影响其他正常请求的处理效率,为了解决这个问题,可以通过设置Nginx的连接... 目录设置连接超时目的操作步骤测试连接超时测试方法:总结:设置连接超时目的设置客户端与服务器之间的连接

Springboot中分析SQL性能的两种方式详解

《Springboot中分析SQL性能的两种方式详解》文章介绍了SQL性能分析的两种方式:MyBatis-Plus性能分析插件和p6spy框架,MyBatis-Plus插件配置简单,适用于开发和测试环... 目录SQL性能分析的两种方式:功能介绍实现方式:实现步骤:SQL性能分析的两种方式:功能介绍记录

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

nginx部署https网站的实现步骤(亲测)

《nginx部署https网站的实现步骤(亲测)》本文详细介绍了使用Nginx在保持与http服务兼容的情况下部署HTTPS,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值... 目录步骤 1:安装 Nginx步骤 2:获取 SSL 证书步骤 3:手动配置 Nginx步骤 4:测

Windows设置nginx启动端口的方法

《Windows设置nginx启动端口的方法》在服务器配置与开发过程中,nginx作为一款高效的HTTP和反向代理服务器,被广泛应用,而在Windows系统中,合理设置nginx的启动端口,是确保其正... 目录一、为什么要设置 nginx 启动端口二、设置步骤三、常见问题及解决一、为什么要设置 nginx

nginx-rtmp-module模块实现视频点播的示例代码

《nginx-rtmp-module模块实现视频点播的示例代码》本文主要介绍了nginx-rtmp-module模块实现视频点播,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习... 目录预置条件Nginx点播基本配置点播远程文件指定多个播放位置参考预置条件配置点播服务器 192.

C#使用DeepSeek API实现自然语言处理,文本分类和情感分析

《C#使用DeepSeekAPI实现自然语言处理,文本分类和情感分析》在C#中使用DeepSeekAPI可以实现多种功能,例如自然语言处理、文本分类、情感分析等,本文主要为大家介绍了具体实现步骤,... 目录准备工作文本生成文本分类问答系统代码生成翻译功能文本摘要文本校对图像描述生成总结在C#中使用Deep

nginx-rtmp-module构建流媒体直播服务器实战指南

《nginx-rtmp-module构建流媒体直播服务器实战指南》本文主要介绍了nginx-rtmp-module构建流媒体直播服务器实战指南,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有... 目录1. RTMP协议介绍与应用RTMP协议的原理RTMP协议的应用RTMP与现代流媒体技术的关系2

解决systemctl reload nginx重启Nginx服务报错:Job for nginx.service invalid问题

《解决systemctlreloadnginx重启Nginx服务报错:Jobfornginx.serviceinvalid问题》文章描述了通过`systemctlstatusnginx.se... 目录systemctl reload nginx重启Nginx服务报错:Job for nginx.javas

Redis主从/哨兵机制原理分析

《Redis主从/哨兵机制原理分析》本文介绍了Redis的主从复制和哨兵机制,主从复制实现了数据的热备份和负载均衡,而哨兵机制可以监控Redis集群,实现自动故障转移,哨兵机制通过监控、下线、选举和故... 目录一、主从复制1.1 什么是主从复制1.2 主从复制的作用1.3 主从复制原理1.3.1 全量复制