软中断分析最近工作繁忙,没有时间总结内核相关的一些东西。上次更新博客到了linux内核中断子系统。这次总结一下软中断,也就是softirq。之后还会总结一些tasklet、工作队列机制。...这样的后果会造成有可能丢失外部中断。于是,linux内核设计出了一种架构,中断函数需要处理的任务分为两部分,一部分在中断处理函数中执行,这时系统关闭中断。...只有在进入了软中断处理过程中之后才会开启硬件中断,如果在软件中断处理过程中有硬件中断嵌套,也不会再次调用软中断,because硬件中断是软件中断处理过程中再次进入的,此时preempt_count已经记录了软件中断...Linux内核就中断方面就必须考虑平衡这三个方面的问题。而下面我要分析的__do_softirq函数就恰似在这三者之间打太极,游刃有余,面面俱到!...调用__local_bh_disable关闭软中断,其实就是设置正在处理软件中断标记,在同一个CPU上使得不能重入__do_softirq函数 6.
linux为了实现这个特点,当中断发生的时候,硬中断处理那些短时间就可以完成的工作,而将那些处理事件比较长的工作,放到中断之后来完成,也就是软中断(softirq)来完成。...(3)中断嵌套 Linux下硬中断是可以嵌套的,但是没有优先级的概念,也就是说任何一个新的中断都可以打断正在执行的中断,但同种中断除外。软中断不能嵌套,但相同类型的软中断可以在不同CPU上并行执行。...调用raise_softirq()来触发软中断。...如果有待处理的软中断,do_softirq()会循环遍历每一个,调用它们的相应的处理程序。 在中断处理程序中触发软中断是最常见的形式。...中断处理程序执行硬件设备的相关操作,然后触发相应的软中断,最后退出。内核在执行完中断处理程序以后,马上就会调用do_softirq(),于是软中断开始执行中断处理程序完成剩余的任务。
linux为了实现这个特点,当中断发生的时候,硬中断处理那些短时间 就可以完成的工作,而将那些处理事件比较长的工作,放到中断之后来完成,也就是软中断(softirq)来完成。...(3) 中断嵌套 Linux下硬中断是可以嵌套的,但是没有优先级的概念,也就是说任何一个新的中断都可以打断正在执行的中断,但同种中断 除外。...调用raise_softirq()来触发软中断。...如果有待处理的软中断, do_softirq()会循环遍历每一个,调用它们的相应的处理程序。 在中断处理程序中触发软中断是最常见的形式。...中断处理程序执行硬件设备的相关操作, 然后触发相应的软中断,最后退出。内核在执行完中断处理程序以后,马上就会调用 do_softirq(),于是软中断开始执行中断处理程序完成剩余的任务。
软中断的引入 软中断的出现和linux系统对中断的划分是分不开的。...linux系统将整个中断处理过程分为了两部分,分别为上半部(Top Half)和下半部(Bottom Half),之所以要这样分是因为关闭中断的时间不能过长,也就是在关闭中断期间尽可能少干事,否则影响整个系统的性能...所以linux系统将中断处理分为两部分,在上半部全程关闭中断,下半部打开中断。而在上半部主要干一些和硬件有关的操作,速度快,在下部分做一些耗时的操作。这样一来既能保证系统效率又能处理各种中断。...那linux如何判断软中断是否发生呢?...B: 根据注释, 如果当初处于中断上写文中(硬+软+NMI), 直接返回。 如果不是就调用wakeup_softirqd来唤醒本cpu上的内核线程。
经常有朋友问起软中断的问题......话说我干了这么多年,还从未在VxWorks领域见过这个词儿,孤陋寡闻了 上网搜了一下,软中断应该是Linux的softirq吧,其典型应用就是中断的bottom half。...关于中断,这是嵌入式领域的一个重点词汇,每个OS都支持,从名字来看,肯定是跟硬件有关的。但ISR执行时间过长,就会带来很多麻烦,所以在使用时都会有很多限制。...除了这些限制,不同的OS还提出了不同的solution,例如Linux的这个软中断。既然名字里带个"软",就是用软件(内核线程?)...例如,为什么ISR里可以调用pipe的write()呢?
这对于时间苛刻的应用来说,这是一个很重要的属性,尤其是那些要求中断请求必须在毫秒级别响应的应用。 Linux2.6内核使用两种手段满足这项挑战:软中断和tasklet,还有工作队列。...2 软中断 Linux2.6内核中,软中断的数量比较少。对于多数目的,这些tasklet足够了。因为不需要考虑重入,所以简单易用。...事实上,只使用了6类软中断,如下表所示: 表4-9 Linux2.6中使用的软中断 软中断 优先级 描述 HI_SOFTIRQ 0 处理高优先级的tasklet TIMER_SOFTIRQ 1 定时器中断...Linux软中断处理程序总是从索引0开始执行。 2.1 软中断使用的数据结构 软中断的主要数据结构是softirq_vec数组,包含类型为softirq_action的32个元素。...而do_IRQ()函数中,在最后会调用irq_exit()宏,这个宏会引发另一个调用 __do_softirq()的程序执行。这在Linux内核中是禁止的,因为其可延时函数的执行都是串行的。
各种栈的内存位置? 介绍完栈的工作原理和用途作用后,我们回归到 Linux 内核上来。...二、线程栈 从 Linux 内核的角度来说,其实它并没有线程的概念。Linux 把所有线程都当做进程来实现,它将线程和进程不加区分的统一到了 task_struct 中。...中断也是如此,当系统收到中断事件后,进行中断处理的时候,也需要中断栈来支持函数调用。由于系统中断的时候,系统当然是处于内核态的,所以中断栈是可以和内核栈共享的。...X86 上中断栈就是独立于内核栈的;独立的中断栈所在内存空间的分配发生在 arch/x86/kernel/irq_32.c 的 irq_ctx_init() 函数中 (如果是多处理器系统,那么每个处理器都会有一个独立的中断栈...而 ARM 上中断栈和内核栈则是共享的;中断栈和内核栈共享有一个负面因素,如果中断发生嵌套,可能会造成栈溢出,从而可能会破坏到内核栈的一些重要数据,所以栈空间有时候难免会捉襟见肘。
Linux 在每个 CPU 上会创建一个 ksoftirqd 内核线程。 softirqs 是在 Linux 内核编译时就确定好的,例如网络收包对应的 NET_RX_SOFTIRQ 软中断。...-5.15.4/net/core/dev.c 注册网卡收发包(RX/TX)软中断处理函数 open_softirq(NET_TX_SOFTIRQ, net_tx_action); open_softirq...硬中断是昂贵的,因为它们不能被中断。即使有中断 合并(稍后详细描述),中断处理程序将独占一个 CPU 内核 完全地。NAPI 的设计允许驱动程序进入轮询模式而不是被 为每个需要的数据包接收硬中断。...在正常操作下,会引发初始硬中断或 IRQ,然后是 SoftIRQ 处理程序 它使用 NAPI 例程轮询卡。轮询例程有一个预算,它决定了 允许代码的 CPU 时间。.../about-linux-smp_affinity https://web.archive.org/web/20200225050436/http://blog.yufeng.info/archives
软中断和实时性 翻译自:Software interrupts and realtime Linux内核的软中断("softirq")机制有些奇怪,在早期的Linux和处理机制下比较晦涩,且仅有极少的内核开发人员会直接接触软中断...在很早以前,Linux存在32个硬中断向量,并为每个向量分配一个设备驱动或相关的任务。...例如,当一个内核子系统调用tasklet_schedule()时,会在对应的CPU上设置TASKLET_SOFTIRQ 比特位,当软中断处理完毕后(开中断),会运行微线程 (tasklet基于软中断)。...;另一种是内核代码(在任何时候)可能会(通过调用如local_bh_enable() 或spin_unlock_bh()函数,这两个函数用于中断保护,防止其他中断混入处理,类似锁机制)重新启用软中断,这样会导致积累的软中断在任意一个进程的上下文中运行...参考: Linux中断 - softirq
相关结构 关键的结构体描述如下所示,可以类比硬件中断来理解。 支持的软中断类型,可以认为是软中断号, 其中从上到下优先级递减。...下面我们看下什么时候进行软中断函数回调? 处理软中断 软中断执行的入口就是 invoke_softirq。...什么是中断线程化处理?上面我们讲到 Linux 内核会为每个 CPU 都创建一个内核线程 ksoftirqd,当需要中断线程化处理的时候,会通过 wakeup_softirqd 唤醒内核线程来执行。...来唤醒内核,即执行 run_ksoftirqd 函数,如果此时有软中断处理请求,就调用 __do_softirq 来进行处理。...在 Linux 内核中有两种 tasklet,一种是高优先级 tasklet,一种是普通 tasklet。
在Linux中,当阻塞于某个慢系统调用的进程捕获一个信号,则该系统调用就会被中断,转而执行信号处理函数,这就是被中断的系统调用。...,函数将返回失败,同时errno被置为EINTR 只有中断信号的SA_RESTART标志有效时,系统调用才会自动重启 下面我们编写代码,分别验证上述几种情形,其中系统调用选择read,中断信号选择SIGALRM...,中断信号由alarm产生。...SA_RESTART标志,使用sigaction的默认处理方式 //act.sa_flag |= SA_INTERRUPT; //SA_INTERRUPT是sigaction的默认处理方式,即不自动重启被中断的系统调用...由于对被中断系统调用处理方式的差异性,因此对应用程序来说,与被中断的系统调用相关的问题是: 应用程序无法保证总是知道信号处理函数的注册方式,以及是否设置了SA_RESTART标志 可移植的代码必须显式处理关键函数的出错返回
软中断通信简介软中断通信是进程间通信的一种常见方式,它基于信号机制,允许不同进程之间进行通信。在软中断通信中,一个进程向另一个进程发送特定的信号,接收进程捕获信号并执行相应的处理。...软中断通信的实现步骤如下:信号发送:发送进程使用kill()函数向接收进程发送信号,信号类型可以自行指定。...signal()函数概述signal()函数是UNIX/Linux系统中用于注册信号处理程序的系统调用。...信号是操作系统中的一种通知机制,用于通知进程发生了某些事件,如接收到外部中断或其他进程发送的信号。...signal()与常见信号SIGINTSIGINT是由键盘生成的中断信号,通常由用户按下Ctrl + C组合键发送给前台进程组的所有进程。
各种栈的内存位置? 介绍完栈的工作原理和用途作用后,我们回归到 Linux 内核上来。...二、线程栈 从 Linux 内核的角度来说,其实它并没有线程的概念。Linux 把所有线程都当做进程来实现,它将线程和进程不加区分的统一到了 task_struct 中。...中断也是如此,当系统收到中断事件后,进行中断处理的时候,也需要中断栈来支持函数调用。由于系统中断的时候,系统当然是处于内核态的,所以中断栈是可以和内核栈共享的。...X86 上中断栈就是独立于内核栈的;独立的中断栈所在内存空间的分配发生在 arch/x86/kernel/irq_32.c 的 irq_ctx_init() 函数中(如果是多处理器系统,那么每个处理器都会有一个独立的中断栈...而 ARM 上中断栈和内核栈则是共享的;中断栈和内核栈共享有一个负面因素,如果中断发生嵌套,可能会造成栈溢出,从而可能会破坏到内核栈的一些重要数据,所以栈空间有时候难免会捉襟见肘。
软中断通信 进程间通信方式有多种,其中软中断通信是一种常见的方式,它基于信号机制,可以在不同进程之间进行通信。...软中断通信的实现方式是,一个进程向另一个进程发送一个特定的信号,该信号被接收进程捕获,并进行相应的处理。...软中断通信的步骤如下: 1)发送进程通过kill()函数向接收进程发送信号,信号类型可以自行指定。...需要注意的是,软中断通信是一种异步通信方式,即发送进程和接收进程之间并不存在直接的同步机制。...因此,在设计使用软中断通信的系统时,需要充分考虑这种异步机制所带来的影响。 signal() 概述 signal()函数是UNIX/Linux中的一个系统调用,用于注册信号处理程序。
2 概念 2.1 软中断概念 linux的中断会打断CPU当前的工作,中断一般都设计的短小精悍。...但是也为了解决中断处理程序执行时间过长和中断丢失的问题,Linux的中断分为两个阶段: 上半部用来快速处理中断,它在中断禁止模式下运行,主要处理硬件相关和时间敏感的工作 下半部用来延迟处理上半部未完成的工作...而下半部被软中断信号唤醒后,需要从内存中找到网络数据,再按照网络协议栈,对数据进行逐层解析和处理,直到把它送给应用程序。...不过要注意的是,软中断不只包括了刚刚所讲的硬件设备中断处理程序的下半部,一些内核自定义的事件也属于软中断,比如内核调度和RCU 锁(Read-Copy Update 的缩写,RCU是 Linux 内核中最常用的锁之一...TASKLET 是最常用的软中断实现机制,每个 TASKLET 只运行一次就会结束 ,并且只在调用它的函数所在的 CPU 上运行。
前面的几篇文章里讨论过了进程上下文切换和系统调用对系统性能的影响,我们今天再来看另外一个CPU吃货,那就是软中断。...所以现代的Linux又发明了软件中断,配合硬中断来处理网络IO。硬中断你可以理解只是个收包的,把包收取回来放到“家里”就完事,很快就能完成,这样不耽误CPU响应其它外部高优先级的中断。...而软中断优先级较低,负责将包进行各种处理,完成从驱动层、到网络协议栈,最终把处理出来的数据放到socker的接收buffer中。...让我们将他们进行一个简单的对比: 1)和系统调用开销对比 《深入理解Linux内核-第五章》开头的一句话,很形象地把中断和系统调用两个不相关的概念联系了起来,巧妙地找到了这二者之间的相似处。...软中断和系统调用一样,都是CPU停止掉当前用户态上下文,保存工作现场,然后陷入到内核态继续工作。
前些天发现XEN虚拟机上的Nginx服务器存在一个问题:软中断过高,而且大部分都集中在同一个CPU,一旦系统繁忙,此CPU就会成为木桶的短板。...在问题服务器上运行「top」命令可以很明显看到「si」存在异样,大部分软中断都集中在 1 号CPU上,其它的CPU完全使不上劲儿: shell> top Cpu0: 11.3%us, 4.7%sy,...了解了这些基本知识,我们可以尝试换一个CPU试试看会发生什么: echo 7 > /proc/irq/45/smp_affinity_list 再通过「top」命令观察,会发现处理软中断的CPU变成了...好消息是Linux支持RPS,通俗点来说就是在软件层面模拟实现硬件的多队列网卡功能。...最后,推荐看看香草总结的一些关于软中断方面的资料和工具,很全面。
领取专属 10元无门槛券
手把手带您无忧上云