linux wait_queue
wait_queue
等待队列所做的事情:
- 将一个需要睡眠的进程(task_struct)与一个wait entry进行绑定(private成员);
- 指定唤醒函数;
- schedule调度出去;
唤醒时:
- 前面已经将进程与wait entry进行绑定,唤醒时也能通过wait entry准确找到进程;
总结:
最主要的是提供了一个绑定功能,将wait entry与进程绑定,可以通过wait entry准确找到进程;
什么休眠等待,唤醒都是封装进程那边的接口而已;
疑问
bootmark的作用是什么?
为什么需要wait queue
对于一个进程使用:set_current_state + schedule中,在pick_next_task并不会再次加入cfs的红黑树中了;
从软件层面来说,就是task_struct找不到了,所以需要有一个地方找到这个task_struct,
condition的作用?
wake_up的入参只有等待队列,并没有等待元素;也就是说唤醒是唤醒这个等待队列的所有entry;
但是我们不满足condition的entry不应该被唤醒,所以在wait_event中,通过会通过condition判断条件是否满足,决定是否再次睡眠;
唤醒
唤醒的主要动作在__wake_up_common中,该函数会遍历wq_head->head中的所有entry,并且执行对应的func;
以autoremove_wake_functio为例,->try_to_wake_up尝试唤醒;
是否执行try_to_wake_up后,当前进程就马上执行了呢?
不一定马上执行,只是加入红黑树中,只是有被调度的资格而已,(之前没有在红黑树中,资格都没有)
当然这个函数中也会进行一次能否抢占判断(check_preempt_curr);
具体是不是该进程马上被调度,取决于当前进程是否需要被换出,就算当前进程被换出,还要看wake_up的进程是否是vruntime最小;(cfs中)