nginx内部锁的实现

多进程或者多线程的程序,涉及到对共享资源的修改,都需要使用到锁。最常见的情况(也一般是然并卵的情况)是对一个全局变量进行++操作,比如有个全局变量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()这个函数。

未完待续。。

时间: 2024-08-14 21:16:15

nginx内部锁的实现的相关文章

ReentrantLock和内部锁的性能对比(update)

  ReentrantLock是jdk5引入的新的锁机制,它与内部锁(synchronize) 相同的并发性和内存语义,比如可重入加锁语义.在中等或者更高负荷下,ReentrantLock有更好的性能,并且拥有可轮询和可定时的请求锁等高级功能.这个程序简单对比了ReentrantLock公平锁.ReentrantLock非公平锁以及内部锁的性能,从结果上看,非公平的ReentrantLock表现最好.内部锁也仅仅是实现统计意义上的公平,结果也比公平的ReentrantLock好上很多.这个程序仅

Java虚拟机对内部锁的四种优化方式

自Java 6/Java 7开始,Java虚拟机对内部锁的实现进行了一些优化.这些优化主要包括锁消除(Lock Elision).锁粗化(Lock Coarsening).偏向锁(Biased Locking)以及适应性锁(Adaptive Locking).这些优化仅在Java虚拟机server模式下起作用(即运行Java程序时我们可能需要在命令行中指定Java虚拟机参数"-server"以开启这些优化). 1 锁消除 锁消除(Lock Elision)是JIT编译器对内部锁的具体实

Nginx应用笔记(一)基础和安装

Nginx的工作原理 nginx在启动后,会有一个master进程和多个worker进程.master进程主要用来管理worker进程,包含:接收来自外界的信号,向各worker进程发送信号,监控worker进程的运行状态,当worker进程退出后(异常情况下),会自动重新启动新的worker进程.而基本的网络事件,则是放在worker进程中来处理了.多个worker进程之间是对等的,他们同等竞争来自客户端的请求,各进程互相之间是独立的.一个请求,只可能在一个worker进程中处理,一个work

nginx缓存功能cache的教程

1.传统缓存之一(404) 这个办法是把nginx的404错误定向到后端,然后用proxy_store把后端返回的页面保存. 1.传统缓存之一(404) 这个办法是把nginx的404错误定向到后端,然后用proxy_store把后端返回的页面保存. 配置: location / { root /home/html/;#主目录 expires 1d;#网页的过期时间 error_page 404 =200 /fetch$request_uri;#404定向到/fetch目录下 } locatio

nginx sendfile:使用Nginx的X-Sendfile机制提升PHP文件下载性能

很多时候用户需要从网站下载文件,如果文件是可以通过一个固定链接公开获取的,那么我们只需将文件存放到 webroot 下的目录里就好.但大多数情况下,我们需要做权限控制,例如下载 PDF 账单,又例如下载网盘里的档案.这时,我们通常借助于脚本代码来实现,而这无疑会增加服务器的负担.例如下面的代码:<?php    // 用户身份认证,若验证失败跳转    authenticate();    // 获取需要下载的文件,若文件不存在跳转    $file = determine_file();   

介绍了Oracle数据库锁的种类及研究

本文通过对Oracle数据库锁机制的研究,首先介绍了Oracle数据库锁的种类,并描述了实际应用中遇到的与锁相关的异常情况,特别对经常遇到的由于等待锁而使事务被挂起的问题进行了定位及解决,并对死锁这一比较严重的现象,提出了相应的解决方法和具体的分析过程. 数据库是一个多用户使用的共享资源.当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况.若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性. 加锁是实现数据库并发控制的一个非常重要的技术.当事务在对某

Oracle的锁等待分析处理

1. 锁的作用及影响 锁是Oracle管理共享数据库资源并发访问并防止并发数据库事务之间"相互干涉"的核心机制之一. 当应用系统复杂.业务量大时,经常会出现应用进程之前的锁等待现象,影响系统正常运行.当数据库出现锁等待的情况下快速定位阻塞进程,分析阻塞原因. 2. 定位锁类型 数据库的锁有多种类型,每种不同的类型对业务的影响是不一样的,大致可分为以下三类: DML锁 DDL锁 内部锁与LATCH锁 下面给出每种不同类型的锁的定位分析过程,各种锁处理流程如下: 2.1.DML锁 引用DS

oracle 数据库锁类型 TM锁和TX锁

问题描述 oracle 数据库锁类型 TM锁和TX锁 oracle 9i 10g 编程艺术书中对oracle 的锁类型有三种分类:DML锁,DDL 锁 以及 内部锁和闩 针对DML 锁并没有详细的介绍,只说明有TM(表)锁 和TX(行)锁 网上搜索了很多资料,在资料中有具体的分类 问题是:表头说这些锁都是TM锁... 但是我怎么感觉2,3 都属于TX锁呢?2,3 到底是TM 锁还是 TX 锁呢? 解决方案 TX锁和TM锁不是互斥的,DML 锁 先由TM锁获取表级锁,然后TX 在对具体行修改. 这

基于Nginx搭建一个安全的、快速的微服务架构

本文讲的是基于Nginx搭建一个安全的.快速的微服务架构[编者的话]本文改编自Chris Stetson发表在nginx.conf 2016上的一个有关如今的微服务以及如何使用Nginx构建一个快速的.安全的网络系统的演讲,大家可以在YourTube上回看此次演讲. 0:00 - 自我介绍 Chris Stetson:Hi,我的名字是Chris Stetson,我在Nginx带领专业服务部门,同时也领导微服务实践. 今天我们要谈论微服务以及如何使用Nginx构建一个快速的.安全的网络系统.在我们