本文介绍了liunx提供的同步机制。开发中线程和进程的同步机制
linux同步机制
1.原子 atomic_t
2.自旋锁 spinlock 时间小于两次系统空间切换,不需要调度,不允许睡眠时建议
中断/下半部
读写自旋锁
3.信号量 不可用推进等待队列,让其睡眠
sema_init
互斥信号量 init_mutext(sem)
读写信号量 可以将写锁转为读锁 互斥
4.互斥体
mutex 简版互斥信号量
5.完成变量 completiion
6.BLK 大内核锁 全局自旋锁
7.seq锁 类似CAS,seqlock
应用层API接口
1.systemV信号量 可以加减n,都是标识符,不能用fd系列方法
semget 信号量集 semop semundo 当条件允许,先满足先执行,否则不一定哪个先执行
2.posix信号量 只能加减1
未命名信号量
命名信号量 sem_open 不相关进程能访问 linux保存在共享内存(tmpfs文件)
优点:
创建和初始化是原子的,避免了sysV复杂工作
引用计数,简化删除sysV工作
未命名与动态分配的内存对象关联简单,嵌入到大对象中即可
只有发生争抢才系统调用,在争抢不频繁下比sysV性能好
对比pthread的互斥体,只有锁住的能对其解锁 但信号量随意
3.文件锁 flock fcntl(文件某个区域加锁) 与进程和inode相关,子进程不会继承,exec保留。读写,强制/劝告
4.pthread两种线程同步的
自旋锁被持有时,内核不能抢占。单纯禁止抢占设置preempt_disable
顺序和屏障
线程
pthread_mutex
phreadd_cond
进程
进程锁:mmap+pthread_mutex_t 或者文件锁
https://blog.csdn.net/qq_3539...
nginx进程锁:原子《=信号量《=文件锁
用原子实现锁mmap+汇编原子操作:
ngx_shmtx_trylock(ngx_shmtx_t *mtx)
{
return (*mtx->lock == 0 && ngx_atomic_cmp_set(mtx->lock, 0, ngx_pid));
}
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;
}
mmap过程可以参考ngx_event_module_init
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。