正如我所读到的,计时器 ISR 在每个计时器滴答声中都会增加 jiffies。但是在 SMP 中,所有 CPU 都有自己的定时器中断,因此也有自己的定时器 ISR。所以我的问题是:
jiffies 在所有 CPU 上都是全局的吗?如果是这样,哪个 CPU 如何在其定时器 ISR 中增加它?
根据我的理解,jiffies 不能针对每个 CPU,否则在不同 CPU 上调度的同一进程会看到不同的 jiffy 值。
正如我所读到的,计时器 ISR 在每个计时器滴答声中都会增加 jiffies。但是在 SMP 中,所有 CPU 都有自己的定时器中断,因此也有自己的定时器 ISR。所以我的问题是:
jiffies 在所有 CPU 上都是全局的吗?如果是这样,哪个 CPU 如何在其定时器 ISR 中增加它?
根据我的理解,jiffies 不能针对每个 CPU,否则在不同 CPU 上调度的同一进程会看到不同的 jiffy 值。
有两个定时器中断:
本地定时器中断 ( LOC
in /proc/interrupts
) 在每个 CPU 上每 jiffy 触发一次。
全局定时器中断(中断 0)每瞬间触发一次,在任何 CPU 上。它递增jiffies
。
请注意,“Tickless Kernel”配置选项(在 Linux 2.6.21 中引入CONFIG_NO_HZ
)删除了这些中断。使用无滴答内核,不再有周期性中断。相反,当一个进程开始它的量程时,Linux 会在硬件中设置一个“闹钟”,以便在量程结束时触发中断。
请参阅此帖子链接。
基本上,tick_do_timer_cpu
变量保存 CPU ID,它应该运行管理 jiffies 的代码。jiffies 管理函数执行可以从一个核跳转到另一个核,但显然不能同时在不同核上进行更新。