了解 Linux 内核的 `scheduler_tick()` 函数
Understanding the `scheduler_tick()` function of Linux Kernel
据我所知,我了解到 scheduler_tick()
函数会以 HZ 的频率被定时器中断周期性地调用。
我是内核开发的新手,所以这些问题可能很幼稚,但我正在尝试了解 scheduler_tick()
函数的执行。感谢您对这些问题的帮助:
定时器有可能在上一次调用之前再次调用这个函数returns?
这叫per-core吗? (每个内核定时器中断)
如果 HZ 频率高,则调度程序执行进程的时间超过其时间片。如果 HZ 较低,我认为由于频繁中断和调用此函数会产生很大的开销。这个假设是否正确?
同时回答您的主要问题和评论:
- 不可能在已经调度时调用调度程序代码,因为它运行在禁用中断的情况下。
- 是的,每个核心都有自己的运行队列并进行自己的调度。
- 恰恰相反:高 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()
.
等函数的调用所见
据我所知,我了解到 scheduler_tick()
函数会以 HZ 的频率被定时器中断周期性地调用。
我是内核开发的新手,所以这些问题可能很幼稚,但我正在尝试了解 scheduler_tick()
函数的执行。感谢您对这些问题的帮助:
定时器有可能在上一次调用之前再次调用这个函数returns?
这叫per-core吗? (每个内核定时器中断)
如果 HZ 频率高,则调度程序执行进程的时间超过其时间片。如果 HZ 较低,我认为由于频繁中断和调用此函数会产生很大的开销。这个假设是否正确?
同时回答您的主要问题和评论:
- 不可能在已经调度时调用调度程序代码,因为它运行在禁用中断的情况下。
- 是的,每个核心都有自己的运行队列并进行自己的调度。
- 恰恰相反:高 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()
.