为什么/ proc / interrupts中显示的IO-APIC-edge计数器的计数经常不会改变?

时间:2014-09-19 09:52:36

标签: linux-kernel

我使用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接收定时器中断?

2 个答案:

答案 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