了解 Linux 内核的 `scheduler_tick()` 函数

Understanding the `scheduler_tick()` function of Linux Kernel

据我所知,我了解到 scheduler_tick() 函数会以 HZ 的频率被定时器中断周期性地调用。

我是内核开发的新手,所以这些问题可能很幼稚,但我正在尝试了解 scheduler_tick() 函数的执行。感谢您对这些问题的帮助:

  1. 定时器有可能在上一次调用之前再次调用这个函数returns?

  2. 这叫per-core吗? (每个内核定时器中断)

  3. 如果 HZ 频率高,则调度程序执行进程的时间超过其时间片。如果 HZ 较低,我认为由于频繁中断和调用此函数会产生很大的开销。这个假设是否正确?

同时回答您的主要问题和评论:

  1. 不可能在已经调度时调用调度程序代码,因为它运行在禁用中断的情况下。
  2. 是的,每个核心都有自己的运行队列并进行自己的调度。
  3. 恰恰相反:高 HZ -> 调度器会 运行 更频繁(因为 HZ 代表每秒的调度滴答数);低 HZ -> 调度程序将 运行 不那么频繁。

不需要同时在每个内核上进行调度,每个 CPU 都有自己的计时器,并且不管是否与其他 CPU 同步,都会执行自己的计时器中断。调度程序 ticks 不会在所有 CPUs 上同时发生(此外,CPUs 可能处于空闲状态,并且在配置为 CONFIG_NOHZ 的“无滴答”内核中根本不会滴答作响)。 Tickless 内核让事情变得有点棘手,有关更多信息,请查看 Documentation/timers/NO_HZ.txt and "How are jiffies incremented in a tickless kernel?".

根据 trigger_load_balance() 的作用和方式,请参阅 Documentation/scheduler/sched-domains.txt, which explains it more or less in detail. In particular, trigger_load_balance() doesn't do the actual load balancing, it just checks if it's needed and if so raises a soft IRQ (SCHED_SOFTIRQ), which is then handled by run_rebalance_domains(), which calls rebalance_domains(),后者执行实际工作。后一个函数确实使用了 RCU/locking,正如您对 spin_trylock()rcu_read_lock().

等函数的调用所见