wait_event_interruptible() 和 wake_up()的使用

[复制链接]
481|0
 楼主| 你说说说说 发表于 2018-10-5 11:32 | 显示全部楼层 |阅读模式
__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一下就立刻会重新进入运行调度。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

355

主题

355

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部