linux内核之休眠
dasdas
·
系统正是有了休眠才有了高性能,否则就像单片机一样,做死循环等待,导致性能下降。就像现在的CPU类似高通的,我曾经干了一件蠢事,故意while(1),发现CPU很烫了。
linux中提供了众多的休眠机制,waitqueue是一种机制。当我们使用休眠是,需要注意以下几点:
1.对于有休眠的代码段中,不能有类似spinlock,seqlock,或者我们调用了disable_irq_save()禁止中断的操作
2.在拥有休眠的代码段中,要确保当信号量有使用的时候,要保证我们的进程有别的进程去唤醒。否则会导致想用的这个信号量锁住的设备无法使用,也导致想使用这个设备的进程也会休眠。
好,讲用法。
@1:包含头文件
Wait.h (include\linux)
@2:静态定义一个等待队列
DECLARE_WAIT_QUEUE_HEAD(name)
#define DECLARE_WAIT_QUEUE_HEAD(name) \
wait_queue_head_t name = __WAIT_QUEUE_HEAD_INITIALIZER(name)
或者使用动态的方法来初始化队列
wait_queue_head_t name
init_waitqueue_head(name)
@3:
休眠进程调用以下几个函数
wake_up_interruptible(wait)
wait_event(wq, condition)
wait_event_timeout(wq, condition, timeout)
wait_event_interruptible(wq, condition)
wait_event_interruptible_timeout(wq, condition, timeout)
但是建议使用以下几个
wait_event_interruptible(wq, condition)
wait_event_interruptible_timeout(wq, condition, timeout)
其中wq是定义的wait_queue_head_t类型变量,而condition是一个表达式,假如我们想要加入timeout的话,使用第二个,加入这个参数的的类型是以jiffies为时间单位的。
@4:如何唤醒这些个等待队列的,有以下几个函数
wake_up(x)
wake_up_interruptible(x)
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">其中x是定义的等待队列wq。</span>
用法是对应的,当使用
wait_event(wq, condition)
就使用以下函数唤醒
wake_up(wq)
当使用
wait_event_interruptible(wq, condition)
就使用以下函数唤醒
<pre name="code" class="cpp">wake_up_interruptible(wq)
下面具体讲解一个流程及用法
wait_queue_head_t wait;
init_waitqueue_head(&wait);
wait_event_interruptible(wait,audlpa_events_pending(audio))
wake_up_interruptible(wait)
其中condition是一个函数,通过返回值来确定condition是否满足条件。
更多推荐
已为社区贡献3条内容
所有评论(0)