voidprepare_to_wait(struct wait_queue_head *wq_head, struct wait_queue_entry *wq_entry, int state) //kernel/sched/wait.c { unsigned long flags; wq_entry->flags &= ~WQ_FLAG_EXCLUSIVE; spin_lock_irqsave(&wq_head->lock, flags); //将wait entry挂到wait head的链表上 if (list_empty(...
使得进程在等待队列上睡眠的另一种方法是:prepare_to_wait(),除了有add_wait_queue()函数的参数外,还要设置进程的状态。 另一个函数prepare_to_wait_exclusive()语义类似。 通常情况下,add_wait_queue()函数不会直接使用,而是调用wait_evnet()函数 /** * wait_event - sleep until a condition gets true *...
用了prepare_to_wait之后,当退出时,一定要用这个函数清空等待队列。 功能: 该函数首先调用prepare_to_wait,修改进程到睡眠状态, 条件不满足,schedule()就放弃CPU控制权,睡眠, 当wake up的时候,阻塞在wq(也可以说阻塞在wait_event处)等待队列头上的进程,再次得到运行,接着执行schedule()后面的代码,这里,显然是个...
调用prepare_to_wait()将进程的状态变为TASK_INTERRUPTIBLE或TASK_UNINTERRUPTIBLE 如果状态被设置的是TASK_INTERRUPTIBLE则信号唤醒(伪唤醒),以检查并处理信号 唤醒之后检查等待条件是否为真,是则跳出循环,否则再次调用schedule()并一直重复 跳出循环(条件满足)后,进程将自己设置为TASK_RUNNING并调用finish_wait()方法把自...
wake_up_interruptible:对应 wait_event_interruptible 版本的 wake up wake_up_interruptible_sync:保证 wake up 的动作原子性,wake_up 这个函数,很有可能函数还没执行完,就被唤起来进程给抢占了,这个函数能够保证 wak up 动作完整的执行完成。 其他的也是与对应阻塞接口对应的。
wait_queue_head_t name = __WAIT_QUEUE_INITIALIZER(name) 所以可以直接通过 : DECLARE_WAIT_QUEUE_HEAD(name) 来完成一个等待队列头的定义以及初始化操作; 2. 等待队列头的动态初始化操作: void __init_waitqueue_head(wait_queue_head_t *p, struct lock_class_key *key) ...
wait_event_interruptible_lock_irq_timeout(wq, condition, lock, timeout) 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 参数 wq 定义的等待队列头, condition 为条件表达式,当wake up后,condition为真时,唤醒阻塞的进程,为假时,继续睡眠。
//把进程放进等待队列,把进程状态置为TASK_UNINTERRUPTIBLEprepare_to_wait(waitq,wait,TASK_UNINTERRUPTIBLE);//切换进程schedule(); 2、进程还在运行,但内核不让它继续使用CPU了:比如进程的时间片用完了,或者优先级更高的进程来了,所以该进程必须把CPU的使用权交出来 ...
prepare_to_wait(&wq, &__wait, TASK_UNINTERRUPTIBLE); if (condition) break; ret = schedule_timeout(ret); if (!ret) break; } finish_wait(&wq, &__wait); } while (0) wq为等待队列头; condition为唤醒标志,condition为真唤醒进程,为假则为休眠状态; ...
prepare_to_wait(&q, &wait, TASK_INTERRUPTIBLE);if(signal_pending(current))/* 处理信号 */schedule(); } finish_wait(&q, &wait); 以上代码假设 q 是进程睡眠的队列。 内核先使用 init_waitqueue_head() 函数初始化 wait, 然后调用 add_wait_queue() 函数将进程放入等待队列,它的C语言源码如下: ...