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