我使用cat /proc/interrupts
内核在CentOS 6.5上运行2.6.32-431.el6.x86_64
。结果是
CPU0 CPU1 CPU2 CPU3
0: 31039 0 0 0 IO-APIC-edge timer
// content omitted
LOC: 211509915 178638855 154577696 153050202 Local timer interrupts
// content omitted
然后我多次运行cat /proc/interrupts
。但IO-APIC边沿定时器中断的计数31039
不会改变。我的第一个问题是IO-APIC边缘定时器是否代表每秒中断HZ次的全局定时器。如果是,为什么它的计数不会每秒改变HZ次?
我运行grep CONFIG_HZ /boot/*config*
,显示CONFIG_HZ=1000
。
我的第二个问题是为什么只有CPU0接收定时器中断?
答案 0 :(得分:0)
timer
是 good 旧的ISA定时器中断;它仅在引导时使用,直到内核检测到并初始化本地APIC定时器。
每个CPU(核心)使用HZ
计时器进行调度。
但是,对于CONFIG_NO_HZ_IDLE
或甚至CONFIG_NO_HZ
,该计时器在不需要时会被禁用。
在这种情况下,只有一个CPU需要一个计时器来进行计时。
答案 1 :(得分:-1)
在具有本地APIC的SMP计算机上,全局计时器仅在引导期间使用。设置本地APIC后,本地计时器会中断调用update_process_times和更新jiffies。全局计时器未使用。所有CPU都执行update_process_times。但只有一个CPU更新jiffies。
回答我的第一个问题:IO-APIC-edge计时器代表全局计时器。但它仅在启动时使用。由于它在启动时间后未使用,因此其计数不会每秒改变HZ次。
回答第二个问题:只有一个CPU处理中断,其他CPU忽略它:
if cpuid == cpu_for_global_timer
handle it
else
ignore it
有关详细信息,请参阅http://yaojingguo.github.io/Linux-Kernel-Time.html