设备驱动(六)

设备的并发访问
互斥访问方式
  • 屏蔽中断
  • 原子操作
  • 自旋锁(关抢占, 自旋时处于运行状态, 忙等待)
  • 信号量 semaphore
互斥添加位置
     在具体的file_operations中添加互斥操作,例如在read, write中添加互斥操作

自旋锁使用条件
  • 持有自旋锁的时间尽可能短
  • 持有锁时间严禁睡眠
自旋锁使用方式
  1. spinlock_t lock;     定义自旋锁 
  2. spin_lock_init(&lock)    加载函数中, 初始化自旋锁
  3. spin_unlock(&lock)      解锁
自旋锁注意事项
  1. 自旋锁是忙等待
  2. 自旋锁可能导致死锁
自旋锁的改进锁
  • 读写锁  读与读可并发  读与写互斥  写与写互斥
  • 顺序锁  读与读可并发  读与写并发  写与写互斥
信号量使用
  1. include <linux/semaphore.h>     
  2. struct semaphore sem;     定义信号量
  3. sema_init(&sem, 1);         加载函数中初始化信号量
  4. 获取信号量
    1. down(&sem);   若不能获取信号, 进入不可中断等待
    2. dowm_interruptible(&sem);   若不能获取信号, 进入可中断等待, 返回0表示获得信号量. 非零表示收到信号
    3. down_trylock(&sem);  因为不会睡眠, 可用于中断
  5. up(&sem);         释放信号量
函数使用方式
if(dowm_interruptible(&sem)){
     return -EINTR/-ERESTARTSYS; //ERESTARTSYS则重新读
}
信号量与自旋锁对比          
  信号量 自旋锁
未获得资源时的运行状态 睡眠(不运行) 忙等待(运行状态)
持有时间 可长时间获取信号量 持有时间短
是否可睡眠 可睡眠 严禁睡眠
是否可用于中断 一般不可用于中断 可以用于中断

你可能感兴趣的:(linux,设备驱动)