------------------>Part 1: cat /proc/interrupts
文件/proc/interrupts是中断报告文件,可以查看中断发生的次数。
Linux内核通常会在第一个CPU上处理中断,以便最大化缓存本地性
CPU0 CPU1
0: 61 20 IO-APIC-edge timer
1: 5098 5157 IO-APIC-edge i8042
4: 2 2 IO-APIC-edge
7: 0 0 IO-APIC-edge parport0
8: 1 0 IO-APIC-edge rtc0
9: 0 0 IO-APIC-fasteoi acpi
14: 0 0 IO-APIC-edge ata_piix
15: 0 0 IO-APIC-edge ata_piix
16: 6121 6216 IO-APIC-fasteoi uhci_hcd:usb5, HDA Intel, nvidia
18: 0 0 IO-APIC-fasteoi uhci_hcd:usb4
19: 110675 110742 IO-APIC-fasteoi ata_piix, uhci_hcd:usb3
23: 26152 25964 IO-APIC-fasteoi ehci_hcd:usb1, uhci_hcd:usb2
27: 36191 36157 PCI-MSI-edge eth0
NMI: 0 0 Non-maskable interrupts
LOC: 2873486 2200162 Local timer interrupts
SPU: 0 0 Spurious interrupts
CNT: 0 0 Performance counter interrupts
PND: 0 0 Performance pending work
RES: 1476 1516 Rescheduling interrupts
CAL: 3593 6329 Function call interrupts
TLB: 16527 25913 TLB shootdowns
TRM: 0 0 Thermal event interrupts
THR: 0 0 Threshold APIC interrupts
MCE: 0 0 Machine check exceptions
1,12 Top
解释如下:
16: 6121 6216 IO-APIC-fasteoi uhci_hcd:usb5, HDA Intel, nvidia
中断号16的中断口,在 cpu0 上响应了 6121 个中断,在 cpu1 上响应了 6216 个中断,链接在这个端口的中断链表上设备接口是 IO-APIC-fasteoi,这个中断号是 设备名为 uhci_hcd:usb5, HDA Intel, nvidia 的几个设备共享的。
在实现上,是这样滴:irq_desc_t 类型的结构体指针数组 irq_desc 的[16]刚好指着 uhci_hcd:usb5, HDA Intel, nvidia 等设备 regisgter 的 irqactoin 结构体。如图:
|
摘自 深入理解Linux网络内幕 chapter-05
|
而接口类型 IO-APIC-fasteoi 的由来和判断,由《linux设备驱动程序》第十章 interrupt 知:
X86 计算机的 CPU 为中断只提供了两条外接引脚:NMI 和 INTR。其中 NMI 是不可屏蔽中断,它通常用于电源掉电和物理存储器奇偶校验;INTR是可屏蔽中断,可以通过设置中断屏蔽位来进行中断屏蔽,它主要用于接受外部硬件的中断 信号,这些信号由中断控制器传递给 CPU。
常见的中断控制器有两种:
1. 可编程中断控制器8259A
传统的 PIC(Programmable Interrupt Controller)是由两片 8259A 风格的外部芯片以“级联”的方式连接在一起。每个芯片可处理多达 8 个不同的 IRQ。因为从 PIC 的 INT 输出线连接到主 PIC 的 IRQ2 引脚,所以可用 IRQ 线的个数达到 15 个。
2. 高级可编程中断控制器(APIC)
8259A 只适合单 CPU 的情况,为了充分挖掘 SMP 体系结构的并行性,能够把中断传递给系统中的每个 CPU 至关重要。基于此理由,Intel 引入了一种名为 I/O 高级可编程控制器的新组件,来替代老式的 8259A 可编程中断控制器。该组件包含两大组成部分:一是“本地 APIC”,主要负责传递中断信号到指定的处理器;举例来说,一台具有三个处理器的机器,则它必须相对的要有三个本地 APIC。另外一个重要的部分是 I/O APIC,主要是收集来自 I/O 装置的 Interrupt 信号且在当那些装置需要中断时发送信号到本地 APIC,系统中最多可拥有 8 个 I/O APIC。
每个本地 APIC 都有 32 位的寄存器,一个内部时钟,一个本地定时设备以及为本地中断保留的两条额外的 IRQ 线 LINT0 和 LINT1。所有本地 APIC 都连接到 I/O APIC,形成一个多级 APIC 系统。
判断到底是哪一个,正是查看 /proc/interrupts 文件,如果输出结果中列出了 IO-APIC,说明您的系统正在使用 APIC。如果看到 XT-PIC,意味着您的系统正在使用 8259A 芯片。这里可知道,Ubuntu-9.10 系统使用的是 APIC。
------------------- Part 2:cat /proc/stat
文件/proc/stat纪录一些系统活动的底层统计信息
intr 5167833 5154006 2 0 2 4907 0 2 68 4 0 4406 9291 50 0 0
第一个数是所有中断的总数, 而其他每一个代表一个单个 IRQ 线, 从中断 0 开始. 所有的计数跨系统中所有处理器而汇总的. 这个快照显示, 中断号 4 已使用 4907 次
我的电脑显示: 明显,是双核的:
cpu 516723 64 36709 2088864 22390 368 292 0 0
cpu0 262145 44 20530 1002081 10525 195 139 0 0
cpu1 254577 19 16179 1086782 11864 173 152 0 0
intr 6728699 88 14724 0 0 4 0 0 0 1 0 0 0 0 0 0 0 14424 0 0 281679 0 0 0 98753 0 0 0 110703 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
ctxt 34687715
btime 1259661354
processes 4203
procs_running 2
procs_blocked 0
softirq 3659166 0 2679591 27904 125768 90471 27216 168604 814 538798
**************两个文件的区别:
第一,在每个打开和关闭循环, 你可能发现 /proc/stat 比 /proc/interrupts 更加有用.
另一个不同是, interrupts 不是体系依赖的(也许, 除了末尾几行), 而 stat 是; 字段数依赖内核之下的硬件. 可用的中断数目少到在 SPARC 上的 15 个, 多到 IA-64 上的 256个, 并且其他几个系统都不同. 有趣的是要注意, 定义在 x86 中的中断数当前是 224, 不是你可能期望的 16; 如同在 include/asm-i386/irq.h 中解释的, 这依赖 Linux 使用体系的限制, 而不是一个特定实现的限制( 例如老式 PC 中断控制器的 16 个中断源). -------- 这个不是特别明白呢。