nginx多进程锁的实现

本文详细介绍了Nginx如何实现多进程之间的互斥锁,主要依赖于原子操作,如GCC的原子操作指令和自旋锁。通过ngx_atomic_cmp_set等函数实现原子的比较和交换,确保内存访问的排他性。在锁的实现中,Nginx使用共享内存和ngx_shmtx_t结构体管理锁的状态,结合ngx_shmtx_trylock和ngx_shmtx_lock实现非阻塞和阻塞的锁获取方式。
摘要由CSDN通过智能技术生成

CPU cache:

http://cenalulu.github.io/linux/all-about-cpu-cache/

other:

http://www.cnblogs.com/zhengsyao/p/mcs_lock_scalable_spinlock.html

http://simohayha.iteye.com/blog/658012

http://www.searchtb.com/2011/06/spinlock%E5%89%96%E6%9E%90%E4%B8%8E%E6%94%B9%E8%BF%9B.html

 

Nginx workers 要获取新的请求,需要互斥的得到监听端口的socket句柄。nginx通过自己实现的锁来实现进程间互斥.

1, 原子操作

原子操作就是可以在执行这几个操作的时候不会被其他指令打断,可以实现排他的内存访问,实际是在内存总线层次的临界区操作。

Nginx 使用gcc的原子操作:

ngx_atomic.h:

#elif (NGX_HAVE_GCC_ATOMIC)

/* GCC 4.1 builtin atomic operations */

 

#define NGX_HAVE_ATOMIC_OPS 1  //表示支持原子操作

typedef long                        ngx_atomic_int_t;

typedef unsigned long               ngx_atomic_uint_t;

 

#if (NGX_PTR_SIZE == 8)

#define NGX_ATOMIC_T_LEN           (sizeof("-9223372036854775808") - 1)

#else

#define NGX_ATOMIC_T_LEN            (sizeof("-2147483648") -1)

#endif

 

typedef volatile ngx_atomic_uint_t  ngx_atomic_t; //volatile类型,表示该变量随时会被修改,每次都需要从其存储地址读取

 

#define ngx_atomic_cmp_set(lock, old, set)                                    \ // 原子的比较和交换,如果*lock==old,就将set写入*lock

   __sync_bool_compare_and_swap(lock, old, set)                            // 相等并写入的情况下返回true/操作之前的值

 

#define ngx_atomic_fetch_add(value, add)                                      \   // *value+=add并返回更新前的值

    __sync_fetch_and_add(value,add)

 

#define ngx_memory_barrier()        __sync_synchronize()                     // 发出一个full barrier

 

memory barrier有几种类型:

    acquire barrier : 不允许将barrier之后的内存读取指令移到barrier之前(linuxkernel中的wmb())。

    release barrier : 不允许将barrier之前的内存读取指令移到barrier之后(linux kernel中的rmb())。

    full barrier    : 以上两种barrier的合集(linux kernel中的mb())。

 

Nginx自己实现原子操作:

read-modify-write(RMW)原子操作

例如Intel平台支持在指令前面加上lock前缀锁定总线,实现原子的比较-交换操作(CAS,通过cmpxchg指令,原子地执行判断条件并交换值的操作),原子递增和原子递减(inc和dec指令)操作。还支持一个交换操作,xchg指令,不需要l

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值