同步

87次阅读

共计 570 个字符,预计需要花费 2 分钟才能阅读完成。

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

正文完
 0