void finish_wait(struct wait_queue_head *wq_head, struct wait_queue_entry *wq_entry) { unsigned long flags; //设置当前进程状态为 running 状态 __set_current_state(TASK_RUNNING); /* *若wait条目还在等待队列头上挂着,就将其摘取下来。由前面的唤醒回调函数可知, * 对于实际唤醒的entry已经摘下来...
当进程被唤醒后,一般会直接调用finish_wait函数,将进程的状态重新设置为running,并将该进程对应的等待队列项从等待队列中删除: voidfinish_wait(structwait_queue_head *wq_head,structwait_queue_entry *wq_entry) { unsignedlongflags; __set_current_state(TASK_RUNNING);/*¦* We can check for list empti...
跳出循环后,调用 "finish_wait()",将状态重置为“运行态”,并从 wait queue 移除,等待的过程彻底结束。 voidfinish_wait(structwait_queue_head*wq_head,structwait_queue_entry*wq_entry){__set_current_state(TASK_RUNNING);list_del_init(&wq_entry->entry);... 本文开头提到“众多的上层实现依赖于此”,...
当wakeup 的时候,阻塞在 wq(也可以说阻塞在 wait_event 处)等待队列头上的进程,再次得到运行,接着执行 schedule()后面的代码,这里,显然是个循环,prepare_to_wait 再次设置当前进程为睡眠状态,然后判断条件是否满足, 满足就退出循环,finish_wait 将当前进程恢复到 TASK_RUNNING 状态,也就意味着阻塞解除。不满足,继...
#include <linux/wait.h> 定义和初始化等待队列头(workqueue): 静态的,用宏: #define DECLARE_WAIT_QUEUE_HEAD(name) \ wait_queue_head_t name = __WAIT_QUEUE_HEAD_INITIALIZER(name) 动态的,也是用宏: #define init_waitqueue_head(q) \
wait_event_interruptible将当前的进程状态设置成TASK_INTERRUPTIBLE。 wait_event将当前进程的状态设置成TASK_UNINTERRUPTIBLE。 这两者都会从运行队列中删除,不能再参与调度,从而进入睡眠状态。 两者当区别就在于TASK_INTERRUPTIBLE和TASK_UNINTERRUPTIBLE。 可中断的等待状态(TASK_INTERRUPTIBLE)和不可中断的等待状态(TASK_UNIN...
#include <linux/wait.h> 1. 定义和初始化等待队列头(workqueue): 静态的,用宏: #define DECLARE_WAIT_QUEUE_HEAD(name) \ wait_queue_head_t name = __WAIT_QUEUE_HEAD_INITIALIZER(name) 1. 2. 动态的,也是用宏: #define init_waitqueue_head(q) \ ...
1// ${linux_source}/include/linux/wait.h 2#defineDEFINE_WAIT(name) 3wait_queue_t name = { 4.private = current, 5.func = autoremove_wake_function, 6.task_list = LIST_HEAD_INIT((name).task_list), 7} prepare_to_wait 和 finish_wait 源码如下: ...
finish_wait(&wq, &__wait);//如果__wait还位于队列wq,则将__wait从wq中移除} 3.1.1 prepare_to_wait_event 再来看看进入睡眠状态之前的准备工作,用于防止wait没有队列中,而事件已产生,则会无线等待。 longprepare_to_wait_event(wait_queue_head_t *q, wait_queue_t *wait,intstate){unsignedlongflags...
wait_queue_t wait; 4.初始化等待队列,将当前进程添加到这个容器中 init_waitqueue_entry(&wait, current); 说明:current是内核的一个全局变量,用来记录当前进程,内核对于每一个进程,在内核空间都有一个对应的结构体struct task_struct,而current指针就指向当前运行的那个进程的task_struct结构体,你可以通过current...