【发布时间】:2011-09-25 10:28:43
【问题描述】:
我试图了解 linux 内核中的调度过程实际上是如何工作的。我的问题与调度算法无关。它是关于函数schedule() 和switch_to() 的工作原理。
我会尽力解释。我看到了:
当进程用完时间片时,need_resched 标志由scheduler_tick() 设置。内核检查该标志,发现它已设置,并调用schedule()(与问题1 相关)切换到新进程。这个标志是一个消息,应该尽快调用调度,因为另一个进程应该运行。
返回用户空间或从中断返回时,检查need_resched 标志。如果已设置,内核会在继续之前调用调度程序。
查看内核源码(linux-2.6.10-《Linux内核开发,第二版》一书所基于的版本),我也看到有些代码可以主动调用schedule()函数,给另一个进程运行的权利。
我看到函数switch_to() 是实际执行上下文切换的函数。我查看了一些依赖于架构的代码,试图了解 switch_to() 实际在做什么。
这种行为引发了一些我无法找到答案的问题:
当
switch_to()结束时,当前运行的进程是什么?调用schedule()的进程?还是下一个流程,即被选中运行的流程?当
schedule()被中断调用时,要运行的选定进程在中断处理完成时开始运行(在某种 RTE 之后)?还是在那之前?如果不能从中断调用
schedule()函数,标志-need_resched何时设置?当定时器中断处理程序工作时,正在使用什么堆栈?
我不知道我是否可以说清楚。如果我不能,我希望我能在一些答案(或问题)之后做到这一点。 我已经查看了几个试图理解该过程的来源。我有《Linux Kernel Development, sec ed》一书,我也在使用它。 如果这有助于解释,我对 MIP 和 H8300 架构有所了解。
【问题讨论】:
标签: linux-kernel context-switch