原子 atomic_t
自旋锁 spinlock 时间小于两次系统空间切换,不需要调度,不允许睡眠时建议
中断/下半部
读写自旋锁
信号量 不可用推进等待队列,让其睡眠
sema_init
互斥信号量 init_mutext(sem)
读写信号量 可以将写锁转为读锁 互斥
互斥体
mutex 简版互斥信号量
完成变量 completiion
BLK 大内核锁 全局自旋锁
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
顺序和屏障
发表回复