Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1859149
  • 博文数量: 211
  • 博客积分: 464
  • 博客等级: 下士
  • 技术积分: 3794
  • 用 户 组: 普通用户
  • 注册时间: 2011-01-24 18:25
个人简介

阿弥陀佛

文章分类

全部博文(211)

文章存档

2020年(2)

2019年(3)

2018年(5)

2017年(6)

2016年(10)

2015年(9)

2014年(73)

2013年(90)

2012年(13)

分类: 服务器与存储

2014-02-21 15:42:30

nginx有一些全局变量,Nginx希望所有的进程都可以共享这些变量。共享变量方案有三种:
1.首选mmap的匿名映射
2.没有1,尝试mmap映射到/dev/zero上
3.最后尝试使用共享内存 shmget从内存中申请一个内存区域。
4.如果不支持原子操作,使用文件锁来实现多进程环境下的锁。
我认为这可能是从性能上考虑,所以率先使用mmap的匿名映射方法。

锁住accept_mutex的核心思想是,判断ngx_accept_mutex是否被锁住,如果没有被锁住,那么设置该锁的状态为上锁状态。这个需要汇编语言来实现。


点击(此处)折叠或打开

  1. ngx_uint_t
  2. ngx_shmtx_trylock(ngx_shmtx_t *mtx)
  3. {
  4.     return (*mtx->lock == 0 && ngx_atomic_cmp_set(mtx->lock, 0, ngx_pid));
  5. }
ngx_atomic_cmp_set的具体实现如下所示:

点击(此处)折叠或打开

  1. static ngx_inline ngx_atomic_uint_t
  2. ngx_atomic_cmp_set(ngx_atomic_t *lock, ngx_atomic_uint_t old,
  3.     ngx_atomic_uint_t set)
  4. {
  5.     u_char res;

  6.     __asm__ volatile (

  7.          NGX_SMP_LOCK
  8.     " cmpxchgq %3, %1; "
  9.     " sete %0; "

  10.     : "=a" (res) : "m" (*lock), "a" (old), "r" (set) : "cc", "memory");

  11.     return res;
  12. }
如上代码就是检查进程的状态,如果没有锁,那么设置变量为set,这个过程是一条汇编指令实现的(cmpxchgq) 原子操作,所以不会出现不一致的情况。


阅读(6752) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~