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()将进程的状态变为TASK_INTERRUPTIBLE或TASK_UNINTERRUPTIBLE 如果状态被设置的是TASK_INTERRUPTIBLE则信号唤醒(伪唤醒),以检查并处理信号 唤醒之后检查等待条件是否为真,是则跳出循环,否则再次调用schedule()并一直重复 跳出循环(条件满足)后,进程将自己设置为TASK_RUNNING并调用finish_wait()方法把自...
DEFINE_WAIT(__wait); \ \ for (;;) { \ prepare_to_wait(&wq, &__wait, TASK_UNINTERRUPTIBLE); \ if (condition) \ break; \ schedule(); \ } \ finish_wait(&wq, &__wait); \ } while (0) #define wait_event(wq, condition) \ do { \ if (condition) \ break; \ __wait_event...
wake_up_interruptible:对应 wait_event_interruptible 版本的 wake up wake_up_interruptible_sync:保证 wake up 的动作原子性,wake_up 这个函数,很有可能函数还没执行完,就被唤起来进程给抢占了,这个函数能够保证 wak up 动作完整的执行完成。 其他的也是与对应阻塞接口对应的。
介绍这几个函数,不得不先介绍等待队列wait_queue_head_t 等待队列用于使得进程等待某一特定事件的发生,无需频繁的轮询,进程在等待周期中睡眠,当时间发生后由内核自动唤醒。 等待队列 (一)数据结构 等待队列结构如下,因为每个等待队列都可以再中断时被修改,因此,在操作等待队列之前必须获得一个自旋锁。
typedef int (*wait_queue_func_t)(wait_queue_t *wait,unsigned mode, int flags, void *key) 等待的队列的结构图: 对等待队列的各种操作: 1.等待队列头的静态初始化: #define __WAIT_QUEUE_INITIALIZER(name) { \ .lock = __SPIN_LOCK_UNLOCK(name.lock),// lock = 1; \ ...
//把进程放进等待队列,把进程状态置为TASK_UNINTERRUPTIBLEprepare_to_wait(waitq,wait,TASK_UNINTERRUPTIBLE);//切换进程schedule(); 2、进程还在运行,但内核不让它继续使用CPU了:比如进程的时间片用完了,或者优先级更高的进程来了,所以该进程必须把CPU的使用权交出来 ...
调用prepare_to_wait()将进程的状态变为TASK_INTERRUPTIBLE或TASK_UNINTERRUPTIBLE 如果状态被设置的是TASK_INTERRUPTIBLE则信号唤醒(伪唤醒),以检查并处理信号 唤醒之后检查等待条件是否为真,是则跳出循环,否则再次调用schedule()并一直重复 跳出循环(条件满足)后,进程将自己设置为TASK_RUNNING并调用finish_wait()方法把自...
调用prepare_to_wait()方法把自己的状态变更为上面说到的两种休眠状态中的其中一种。 下面是上述提到的方法的源码: void add_wait_queue(struct wait_queue_head *wq_head, struct wait_queue_entry *wq_entry) { unsigned long flags; wq_entry->flags &= ~WQ_FLAG_EXCLUSIVE; ...