- N +

【Linux 基础】 软中断与硬中断 详解

【Linux 基础】 软中断与硬中断 详解原标题:【Linux 基础】 软中断与硬中断 详解

导读:

什么是中断?从本质上来讲,中断是一种电信号,当设备有某种事件发生时,它就会产生中断,通过总线把电信号发送给中断控制器。如果中断的线是激活的,中断控制器就把电信号发送给处理器的某...

文章目录 [+]

什么是中断?

从本质上来讲,中断是一种电信号,当设备有某种事件发生时,它就会产生中断,通过总线把电信号发送给中断控制器。如果中断的线是激活的,中断控制器就把电信号发送给处理器的某个特定引脚。处理器于是立即停止自己正在做的事,跳到中断处理程序的入口点,进行中断处理。

Linux系统 硬中断 和 软中断 定义

硬中断:由与系统相连的外设(比如网卡、硬盘)自动产生的。主要是用来通知操作系统系统外设状态的变化。比如当网卡收到数据包

的时候,就会发出一个中断。我们通常所说的中断指的是硬中断(hardirq)。


软中断:为了满足实时系统的要求,中断处理应该是越快越好。linux为了实现这个特点,当中断发生的时候,硬中断处理那些短时间

就可以完成的工作,而将那些处理事件比较长的工作,放到中断之后来完成,也就是软中断(softirq)来完成。

软中断 理解

1.软中断是利用硬件中断的概念,用软件方式进行模拟,实现宏观上的异步执行效果。很多情况下,软中断和"信号"有些类似,同时,软中断又是和硬中断相对应的,"硬中断是外部设备对CPU的中断","软中断通常是硬中断服务程序对内核的中断","信号则是由内核(或其他进程)对某个进程的中断"(《Linux内核源代码情景分析》第三章)。

软中断的一种典型应用就是所谓的"下半部"(bottom half),它的得名来自于将硬件中断处理分离成"上半部"和"下半部"两个阶段的机制:上半部在屏蔽中断的上下文中运行,用于完成关键性的处理动作;而下半部则相对来说并不是非常紧急的,通常还是比较耗时的,因此由系统自行安排运行时机,不在中断服务上下文中执行。bottom half的应用也是激励内核发展出目前的软中断机制的原因。

2.Linux的softirq机制是与SMP紧密不可分的。为此,整个softirq机制的设计与实现中自始自终都贯彻了一个思想:“谁触发,谁执行”(Who marks,Who runs),也即触发
软中断的那个CPU负责执行它所触发的软中断,而且每个CPU都由它自己的软中断触发与控制机制。这个设计思想也使得softirq机制充分利用了SMP系统的性能和特点。

3.软中断是一种推后执行的机制,定时器,网卡的数据的处理是很典型的软中断,这个和中断向 量表里的中断是完全不一样的,以网络数据的处理为例,当网卡接到一个数据包后,其中断处理程序只是把数据复制到缓冲区,然后就告诉网卡,你可以再传数据给 我了,也就是中断返回,但在此之前,网卡的中断处理程序要置一个标志位,告诉操作系统有事要做,这个事就是软中断,但软中断只是很多中断返回时要做的事情 之一,操作系统每次中断返回时会检查着个标志位,看是否有事要做,如果有,就会去处理,象前面提到的网卡,这时候操作系统就回调用软中断的处理函数,网卡 的软中断程序就是做分析数据包啊,这个数据应该传给谁啊等这些工作.没有,就返回了,除了必须的部分


Linux 系统查看 软中断 

使用 top 命令查看 中断cpu使用百分比情况

Cpu0  : 58.3%us, 12.2%sy,  0.0%ni, 26.9%id,  0.0%wa,  0.0%hi,  2.6%si,  0.0%st
Cpu1  : 57.8%us, 42.2%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu2  : 57.0%us, 43.0%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu3  : 45.5%us, 54.5%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st

hi: 硬中断cpu占用百分比      si:软中断cpu占用百分比


使用 cat /proc/interrupts 查看中断情况

[root@VM-10-58-57-231 tsar-master]# cat /proc/interrupts
           CPU0       CPU1       CPU2       CPU3       
  0:        120          0          0          0   IO-APIC-edge      timer
  1:          6          0          0          0   IO-APIC-edge      i8042
  4:         72          0          0          0   IO-APIC-edge      serial
  8:         72          0          0          0   IO-APIC-edge      rtc0
  9:          0          0          0          0   IO-APIC-fasteoi   acpi
 10:     787391          0          0          0   IO-APIC-fasteoi   virtio2
 11:         33          0          0          0   IO-APIC-fasteoi   uhci_hcd:usb1
 12:        102          0          0          0   IO-APIC-edge      i8042
 14:          0          0          0          0   IO-APIC-edge      ata_piix
 15:          0          0          0          0   IO-APIC-edge      ata_piix
 24:          0          0          0          0   PCI-MSI-edge      virtio1-config
 25:   21203150          0          0          0   PCI-MSI-edge      virtio1-requests
 26:          0          0          0          0   PCI-MSI-edge      virtio0-config
 27: 1076495457          0          0          0   PCI-MSI-edge      virtio0-input
 28:     298761          0          0          0   PCI-MSI-edge      virtio0-output
NMI:          0          0          0          0   Non-maskable interrupts
LOC: 3338538968  379550859  582752435 1063994943   Local timer interrupts
SPU:          0          0          0          0   Spurious interrupts
PMI:          0          0          0          0   Performance monitoring interrupts
IWI:          0          0          0          0   IRQ work interrupts
RES:  321409273  311194435  320657401  338708135   Rescheduling interrupts
CAL:       1227       2114       2226       2170   Function call interrupts
TLB:   11030867    9443340    9588403    9779879   TLB shootdowns
TRM:          0          0          0          0   Thermal event interrupts
THR:          0          0          0          0   Threshold APIC interrupts
MCE:          0          0          0          0   Machine check exceptions
MCP:      26247      26247      26247      26247   Machine check polls
ERR:          0
MIS:          0

文件解释如下:

 27: 1076495457          0          0          0   PCI-MSI-edge      virtio0-input

 

  中 断号27的中断口,在 cpu0 上响应了 1076495457个中断,在 cpu1,cpu2,cpu3 上响应了 0 个中断,链接在这个端口的中断链表上设备接口是

  PCI-MSI-edge,这个中断号是 virti0-input设备名称。

第一列是终端号,不显示没有安装处理程序的中断线
第二列是已接收的中断数目
第三列是处理这个中断的中断控制器。XT-PIC对应于标准的PC可编程中断控制器。
第四列是与这个中断相关的设备名。如果中断是共享的,会将这条中断线上所有的设备都列出来


本文标题:【Linux 基础】 软中断与硬中断 详解
本文链接:http://www.kyjszj.com/zyfx/147.html
作者授权:除特别说明外,本文由 开源技术之家 原创编译并授权 开源技术之家 刊载发布。
版权声明:本文不使用任何协议授权,您可以任何形式自由转载或使用。

有好的文章希望我们帮助分享和推广,猛戳这里我要投稿

返回列表
上一篇:
下一篇:

发表评论中国互联网举报中心

快捷回复:

    评论列表 (暂无评论,共1604人参与)参与讨论

    还没有评论,来说两句吧...