循环调度和上下文切换如何从底层工作?

循环调度和上下文切换如何从底层工作?

使用循环调度,内核为不同的进程/任务提供时间片。

看来内核会初始化一个定时器,当定时器超时时,就会导致当前任务被中断,然后内核获得控制权。

内核如何知道应该使用定时器超时中断来调度新任务?如果不同的计时器用于各种不同的目的而不仅仅是用于调度程序怎么办?所有不同的中断服务例程都去哪里了?提前致谢。

答案1

与在 >= 2.6.23 linux CFS 下运行的线程相关的答案SCHED_RR调度策略


内核为不同的进程/任务提供时间片。

这并不完全正确。如果我们将您的陈述改写如下,则可以更好地理解:对于每个线程,调度程序计算一些时间量。

看来内核会初始化一个定时器,当定时器超时时,就会导致当前任务被中断,然后内核获得控制权。

这是错误的。如前所述,调度程序仅计算一些时间值。没有直接关联的计时器,达到时间量时不会触发任何计时器中断。

别担心!无论何时触发 IRQ,调度程序都会运行,在涉及延迟的最坏情况下,至少应在 CPU_HZ 频率下发生。每当调度程序运行时,它都会考虑运行队列并重新计算其红黑树

如果在调度程序运行时,一个 SCHED_RR 任务正在运行,并且所有其他 SCHED_RR 任务都被阻止(等待任何事件),并且没有其他更高优先级的实时计划任务可以运行,那么……该任务将不会被调度出去,运行时间可能长于其关联的时间量

如果另一个 SCHED_RR 任务可以运行,如果正在运行的任务获得 CPU 的时间大于或等于其时间量,那么它将被调度出去并扔到队列的后面(给出最低优先级),而可以运行的任务被安排在。

恕我直言,您的最后一个问题与该问题的要点无关,最好将其作为另一个线程的一部分。

相关内容