打印

wait_event_interruptible() 和 wake_up()的使用

[复制链接]
197|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
卡拉瓦乔|  楼主 | 2018-10-3 12:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
__wait_event_interruptible()首先定义并初始化一个wait_queue_t变量__wait,其中数据为当前进程current,并把__wait入队。

   在无限循环中,__wait_event_interruptible()将本进程置为可中断的挂起状态,反复检查condition是否成立,如果成立则退出,如果不成立则继续休眠;条件满足后,即把本进程运行状态置为运行态,并将__wait从等待队列中清除掉,从而进程能够调度运行。如果进程当前有异步信号(POSIX的),则返回-ERESTARTSYS。



wait_event_interruptible()这个函数先将

当前进程的状态设置成TASK_INTERRUPTIBLE,然后调用schedule(),

而schedule()会将位于TASK_INTERRUPTIBLE状态的当前进程从runqueue

队列中删除。从runqueue队列中删除的结果是,当前这个进程将不再参

与调度,除非通过其他函数将这个进程重新放入这个runqueue队列中,

这就是wake_up()的作用了。

  

由于这一段代码位于一个由condition控制的for(;;)循环中,所以当由

shedule()返回时(当然是被wake_up之后,通过其他进程的schedule()而

再次调度本进程),如果条件condition不满足,本进程将自动再次被设

置为TASK_INTERRUPTIBLE状态,接下来执行schedule()的结果是再次被

从runqueue队列中删除。这时候就需要再次通过wake_up重新添加到

runqueue队列中。

  

如此反复,直到condition为真的时候被wake_up.

  



成功地唤醒一个被wait_event_interruptible()的进程,需要满足:

1)condition为真的前提下,2) 调用wake_up()。



所以,如果你仅仅修改condition,那么只是满足其中一个条件,这个时候,

被wait_event_interruptible()起来的进程尚未位于runqueue队列中,因

此不会被 schedule。这个时候只要wake_up一下就立刻会重新进入运行调度。

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

438

主题

438

帖子

0

粉丝