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

相关文章

Windows 系统下 Nginx 的配置步骤详解

《Windows系统下Nginx的配置步骤详解》Nginx是一款功能强大的软件,在互联网领域有广泛应用,简单来说,它就像一个聪明的交通指挥员,能让网站运行得更高效、更稳定,:本文主要介绍W... 目录一、为什么要用 Nginx二、Windows 系统下 Nginx 的配置步骤1. 下载 Nginx2. 解压

Apache 高级配置实战之从连接保持到日志分析的完整指南

《Apache高级配置实战之从连接保持到日志分析的完整指南》本文带你从连接保持优化开始,一路走到访问控制和日志管理,最后用AWStats来分析网站数据,对Apache配置日志分析相关知识感兴趣的朋友... 目录Apache 高级配置实战:从连接保持到日志分析的完整指南前言 一、Apache 连接保持 - 性

Linux中的more 和 less区别对比分析

《Linux中的more和less区别对比分析》在Linux/Unix系统中,more和less都是用于分页查看文本文件的命令,但less是more的增强版,功能更强大,:本文主要介绍Linu... 目录1. 基础功能对比2. 常用操作对比less 的操作3. 实际使用示例4. 为什么推荐 less?5.

spring-gateway filters添加自定义过滤器实现流程分析(可插拔)

《spring-gatewayfilters添加自定义过滤器实现流程分析(可插拔)》:本文主要介绍spring-gatewayfilters添加自定义过滤器实现流程分析(可插拔),本文通过实例图... 目录需求背景需求拆解设计流程及作用域逻辑处理代码逻辑需求背景公司要求,通过公司网络代理访问的请求需要做请

Java集成Onlyoffice的示例代码及场景分析

《Java集成Onlyoffice的示例代码及场景分析》:本文主要介绍Java集成Onlyoffice的示例代码及场景分析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 需求场景:实现文档的在线编辑,团队协作总结:两个接口 + 前端页面 + 配置项接口1:一个接口,将o

IDEA下"File is read-only"可能原因分析及"找不到或无法加载主类"的问题

《IDEA下Fileisread-only可能原因分析及找不到或无法加载主类的问题》:本文主要介绍IDEA下Fileisread-only可能原因分析及找不到或无法加载主类的问题,具有很好的参... 目录1.File is read-only”可能原因2.“找不到或无法加载主类”问题的解决总结1.File

Nginx 413修改上传文件大小限制的方法详解

《Nginx413修改上传文件大小限制的方法详解》在使用Nginx作为Web服务器时,有时会遇到客户端尝试上传大文件时返回​​413RequestEntityTooLarge​​... 目录1. 理解 ​​413 Request Entity Too Large​​ 错误2. 修改 Nginx 配置2.1

Web技术与Nginx网站环境部署教程

《Web技术与Nginx网站环境部署教程》:本文主要介绍Web技术与Nginx网站环境部署教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、Web基础1.域名系统DNS2.Hosts文件3.DNS4.域名注册二.网页与html1.网页概述2.HTML概述3.

Dubbo之SPI机制的实现原理和优势分析

《Dubbo之SPI机制的实现原理和优势分析》:本文主要介绍Dubbo之SPI机制的实现原理和优势,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Dubbo中SPI机制的实现原理和优势JDK 中的 SPI 机制解析Dubbo 中的 SPI 机制解析总结Dubbo中

C#继承之里氏替换原则分析

《C#继承之里氏替换原则分析》:本文主要介绍C#继承之里氏替换原则,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#里氏替换原则一.概念二.语法表现三.类型检查与转换总结C#里氏替换原则一.概念里氏替换原则是面向对象设计的基本原则之一:核心思想:所有引py