我试图了解 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 架构有所了解。