nginx有一些全局变量,Nginx希望所有的进程都可以共享这些变量。共享变量方案有三种:
1.首选mmap的匿名映射
2.没有1,尝试mmap映射到/dev/zero上
3.最后尝试使用共享内存 shmget从内存中申请一个内存区域。
4.如果不支持原子操作,使用文件锁来实现多进程环境下的锁。
我认为这可能是从性能上考虑,所以率先使用mmap的匿名映射方法。
锁住accept_mutex的核心思想是,判断ngx_accept_mutex是否被锁住,如果没有被锁住,那么设置该锁的状态为上锁状态。这个需要汇编语言来实现。
-
ngx_uint_t
-
ngx_shmtx_trylock(ngx_shmtx_t *mtx)
-
{
-
return (*mtx->lock == 0 && ngx_atomic_cmp_set(mtx->lock, 0, ngx_pid));
-
}
ngx_atomic_cmp_set的具体实现如下所示:
-
static ngx_inline ngx_atomic_uint_t
-
ngx_atomic_cmp_set(ngx_atomic_t *lock, ngx_atomic_uint_t old,
-
ngx_atomic_uint_t set)
-
{
-
u_char res;
-
-
__asm__ volatile (
-
-
NGX_SMP_LOCK
-
" cmpxchgq %3, %1; "
-
" sete %0; "
-
-
: "=a" (res) : "m" (*lock), "a" (old), "r" (set) : "cc", "memory");
-
-
return res;
-
}
如上代码就是检查进程的状态,如果没有锁,那么设置变量为set,这个过程是一条汇编指令实现的(cmpxchgq) 原子操作,所以不会出现不一致的情况。
阅读(6834) | 评论(0) | 转发(0) |