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中)

posted @ 2023-10-10 14:39  _xingxing  阅读(14)  评论(0)    收藏  举报