linux驱动的并发控制和阻塞和非阻塞

来源:互联网 发布:仿真化学实验室软件 编辑:程序博客网 时间:2024/06/05 05:22
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。
原创粉丝点击