Linux内中断与外中断的异同 (linux内中断与外中断区别)

计算机中,中断是一种用于通知CPU出现了重要事件的机制。中断使得CPU能够在不停止当前正在执行的程序的情况下,及时地响应外部设备的事件,从而提高了计算机系统的效率。中断分类有很多种,其中较为常见的是内中断和外中断。本文将重点讨论Linux操作系统中的内中断和外中断的异同点。

一、内中断和外中断的概念

内中断:是指进程执行过程中发生的事件,由于这种中断事件都是在CPU内部发生并处理,因此称之为内中断。Linux内核使用软件中断(定时器中断,I/O中断等)和硬件中断(CPU异常)两种方式来产生内中断。

外中断:是指CPU在执行指令时,接收来自外部设备的中断请求。外部设备会向处理器发出请求,要求其停止当前程序的执行,暂时转向处理该设备所发出的中断请求,并返回到该请求发出之前的程序段继续执行。外中断由硬件产生,与CPU打交道,例如,网卡、鼠标、键盘等都是能够产生中断请求的外设。

二、内中断和外中断的区别

1. 响应方式不同

内中断和外中断的响应方式不同,内中断是由处理器自身进行处理,而外中断是由外部设备对处理器发出中断请求,处理器停止当前程序的执行。

2. 原因不同

内中断和外中断产生的原因也不同,内中断是处理器在执行指令过程中,由自身产生的异常事件,例如CPU超时、访问非法内存地址等。而外中断是由外部设备发出请求,例如键盘输入等。

3. 硬件执行方式不同

内中断由CPU通过检测处理器自身的运行状态而触发的,通常不需要特殊的硬件支持。而外中断在处理器硬件中需要外设提供支持,例如网卡的中断管脚等。

4. 响应时间不同

内中断和外中断的响应时间也不同。内中断通常响应较快,因为它们总是在当前进程被打断时立即发生。外中断由于必须由外部设备发出并经过处理器响应,因此响应时间通常较长。

三、Linux系统中的中断

在Linux系统中,所有的中断最终都被内核处理。系统中有两个主要的中断类型:软中断和硬中断。

1. 软中断

Linux系统中的软中断通常是由一些编程接口或系统服务调用,例如在网络服务中,会使用软中断来处理TCP/IP协议栈。此外,软中断还被用于实现CPU资源共享,以及多CPU系统中的任务管理。

2. 硬中断

硬中断是由外部设备发出并由处理器根据处理设备指定的优先级来响应。在Linux系统中,外部设备通过IRQ线向处理器发送中断请求,该请求被处理器转发给具体的设备驱动程序,驱动程序会使用硬件设备的中断服务例程来处理这些请求。

内中断和外中断虽然在基本概念上与区别上有所不同,但在Linux操作系统中都是非常重要的机制。Linux系统通过内中断和外中断来监控系统的异常情况和外部设备的请求,以提高系统的安全性和效率。对于Linux程序员来说,了解中断的工作原理、机制以及响应过程等,对于理解运行过程中的问题和定位系统故障都是非常重要的。

相关问题拓展阅读:

AVR单片机中,举例说明什么是外部中断和内部中断。说明外部中断(INT0和INT1)有哪几种触发方式?

呵呵 西科大的吧?找答案?参考答案见下面:

外部中断是指升辩简芯片引脚态发生变化向CPU申请中断,比如下降沿灶弊、上升沿、电平变化等,具体可设置特殊功能寄存器来开启或屏蔽;复位引脚比较特殊,中数后PC指针变为0x0000;

内部中断是吵裤指内部功能模块达到到中断条件向CPU申请中断,比如TCC、看门狗等,可参照不同芯片的技术文档说明进行设置

5种

linux 内核软中断 是在中断状态吗

硬中断:

1. 硬中断是由硬件产生的,比如,像磁盘,网卡,键盘,时钟等。每个设备或设备集都有它自己的IRQ(中断请求)。基于IRQ,CPU可以将相应的请求分发到对应的硬件驱动上(注:硬件驱动通常是内核中的一个子程序,而不是一个独立的进程)。

2. 处理中断的驱动是需要运行在CPU上的,因此,当中断产生的时候,CPU会中断当前正在运行的任务,来处理中断。在有多核心的系统上,一个中断通常只能中断一颗CPU(也有一种特殊的情况,就是在大型主机上是有硬件通道的,它可以在没有主CPU的支持下,可以同时处理多个中断。)。

3. 硬中断可以直接中断CPU。它会引起内核中相关的代码被触发。对于那些需要花费一些时间去处理的进程,中断代码本身也可以被其他的硬中断中断。

4. 对于时钟中断,内核调度代码会将当前正在运行的进程挂起,从而让其他的进程来运行。它的存在是为了让调度代码(或称为调度器)可以调度多任务。

软中断:

1. 软中断的处理非常像硬中断。然而,它们仅仅是由当前正在运行的进程所产生的。

2. 通常,软中断是一些对I/O的请求。这些请求会调用内核中可以调度I/O发生的程序。对于某些设备,I/O请求需要被立即处理,而磁盘I/O请求通常可以排队并且可以稍后处理。根据I/O模型的不同,进程或许会被挂起直到I/O完成,此时内核调度器就会选择另一个进程去运行。I/O可以在进程之间产生并且调度过程通常和磁盘I/O的方式是相同。

3. 软中断仅与内核相联系。而内核主要负责对需要运行的任何其他的进程进行调度。一些内核允许设备驱动的一些部分存在于用户空间,并且当需要的时候内核也会调度这个进程去运行。

4. 软中断并不会直接中断CPU。也只有当前正在运行的代码(或进程)才会产生软中断。这种中断是一种需要内核为正在运行的进程去做一些事情(通常为I/O)的请求。有一个特殊的软中断是Yield调用,它的作用是请求内核调度器去查看是否有一些其他的进程可以运行。

问题解答:

1. 问:对于软中断,I/O操作是否是由内核中的I/O设备驱动程序完成?

答:对于I/O请求,内核会将这项工作分派给合适的内核驱动程序,这个程序会对I/O进行队列化,以可以稍后处理(通常是磁盘I/O),或如果可能可以立即执行它。通常,当对硬中断进行回应的时候,这个队列会被驱动所处理。当一个I/O请求完成的时候,下一个在队列中的I/O请求就会发送到这个设备上。

2. 问:软中断所经过的操作流程是比硬中断的少吗?换句话说,对于软中断就是:进程 ->内核中的设备驱动程序;对于硬中断:硬件->CPU->内核中的设备驱动程序?

答:是的,软中断比硬中断少了一个硬件发送信号的步骤。产生软中断的进程一定是当前正在运行的进程,因此它们不会中断CPU。但是它们会中断调用代码的流程。

如果硬件需要CPU去做一些事情,那么这个硬件会使CPU中断当前正在运行的代码。而后CPU会将当前正在运行进程的当前状态放到堆栈(stack)中,以至于之后可以返回继续运行。这种中断可以停止一个正在运行的进程;可以停止正处理另一个中断的内核代码;或者可以停止空闲进程。

先说说环境

1.硬件:DELL R410

2.网卡:板载1000M BCM5709

2.OS: RHEL 5.5 x86_64

3.KERNEL: 2.6.18-194.el5

所出现的问题

1.网卡毫无征兆的down掉,而且没有任何log信息

2.当流量增大时,不到理论上限的1/3时机器出现网络延迟严重,伴随大量的丢包

3.机器的cpu软中断不均衡,只有1个cpu处理软中断,并且该cpu的软中断周期性的达到100%

4.内外网网卡做nat丢包数据量不一致,差别很大,不在同一个数量级

想必之一个问题,大部分使用bcm网卡,rhel 5.3以后得机器都会遇到这种情况,网上的资料比较的多,我也不多啰嗦了,直接升级网卡驱动就可以解决了。第二,三,四其实是同一个问题都是由于网卡中断过多,cpu处理不过来(准确的说,cpu分配不均衡,导致只有一个cpu处理,处理不过来),引起丢包,那么为什么两个网卡丢包的数量级不一样呢,下面从原理上进行解释,既然是做nat多出口,那么就有大量的路由信息,是一个网络应用,当一个数据包请求nat时,数据包先被网卡驱动的数据接收,网卡收到数据时,触发中断。在中断执行例程中,把skb挂入输入队列,并触发软中断。稍后的某个时刻,当软中断执行时,再从该队列中把skb取下来,投递给上层协议。

如果在这个过程当中cpu没有及时处理完这个队列导致网卡的buffer满了,网卡将直接丢弃该数据包。这里牵涉到2个队列,一个是tx,一个是rx,它的队列的大小默认都是255,可以通过ethtool -g eth0(你指定的网卡),为了防止丢包,当时我通过ethtool -G eth0 rx 把它调大了,但是调大以后,还是杯水车薪啊,通过ethtool -S eth0 |grep rx_fw_discards,发现数值还是不停的在增长,也就是说还在不停的丢包,cpu处理不过来,这时候找到网上有人在利用lvs时也遇到这个问题,cpu软中断分配不均衡,只有一个cpu处理软中断的问题,网上的资料五花八门,有建议使用修改设备中断方式。即通过修改设置中断/proc/irq/${网卡中断号}/p_affinit这时候,我也修改过,没有什么实质的效果,

从官方的bug报告,

,其中提到rhel5.6已经修复了这个bug,这其中也提到目前我们的版本可以升级内核到kernel-2.6.18-194.3.1.el5可以解决这个问题。

红帽子官方修复报告中的说明如下:

,我们升级了这个内核算是解决单核处理软中断的问题,升级后各个cpu已经能够平均的分配这个软中断,也不丢包了,那么为什么cpu处理不过来这个软中断呢,数据量并不是特别的大啊,上层应用接到这个数据包后,通过路由协议,找到某个出口给nat出去,找nat出口是需要查找路由表,查询路由表是一件很耗时的工作,而每一个不同源地址,不同目的地址的数据包都得重新查找一次路由表,导致cpu处理不过来,为了提高路由查询的效率。Linux内核引用了路由缓存,用于减少对路由表的查询。Linux的路由缓存是被设计来与协议无关的独立子系统,查看路由缓存可以通过命令route -Cn,由于路由缓存当中是采用hash算法进行才找,它的查找速度非常之快,既然是cache就有超时这一概念。系统默认为10分钟,可以通过这个文件进行查看和修改/proc/sys/net/ipv4/route/secret_interval。而当路由缓存当中未找到或者已经超时的路由信息才开始查找路由表,查询到的结果保存在路由缓存中。如果路由表越大,那么查询的时间就越长,一个新的连接进来后或者是老连接cache超时后,占用大量的cpu查询时间,导致cpu周期性的软中断出现100%,而两个网卡丢包的情况来看不均衡也是因为用户的数据包是经过其中一个网卡进来后查询路由表耗时过长,cpu处理不过来,导致那块网卡的队列满了,丢包严重。当然在路由表变动不大的情况下可以加大cache的时间,修改上述内容后,从我监测的情况来看,扛流量能力得到了大大的提升。

linux内中断与外中断区别的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于linux内中断与外中断区别,Linux内中断与外中断的异同,AVR单片机中,举例说明什么是外部中断和内部中断。说明外部中断(INT0和INT1)有哪几种触发方式?,linux 内核软中断 是在中断状态吗的信息别忘了在本站进行查找喔。


数据运维技术 » Linux内中断与外中断的异同 (linux内中断与外中断区别)