首页
学习
活动
专区
工具
TVP
发布

Linux内核中断半部半部的理解

为了在中断执行时间尽量短和中断处理需完成的工作尽量大之间找到一个平衡点,Linux中断处理程序分解为两个半部:顶半部半部。 ?   ...半部几乎做了中断处理程序所有的事情,而且可以被新的中断打断,这也是半部和顶半部的最大不同,因为顶半部往往被设计成不可中断。...尽管顶半部半部的结合能够善系统的响应能力,但是,僵化地认为Linux设备驱动中的中断处理一定要分两个半部则是不对的。如果中断要处理的工作本身很少,则完全可以直接在顶半部全部完成。   ...实现中断半部的三种方法 中断   中断( Softirq)也是一种传统的半部处理机制,它的执行时机通常是顶半部返回的时候, tasklet是基于中断实现的,因此也运行于中断上下文。   ...硬中断中断和信号的区别   硬中断是外部设备对CPU的中断中断中断半部的一种处理机制,而信号则是由内核(或其他进程)对某个进程的中断

1.7K30

Linux 网络中断半部处理

为了避免这种情况出现,Linux 内核把中断处理分为:中断半部中断半部,上半部在关闭中断的情况下进行,而下半部在打开中断的情况下进行。...由于中断半部在关闭中断的情况下进行,所以必须要快速完成,从而避免中断丢失的情况。而中断半部处理是在打开中断的情况下进行的,所以可以慢慢进行。...一般来说,网卡驱动向内核注册的中断处理服务属于 中断半部,如前面介绍的 NS8390网卡驱动 注册的 ei_interrupt 中断处理服务,而本文主要分析网卡 中断半部 的处理。...对于 Linux 内核的中断处理机制可以参考我们之前的文章 Linux中断处理,这里就不详细介绍了。在本文中,我们只需要知道网络中断半部处理例程为 net_rx_action 函数即可。...网络中断半部处理 上面说了,网络中断半部处理例程为 net_rx_action 函数,所以我们主要分析 net_rx_action 函数的实现: static void net_rx_action(

2.2K50
您找到你想要的搜索结果了吗?
是的
没有找到

Linux中断半部实现机制

但是在一些特殊情况下,中断要处理的事情可能是复杂且冗长的,为解决这种问题, 中断上下半部的概念顺势而生。将中断拆成两部分,上半部用来处理紧急的事情;下半部用来处理不紧急的事情。 2....tasklet是以中断形式实现的,中断的优先级仅次于硬件中断,在进入软件中断时,硬件中断会被打开,因此软件中断可被硬件中断打断。 使用: 中断实现服务子函数,优先级高,影响系统执行效率。 a....在退出函数,销毁: tasklet_kill(&kpd_keymap_tasklet); (2) 工作队列方式: 在tasklet方式中,虽然开中断了,期间可处理系统各种中断,但是中断的优先级也会导致其他的线程无法运行...此时选择内核线程来处理下半部:在中断半部将下半部处理函数放入工作队列,且唤醒工作队列线程,然后退出中断。包含下半部的工作队列与APP都有机会执行,不会造成卡顿。...(3) 线程中断:由于工作队列每次只能处理一个中断半部,但是内核支持多线程,因此出现为每一个中断半部开辟一个线程处理。将多个中断的下半部线程分配给多个CPU上执行,提高效率。

3.1K10

Linux 中断机制分析

中断分析最近工作繁忙,没有时间总结内核相关的一些东西。上次更新博客到了linux内核中断子系统。这次总结一下中断,也就是softirq。之后还会总结一些tasklet、工作队列机制。...这样的后果会造成有可能丢失外部中断。于是,linux内核设计出了一种架构,中断函数需要处理的任务分为两部分,一部分在中断处理函数中执行,这时系统关闭中断。...只有在进入了中断处理过程中之后才会开启硬件中断,如果在软件中断处理过程中有硬件中断嵌套,也不会再次调用中断,because硬件中断是软件中断处理过程中再次进入的,此时preempt_count已经记录了软件中断...Linux内核就中断方面就必须考虑平衡这三个方面的问题。而下面我要分析的__do_softirq函数就恰似在这三者之间打太极,游刃有余,面面俱到!...重新设置中断标记为0,set_softirq_pending重新设置中断标记为0,这样在之后重新开启中断之后硬件中断中又可以设置软件中断位。 7. 开启硬件中断 8.

8.6K91

Linux中断半部机制的对比

Linux有以下几种下半部机制: 中断 tasklet workqueue threaded irq  中断服务程序一般都是在中断请求关闭的条件下执行的,以避免嵌套而使中断控制复杂化。...因此,Linux内核的目标就是尽可能快的处理完中断请求,尽其所能把更多的处理向后推迟。...因此,内核把中断处理分为两部分:上半部(tophalf)和下半部(bottomhalf),上半部(就是中断服务程序)内核立即执行,而下半部(就是一些内核函数)留着稍后处理。   ...下半部运行时是允许中断请求的,而上半部运行时是关中断的,这是二者之间的主要区别。   但是,内核到底什时候执行下半部,以何种方式组织下半部?...而且中断里不能调用会阻塞、休眠的函数,这对中断函数的编程是很不利的,所以综合各种因素,我们需要把中断处理任务中的与硬件无关有不太紧急的部分放到进程里面来做。

9610

Linux内核硬中断 中断的原理和实现

linux为了实现这个特点,当中断发生的时候,硬中断处理那些短时间就可以完成的工作,而将那些处理事件比较长的工作,放到中断之后来完成,也就是中断(softirq)来完成。...(3)中断嵌套 Linux下硬中断是可以嵌套的,但是没有优先级的概念,也就是说任何一个新的中断都可以打断正在执行的中断,但同种中断除外。中断不能嵌套,但相同类型的中断可以在不同CPU上并行执行。...硬中断是可屏蔽的,中断不可屏蔽。 硬中断处理程序要确保它能快速地完成任务,这样程序执行时才不会等待较长时间,称为上半部中断处理硬中断未完成的工作,是一种推后执行的机制,属于下半部。...long flags; local_irq_save(flags); local_irq_restore(flags); (2)中断的开关 禁止下半部,如softirq、tasklet和workqueue...(1)定义 中断是一组静态定义的下半部接口,可以在所有处理器上同时执行,即使两个类型相同也可以。

21.3K21

中断中断_中断和硬中断的优先级

linux为了实现这个特点,当中断发生的时候,硬中断处理那些短时间 就可以完成的工作,而将那些处理事件比较长的工作,放到中断之后来完成,也就是中断(softirq)来完成。...(3) 中断嵌套 Linux下硬中断是可以嵌套的,但是没有优先级的概念,也就是说任何一个新的中断都可以打断正在执行的中断,但同种中断 除外。...硬中断处理程序要确保它能快速地完成任务,这样程序执行时才不会等待较长时间,称为上半部中断处理硬中断未完成的工作,是一种推后执行的机制,属于下半部。...long flags; local_irq_save(flags); local_irq_restore(flags); (2) 中断的开关 禁止下半部,如softirq、tasklet和workqueue...(1) 定义 中断是一组静态定义的下半部接口,可以在所有处理器上同时执行,即使两个类型相同也可以。

2.5K40

中断SOFTIRQ

中断的引入 中断的出现和linux系统对中断的划分是分不开的。...linux系统将整个中断处理过程分为了两部分,分别为上半部(Top Half)和下半部(Bottom Half),之所以要这样分是因为关闭中断的时间不能过长,也就是在关闭中断期间尽可能少干事,否则影响整个系统的性能...所以linux系统将中断处理分为两部分,在上半部全程关闭中断,下半部打开中断。而在上半部主要干一些和硬件有关的操作,速度快,在下部分做一些耗时的操作。这样一来既能保证系统效率又能处理各种中断。...linux系统针对下半部(Bottom Half)实现了多种机制,如Softirq, Tasklet, workqueue。...那linux如何判断中断是否发生呢?

2.2K21

Linux内核22-中断和tasklet

这对于时间苛刻的应用来说,这是一个很重要的属性,尤其是那些要求中断请求必须在毫秒级别响应的应用。 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个元素。...这在Linux内核中是禁止的,因为其可延时函数的执行都是串行的。所以,在此需要禁止中断。 清除正在执行的中断对应掩码位。 执行local_irq_enable()使能中断

1.3K30

linux | 网络数据包softirq 中断与CPU

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

2.6K20

中断和实时性

中断和实时性 翻译自:Software interrupts and realtime Linux内核的中断("softirq")机制有些奇怪,在早期的Linux和处理机制下比较晦涩,且仅有极少的内核开发人员会直接接触中断...在很早以前,Linux存在32个硬中断向量,并为每个向量分配一个设备驱动或相关的任务。...一旦线程退出,内核会禁用该中断的上下文,并运行下一个中断,使用这种方式可以减小处理中断的延迟(由于会立即运行下一个中断)。同样重要的是,这种方式将中断和产生该中断的进程绑定到了一起。...TIPS: linux中断按照等级分为了top half和buttom half,在执行top half的时候是关中断的,而在执行buttom half的时候是开中断的(此时可以再次处理中断) softirq...参考: Linux中断 - softirq

2K20

有种中断

Softirq 是内核中常见的一种下半部机制,适合系统对性能和实时响应要求很高的场合,比如网络子系统,块设备,高精度定时器,RCU 等。 相关结构 关键的结构体描述如下所示,可以类比硬件中断来理解。...支持的中断类型,可以认为是中断号, 其中从上到下优先级递减。...下面我们看下什么时候进行中断函数回调? 处理中断 中断执行的入口就是 invoke_softirq。...什么是中断线程化处理?上面我们讲到 Linux 内核会为每个 CPU 都创建一个内核线程 ksoftirqd,当需要中断线程化处理的时候,会通过 wakeup_softirqd 唤醒内核线程来执行。...//打开下半部 __local_bh_enable(SOFTIRQ_OFFSET); ...... } 通过 h->action(h),即执行中断的处理。

81440

高并发的中断半部tasklet实例解析

类似中断半部的tasklet机制对中断处理函数的延迟处理,下半部tasklet也可以应用到tracepoint回调函数上,从而提升回调函数blk_add_trace_rq_insert1的并发处理能力...三、丢失tasklet的原因 针对这个部分下半部tasklet丢失的问题,再次查阅kernel的经典教材,在《Linux Kernel Development 3rd Edition》的8.3.2小节中发现了...经验丰富的同学都知道linux内核代码有2000多万行,其中很多模块的代码实现都十分经典,是一部编程的百科全书。...按照这样的思路,我们不难从内核usb驱动部分找到一段中断半部tasklet的经典使用场景。...从usbatm的代码实例中,我们可以了解到tasklet也是使用了tasklet_init的第三个参数实现了中断半部和下半部之间的参数传递。

1.4K40

深入浅出:Linux设备驱动之中断与定时器

Linux中断处理分为顶半部半部,顶半部完成尽可能少得的比较紧急的功能,往往只是简单的完成“登记中断”的工作,就是将半部处理程序挂到该设备的半部处理队列中去,中断处理机制如下图: ?...2.3 半部机制–实现机制主要有tasklet, 工作队列和中断 (1) tasklet void my_tasklet_func (unsigned long); DECLARE_TASKLET...(与通常说的中断(软件指令引发的中断),比如arm的swi是完全不同的概念) 在linux内核中,用softirq_action结构体表征一个中断,这个结构体包含中断处理函数指针和传递给函数的参数...local_bh_disable() 和 local_bh_enable()是内核中用于禁止和使能中断和tasklet半部机制的函数。...二、定时器/时钟 1、概述 软件意义上的定时器最终依赖硬件定时器来实现,内核在时钟中断发生后检测个定时器释放到期,到期后的定时器处理函数将作为中断半部执行。

3K102

中断通信及signal()解读

中断通信 进程间通信方式有多种,其中中断通信是一种常见的方式,它基于信号机制,可以在不同进程之间进行通信。...中断通信的实现方式是,一个进程向另一个进程发送一个特定的信号,该信号被接收进程捕获,并进行相应的处理。...中断通信的步骤如下: 1)发送进程通过kill()函数向接收进程发送信号,信号类型可以自行指定。...需要注意的是,中断通信是一种异步通信方式,即发送进程和接收进程之间并不存在直接的同步机制。...因此,在设计使用中断通信的系统时,需要充分考虑这种异步机制所带来的影响。 signal() 概述 signal()函数是UNIX/Linux中的一个系统调用,用于注册信号处理程序。

27820

进程通信 中断 signal()解读

中断通信 进程间通信方式有多种,其中中断通信是一种常见的方式,它基于信号机制,可以在不同进程之间进行通信。...中断通信的实现方式是,一个进程向另一个进程发送一个特定的信号,该信号被接收进程捕获,并进行相应的处理。...中断通信的步骤如下: 1)发送进程通过kill()函数向接收进程发送信号,信号类型可以自行指定。...需要注意的是,中断通信是一种异步通信方式,即发送进程和接收进程之间并不存在直接的同步机制。...因此,在设计使用中断通信的系统时,需要充分考虑这种异步机制所带来的影响。 signal() 概述 signal()函数是UNIX/Linux中的一个系统调用,用于注册信号处理程序。

16730

Linux调度系统全景指南(上篇)

因此期望让中断处理程序运行得快,并想让它完成的工作量多,这两个目标相互制约,诞生顶/半部机制。 中断半部分: 中断处理程序是顶半部——接受中断,它就立即开始执行,但只有做严格时限的工作。...能够被允许稍后完成的工作会推迟到底半部去,此后,在合适的时机,半部会被开终端执行。顶半部简单快速,执行时禁止部分或者全部中断中断半部分: 半部稍后执行,而且执行期间可以响应所有的中断。...顶半部只有中断处理程序机制,而半部的实现有中断,tasklet和工作队列等实现方式; 中断 中断作为下半部机制的代表,是随着SMP(share memory processor)的出现应运而生的...中断内核线程 在 Linux 中,中断具有最高的优先级。...2.Linux中断处理过程分成了两个阶段,也就是上半部和下半部: 上半部用来快速处理中断,它在中断禁止模式下运行,主要处理跟硬件紧密相关的或时间敏感的工作,需要快速执行; 下半部用来延迟处理上半部未完成的工作

1.4K20

CPU中断概念与案例

2 概念 2.1 中断概念 linux中断会打断CPU当前的工作,中断一般都设计的短小精悍。...但是也为了解决中断处理程序执行时间过长和中断丢失的问题,Linux中断分为两个阶段: 上半部用来快速处理中断,它在中断禁止模式下运行,主要处理硬件相关和时间敏感的工作 下半部用来延迟处理上半部未完成的工作...(表示数据已经读好了),最后再发送一个中断信号,通知下半部做进一步的处理。...上半部直接处理硬件请求,也就是我们常说的硬中断,特点是快速执行 而下半部则是由内核触发,也就是我们常说的中断,特点是延迟执行 实际上,上半部会打断 CPU 正在执行的任务,然后立即执行中断处理程序。...不过要注意的是,中断不只包括了刚刚所讲的硬件设备中断处理程序的下半部,一些内核自定义的事件也属于中断,比如内核调度和RCU 锁(Read-Copy Update 的缩写,RCU是 Linux 内核中最常用的锁之一

1.3K20

中断会吃掉你多少CPU?

我们没必要啃明白中断的所有原理,但从一名追求性能的开发者的角度来看,我们有必要了解以下问题: 1、一次中断的开销到底多大? 2、你的服务器上被中断吃掉了多少CPU时间?...所以现代的Linux又发明了软件中断,配合硬中断来处理网络IO。硬中断你可以理解只是个收包的,把包收取回来放到“家里”就完事,很快就能完成,这样不耽误CPU响应其它外部高优先级的中断。...中断消耗的CPU周期相对比硬中断要多不少,所以我们本文来重点关注中断的开销。 2 中断的开销估算 前面大致介绍了中断的来龙去脉,好了直接进入本文的主题上,中断开销到底多大。...让我们将他们进行一个简单的对比: 1)和系统调用开销对比 《深入理解Linux内核-第五章》开头的一句话,很形象地把中断和系统调用两个不相关的概念联系了起来,巧妙地找到了这二者之间的相似处。...大家感兴趣的,可以继续阅读《深入理解Linux内核》的-第五章。 根据前文的实验结果,进程上下文切换开销是3us-5us。

1.2K20
领券