同步

原子 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
顺序和屏障

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理