1

本文介绍了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

梦想家
107 声望76 粉丝

引用和评论

0 条评论