Linux设备驱动中的并发控制手段:中断屏蔽,原子操作,自旋锁,信号量。中断屏蔽:local_irq_save和local_irq_restore:前者表示禁止中断的操作(还保存当前CPU的中断信息)后者是使能中断原子操作包括:atomic_set自旋锁操作:初始化自旋锁spin_lock_init(),获取自旋锁spin_lock,释放自旋锁spin_unlock为防止中断的干扰,自旋锁结合中断操作,形成了spin_lock_irqsave,spin_unlock_restore。自旋锁主要用于临界区资源较小,使用资源较少的场合信号量(semaphore)操作:信号量初始化seam_init(),也可以用init_MUTEX来定义一个互斥的信号量。down()获取信号量,会导致睡眠(不能再中断中使用),释放信号量up()。
信号量会导致进程的睡眠,所以比起自旋锁的原地等待(CPU一直空转),他的应用场合需要临界资源占用时间较长。
Linux下设备驱动阻塞和非阻塞等待队列的使用(采用阻塞和非阻塞)int_waitqueue_head()初始化等待队列头,定义一个等待队列DECLARE_WAITQUEUE()add_wait_queue()添加一个等待队列到等待队列头中。等待时间wait_event(),wait_event_interruptible。唤醒队列wake_up和wake_up_interruptible。