0

0

Linux操作系统下CPU的中断

巴扎黑

巴扎黑

发布时间:2017-07-24 11:05:25

|

2476人浏览过

|

来源于php中文网

原创

中断其实就是由硬件或软件所发送的一种称为irq(中断请求)的信号。

中断允许让设备,如键盘,串口卡,并口等设备表明它们需要CPU。

一旦CPU接收了中断请求,CPU就会暂时停止执行正在运行的程序,并且调用一个称为中断处理器或中断服务程序(interrupt service routine)的特定程序。

中断服务程序或中断处理器可以在中断向量表中找到,而这个中断向量表位于内存中的固定地址中。中断被CPU处理后,就会恢复执行之前被中断的程序。

其实,在机器启动的时候,系统就已经识别了所有设备,并且也把相应的中断处理器加载到中断表中。

下面是请求CPU关注的两种方式:
1. 基于中断
2. 基于轮询

所有的linux操作系统都是基于中断驱动的。

当我们在键盘上按下一个按键时,键盘就会对CPU说,一个键已经被按下。在这种情况下,键盘的IRQ线路中的电压就会发生一次变化,而这种电压的变化就是来自设备的请求,就相当于说这个设备有一个请求需要处理。

/proc/interrupts 文件
在linux的机器上,/proc/interrupts这个文件包含有关于哪些中断正在使用和每个处理器各被中断了多少次的信息。
# cat /proc/interrupts 
          CPU0  CPU1  CPU2  CPU3 
  0: 3710374484      0    0    0  IO-APIC-edge  timer 
  1:        20      0    0    0  IO-APIC-edge  i8042 
  6:          5      0    0    0  IO-APIC-edge  floppy 
  7:          0      0    0    0  IO-APIC-edge  parport0 
  8:          0      0    0    0  IO-APIC-edge  rtc 
  9:          0      0    0    0  IO-APIC-level  acpi 
 12:        240      0    0    0  IO-APIC-edge  i8042 
 14:  11200026      0    0    0  IO-APIC-edge  ide0 
 51:  61281329      0    0    0  IO-APIC-level  ioc0 
 59:          1      0    0    0  IO-APIC-level  vmci 
 67:  19386473      0    0    0  IO-APIC-level  eth0 
 75:  94595340      0    0    0  IO-APIC-level  eth1 
NMI:          0      0    0    0
LOC: 3737150067 3737142382 3737145101 3737144204
ERR:          0
MIS:          0

对上面文件的输出,解释如下:
● 第一列表示IRQ号
● 第二、三、四列表示相应的CPU核心被中断的次数。在上面的例子中,timer表示中断名称(为系统时钟)。3710374484表示CPU0被中断了3710374484次。i8042表示控制键盘和鼠标的键盘控制器。
● 对于像rtc(real time clock)这样的中断,CPU是不会被中断的。因为RTC存在于电子设备中,是用于追踪时间的。
● NMI和LOC是系统所使用的驱动,用户无法访问和配置。

IRQ号决定了需要被CPU处理的优先级。IRQ号越小意味着优先级越高。
例如,如果CPU同时接收了来自键盘和系统时钟的中断,那么CPU首先会服务于系统时钟,因为他的IRQ号是 0 。
● IRQ0 :系统时钟(不能改变)
● IRQ1 :键盘控制器(不能改变)
● IRQ3 :串口2的串口控制器(如有串口4,则其也使用这个中断)
● IRQ4 :串口1的串口控制器(如有串口3,则其也使用这个中断)
● IRQ5 :并口2和3 或 声卡
● IRQ6 :软盘控制器
● IRQ7 : 并口1。它被用于打印机或若是没有打印机,可以用于任何的并口。

而对于像操作杆(或称为游戏手柄)上的CPU,它并不会等待设备发送中断。因为操作杆主要用于游戏,操作杆的移动必须非常快,因此使用轮询的方式检测设备是否需要CPU的关注还是比较理想的。使用轮询方式的缺点是CPU就处于了忙等状态,因为CPU会不停的多次检查设备。但是需要注意的是在linux中,这种处理信号的方式也是必不可少的。

硬中断
对于上文所讨论的场景都是属于硬中断的例子。硬中断主要分为两种类别:
1. 非屏蔽中断(Non-maskable        interrupts,即NMI):就像这种中断类型的字面意思一样,这种中断是不可能被CPU忽略或取消的。NMI是在单独的中断线路上进行发送的,它通常被用于关键性硬件发生的错误,如内存错误,风扇故障,温度传感器故障等。
2. 可屏蔽中断(Maskable interrupts):这些中断是可以被CPU忽略或延迟处理的。当缓存控制器的外部针脚被触发的时候就会产生这种类型的中断,而中断屏蔽寄存器就会将这样的中断屏蔽掉。我们可以将一个比特位设置为0,来禁用在此针脚触发的中断。

软中断
这些中断是在CPU执行指令(也就是说在进程正在运行的时候)的时候产生的,因为在执行指令时,CPU(确切的说应是在CPU中的运算器)自身会产生一个异常(此处的异常也可理解为软中断)。

易通cmseasy免费的企业建站程序2.0 UTF-8 build 201000510 中文版
易通cmseasy免费的企业建站程序2.0 UTF-8 build 201000510 中文版

易通(企业网站管理系统)是一款小巧,高效,人性化的企业建站程序.易通企业网站程序是国内首款免费提供模板的企业网站系统.§ 简约的界面及小巧的体积:后台菜单完全可以修改成自己最需要最高效的形式;大部分操作都集中在下拉列表框中,以节省更多版面来显示更有价值的数据;数据的显示以Javascript数组类型来输出,减少数据的传输量,加快传输速度。 § 灵活的模板标签及模

下载

例如,一个数字除以0(当然这是不可能的),此时就会导致一个divide-by-zero的异常,从而导致计算机将此计算取消或者显示一个错误的信息。

在文件/proc/stat中,包含了一些关于系统内核的统计信息,也包含了一些中断信息。
# cat /proc/stat 
cpu  17028082 5536753 5081493 1735530500 42592308 90006 479750 0
cpu0 5769176 1170683 1495750 403368354 39406374 90006 284864 0
cpu1 3714389 1451937 1186134 444082258 1084780 0 64876 0
cpu2 3791544 1471013 1211868 443988514 1056981 0 64764 0
cpu3 3752971 1443119 1187740 444091373 1044172 0 65244 0
intr 417756956 --- Output Truncated

在intr这一行,显示了自从系统启动以来所产生的中断数。第一列表示所有被服务的中断数。后续的每一列都表示一个特定中断的总数。

SMP_AFFINITY
SMP是指对称多处理器。smp_affinity文件主要用于某个特定IRQ要绑定到哪个CPU核心上。在/proc/irq/IRQ_NUMBER/目录下都有一个smp_affinity文件,这个文件中,所表示的CPU核心以十六进制来表示的。例如,网卡的中断号是:

grep eth0 /proc/interrupts 
67: 23834931 0 0 0 IO-APIC-level eth0 
                                                                
cat /proc/irq/67/smp_affinity 
00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000001

上面的十六进制对应的十进制是1,也就是说所有的和网卡驱动相关的中断都是有CPU0来提供服务的。

我们可以通过手动改变smp_affinity文件中的值来将IRQ绑定到指定的CPU核心上,或者启用irqbalance服务来自动绑定IRQ到CPU核心上。


IRQ Balance
Irqbalance是一个linux的实用程序,它主要是用于分发中断请求到CPU核心上,有助于性能的提升。它的目的是寻求省电和性能优化之间的平衡。你可以使用yum进行安装:
 # rpm -qa | grep irqbalance 
irqbalance-0.55-15.el5 
# yum search irqbalance 
# yum install irqbalance.x86_64

 

启动irqbalance服务后,中断在CPU上的分布如下:
 # cat /proc/interrupts 
          CPU0    CPU1      CPU2      CPU3 
  0:  950901695        0        0          0  IO-APIC-edge  timer 
  1:        13        0        0          0  IO-APIC-edge  i8042 
  6:        96    10989      470          0  IO-APIC-edge  floppy 
  7:          0        0        0          0  IO-APIC-edge  parport0 
  8:          1        0        0          0  IO-APIC-edge  rtc 
  9:          0        0        0          0  IO-APIC-level  acpi 
 12:        109    1787        0          0  IO-APIC-edge  i8042 
 15:        99 84813914        0          0  IO-APIC-edge  ide1 
 51:      17371        0  46689970          0  IO-APIC-level  ioc0 
 67:      1741        0        0  225409160  PCI-MSI  eth0 
 83:          0        0        0          0  PCI-MSI  vmci 
NMI:          0        0        0          0
LOC:  950902917  950903742  950901202  950901400
ERR:          0
MIS:          0

Irqbalance对于包含多个核心的系统来说是非常有用的。因为通常中断只被第一个CPU核心服务。

相关专题

更多
云朵浏览器入口合集
云朵浏览器入口合集

本专题整合了云朵浏览器入口合集,阅读专题下面的文章了解更多详细地址。

0

2026.01.20

Java JVM 原理与性能调优实战
Java JVM 原理与性能调优实战

本专题系统讲解 Java 虚拟机(JVM)的核心工作原理与性能调优方法,包括 JVM 内存结构、对象创建与回收流程、垃圾回收器(Serial、CMS、G1、ZGC)对比分析、常见内存泄漏与性能瓶颈排查,以及 JVM 参数调优与监控工具(jstat、jmap、jvisualvm)的实战使用。通过真实案例,帮助学习者掌握 Java 应用在生产环境中的性能分析与优化能力。

20

2026.01.20

PS使用蒙版相关教程
PS使用蒙版相关教程

本专题整合了ps使用蒙版相关教程,阅读专题下面的文章了解更多详细内容。

62

2026.01.19

java用途介绍
java用途介绍

本专题整合了java用途功能相关介绍,阅读专题下面的文章了解更多详细内容。

87

2026.01.19

java输出数组相关教程
java输出数组相关教程

本专题整合了java输出数组相关教程,阅读专题下面的文章了解更多详细内容。

39

2026.01.19

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

10

2026.01.19

xml格式相关教程
xml格式相关教程

本专题整合了xml格式相关教程汇总,阅读专题下面的文章了解更多详细内容。

13

2026.01.19

PHP WebSocket 实时通信开发
PHP WebSocket 实时通信开发

本专题系统讲解 PHP 在实时通信与长连接场景中的应用实践,涵盖 WebSocket 协议原理、服务端连接管理、消息推送机制、心跳检测、断线重连以及与前端的实时交互实现。通过聊天系统、实时通知等案例,帮助开发者掌握 使用 PHP 构建实时通信与推送服务的完整开发流程,适用于即时消息与高互动性应用场景。

19

2026.01.19

微信聊天记录删除恢复导出教程汇总
微信聊天记录删除恢复导出教程汇总

本专题整合了微信聊天记录相关教程大全,阅读专题下面的文章了解更多详细内容。

160

2026.01.18

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 7.5万人学习

Git 教程
Git 教程

共21课时 | 2.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号