我想了解如何在Linux内核的计划进程实际工作。我的问题不是关于调度算法。它关于功能schedule()
和switch_to()
是如何工作的。Linux内核的schedule()+ switch_to()函数是如何工作的?
我会尽力解释。我看到:
当进程用完时间片时,标记need_resched
由scheduler_tick()
设置。内核检查标志,看到它已设置,并调用schedule()
(与问题1相关)切换到新进程。该标志是应该尽快调用调度的消息,因为另一个进程值得运行。 返回到用户空间或从中断返回时,将检查need_resched
标志。如果已设置,则内核在继续之前调用调度程序。看看内核源代码(linux-2.6.10-“Linux Kernel Development,第二版”所基于的版本),我还看到有些代码可以自动调用schedule()
函数,给出另一个进程运行权。 我看到函数switch_to()
是实际进行上下文切换的函数。我研究了一些依赖于架构的代码,试图了解switch_to()
实际上在做什么。
这种行为提出了一些问题,我无法找到答案:
当
switch_to()
结束,什么是当前正在运行的进程?这个过程叫做schedule()
?或者下一个过程,即被选中运行的过程?当
schedule()
被中断调用时,当中断处理完成时(在某种RTE之后),选择的进程运行开始运行?或之前?如果
schedule()
函数不能从中断中调用,何时设置了flag-need_resched
?当定时器中断处理程序正在工作时,正在使用什么堆栈?
我不知道我是否可以说清楚。如果我不能,我希望我能在回答(或问题)后做到这一点。 我已经看了几个试图了解这个过程的来源。我有这本书“Linux Kernel Development,sec ed”,我也在使用它。 我知道一些关于MIP和H8300架构,如果有帮助解释。
对不起,我还是不明白。 例如: 假设我们有一个任务'A'正在运行。 1 - 发生定时器中断。 2 - 定时器中断处理程序启动。 3 - 现在是时间调用schedule()并且我们来做。(),switch_to()已经完成,任务'B'是当前任务(现在我们正在使用任务'B'的堆栈,并且我们仍在运行中断代码) 。 5 - 定时器中断结束,并恢复执行任务'B'。 这个例子正确吗?如果不是,过程如何发生? – derf
谢谢你的时间和耐心,但我想我错过了一些观点。你提供的信息比我现在可以处理的更多(当然,我对此非常感兴趣)。你能以更一般的方式解释吗? 我真的不明白的是:switch_to()完成后会发生什么? 在中断代码返回之前,所选任务(下一个)是否开始运行?哪个堆栈是当前的? – derf
我想我明白了。为了保持直线,我们没有中断,让我们忽略所有其他细节,并且只使用switch_to()。假设我有两个任务A和B,他们都有10个指令要做。任务A正在执行指令3,任务B正在执行指令6.任务A是当前任务。因此,任务A调用switch_to(),在指令3中保留任务A,并在指令6中恢复任务B.任务B跳到7,调用switch_to(),在7保留B,并在3恢复A.任务A去到4,再次调用switch_to(),并且进程继续进行。那是对的吗? – derf