![为什么 /proc/irq/*/smp_affinity 显示的掩码对于我计算机上的 CPU 数量来说太宽?](https://linux22.com/image/69289/%E4%B8%BA%E4%BB%80%E4%B9%88%20%2Fproc%2Firq%2F*%2Fsmp_affinity%20%E6%98%BE%E7%A4%BA%E7%9A%84%E6%8E%A9%E7%A0%81%E5%AF%B9%E4%BA%8E%E6%88%91%E8%AE%A1%E7%AE%97%E6%9C%BA%E4%B8%8A%E7%9A%84%20CPU%20%E6%95%B0%E9%87%8F%E6%9D%A5%E8%AF%B4%E5%A4%AA%E5%AE%BD%EF%BC%9F.png)
我正在运行带有最新内核(即 3.19.0-22-generic)的 X86_64 Ubuntu Desktop 15.04。我正在检查中断和 IRQ,并注意到 smp_affinity 的位掩码是应有的两倍,我想知道为什么会这样?
但是,更明确地说:
$ cat /proc/interrupts
CPU0 CPU1 CPU2 CPU3
0: 21 0 0 0 IR-IO-APIC-edge timer
1: 113 1780 107 90 IR-IO-APIC-edge i8042
8: 0 1 0 0 IR-IO-APIC-edge rtc0
9: 455 1106 71 57 IR-IO-APIC-fasteoi acpi
12: 10768 131886 9077 7920 IR-IO-APIC-edge i8042
...
然后例如:
$ cat /proc/irq/0/smp_affinity
ff
$ cat /proc/irq/8/smp_affinity
0f
$ cat /proc/irq/47/smp_affinity
04
我原本期望只看到1
数字而不是2
.例如,在 中IRQ 0
,我期望看到“ f
”而不是“ ff
”。原因是我4
在第一个代码列表中只有 CPU,并且位掩码4
足以覆盖它们。也就是说,“ 1111
”将覆盖所有4
CPU,因此IRQ 0
将是“ f
”。有人知道这是否是一个错误,或者“”是否ff
有意义,有人可以向我解释吗?
另外,请注意IRQ 8
“ 0f
”在我的 CPU 上下文中的含义4
,这意味着所有4
CPU 都将成为该中断的目标。如果是这种情况,那么这IRQ 0
与覆盖所有 CPU(4
总计)完全相同。换句话说,“ 0f
”相当于“ ff
”,这对我来说没有意义:(
任何类型的解释或指导,进一步了解将不胜感激。
提前致谢。
答案1
亲和性位掩码的大小取决于亲和性位掩码的数量支持的内核中的 CPU,而不是系统中实际存在的 CPU 数量;但在运行时,仅考虑与当前 CPU 相对应的位。看IRQ-affinity.txt
和cpumask.h
在内核源代码中了解详细信息。