任务交换开/关CPU运行队列的位置
我试图找到Linux的调度程序,并在那里找到将下一个进程添加到运行队列的功能(交换CPU的控制权)。
从环顾四周我“认为”这将是sched.c
,我“认为” prepare_task_switch
是基于它的描述的这个函数,但我不是100%确定的。
概述的定义是有道理的,但是我似乎无法找到关于其内部方法的任何附加信息: fire_sched_out_preempt_notifiers(prev,next) , prepare_lock_switch(rq,next) , prepare_arch_switch(next) ,所以我的疑问来源于是否这些功能是导致任务交换发生的原因(更改CPU所有权)。
如果我在正确的代码位置,有人可以提供一些清晰的这三个功能吗? 否则,有人可以提供一些见解,我应该在哪里寻找调度程序在何处为运行队列切换CPU的任务控制?
位置:/source/linux/kernel/sched.c
/**
* prepare_task_switch - prepare to switch tasks
* @rq: the runqueue preparing to switch
* @prev: the current task that is being switched out
* @next: the task we are going to switch to.
*
* This is called with the rq lock held and interrupts off. It must
* be paired with a subsequent finish_task_switch after the context
* switch.
*
* prepare_task_switch sets up locking and calls architecture specific
* hooks.
*/
2770 static inline void
2771 prepare_task_switch(struct rq *rq, struct task_struct *prev,
2772 struct task_struct *next)
2773 {
2774 fire_sched_out_preempt_notifiers(prev, next);
2775 prepare_lock_switch(rq, next);
2776 prepare_arch_switch(next);
2777 }
在C中,函数被标记为“静态”的事实告诉你,它只能从同一个文件中调用。 所以如果你在kernel / sched.c中搜索prepare_task_switch,你会发现它是从context_switch调用的。 (prepare_task_switch本身并没有做有趣的事情:它只是“准备”。)
如果依次搜索context_switch(也标记为“static”),则会发现它是从调度程序的实际核心__schedule调用的。 实际上,在调用context_switch时,__schedule已经计算出下一个要运行的任务,因为它将作为参数传递给context_switch。
请注意,要运行的任务实际上是在context_switch中(在技术上位于switch_to()中,由此调用)中控制CPU。 确切的工作方式有点棘手,因为在switch_to返回时,你不再执行同一个任务。 现在CPU正在运行一项不同的任务。 堆栈指针和整个调用堆栈与输入context_switch时不同,因此“当前”调用堆栈中的每个局部变量都可能与之前不同。
至于选择下一个要运行的任务,pick_next_task会这样做。 __schedule()的关键位是:
put_prev_task(rq,prev); / *将旧任务放在队列末尾/ next = pick_next_task(rq); /获取下一个要运行的任务/ ... if(prev!= next){/如果它是相同的任务/ ... context_switch(rq,prev,next),则不执行任何操作。 /切换到新任务* / [正在新任务中运行]}
其余的是锁定细节和簿记(尽管非常重要)。
链接地址: http://www.djcxy.com/p/43625.html