设备的并发访问
互斥访问方式
- 屏蔽中断
- 原子操作
- 自旋锁(关抢占, 自旋时处于运行状态, 忙等待)
- 信号量 semaphore
互斥添加位置
在具体的file_operations中添加互斥操作,例如在read, write中添加互斥操作
- 持有自旋锁的时间尽可能短
- 持有锁时间严禁睡眠
自旋锁使用方式
- spinlock_t lock; 定义自旋锁
- spin_lock_init(&lock) 加载函数中, 初始化自旋锁
- spin_unlock(&lock) 解锁
自旋锁注意事项
- 自旋锁是忙等待
- 自旋锁可能导致死锁
自旋锁的改进锁
- 读写锁 读与读可并发 读与写互斥 写与写互斥
- 顺序锁 读与读可并发 读与写并发 写与写互斥
信号量使用
- include <linux/semaphore.h>
- struct semaphore sem; 定义信号量
- sema_init(&sem, 1); 加载函数中初始化信号量
- 获取信号量
- down(&sem); 若不能获取信号, 进入不可中断等待
- dowm_interruptible(&sem); 若不能获取信号, 进入可中断等待, 返回0表示获得信号量. 非零表示收到信号
- down_trylock(&sem); 因为不会睡眠, 可用于中断
- up(&sem); 释放信号量
函数使用方式
if(dowm_interruptible(&sem)){return -EINTR/-ERESTARTSYS; //ERESTARTSYS则重新读}
信号量与自旋锁对比
| 信号量 | 自旋锁 | |
| 未获得资源时的运行状态 | 睡眠(不运行) | 忙等待(运行状态) |
| 持有时间 | 可长时间获取信号量 | 持有时间短 |
| 是否可睡眠 | 可睡眠 | 严禁睡眠 |
| 是否可用于中断 | 一般不可用于中断 | 可以用于中断 |

被折叠的 条评论
为什么被折叠?



