关于软中断

软中断及tasklet <!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } --> 我们前面在”中断处理”一节提到,在由内核执行的几个任务之间有些不是紧急的的;在必要情况下它们可以廷迟一段时间。回忆一下,一个中断处理程序的几个中断服务 阅读详情

到底什么是软中断,在提这个问题的时候你理解什么是中断了吗?我不准备在这里解释这些概念。同样的软中断,不同的操作系统实现是不一样的,为什么不一样, 这是操作系统的总体设计理念决定的,比如:中断线程化实际上并不是什么大部了的,当你知道了那个内核对进程和线程有偏爱时,你就知道设计者实际想把什么都 往线程靠拢,于是把中断也线程化就不足为奇了,执行绪中断化也是同样的道理,因为设计者想把什么都想成中断,这样更易于实现完全异步操作系统,但是为何不 把线程也中断化呢?因为:1. 进程/ 线程是一个古老的概念,人都是有惰性的,难以改变已经成型的东西,更何况消灭它呢;2. 我们讨论的系统内核,内核中断 化就已经完成了设计,而进程/ 线程都是用户空间的概念,内核仅仅是个管理的东西,我们要管理的是进程/ 线程,而不是让它们来参与管理系统(unix /linux 中,它确实参与了管理);3. 这个问题很较真,没有意义。以下是一些论调:
/*
开始
对比一下两本书的同一段落
【4.4BSD 操作系统设计与实现】:
实 现低优先级处理的机制被称作软件中断。一般来说,都是由一个高优先级的中断创建一个将在低优先级中完成的工作队列。在把工作请求放到队列中之后,高优先级 的中断会把这些请求安排在某个低优先级中运行。当机器的优先级低于那个低优先级之后,就会产生一个中断来调用所需的函数。如果在处理请求期间又来了一个高 优先级的中断,处理过程就会像任何其它的低优先级任务一样被抢占。在某些架构上,前述中断就是由软件指令产生的真实的硬件陷阱。而其它的一些架构则通过在 恰当的时候监视由中断处理程序设置的标志并直接调用请求处理函数的方式来实现同样的功能。
【FreeBSD 操作系统设计与实现】:
实现低 优先级处理的机制被称作软件中断。一般来说,都是由一个高优先级的中断创建一个将在低优先级中完成的工作队列。和FreeBSD5.2 中的硬件设备一样, 每个软件中断都有一个与之相关联的进程上下文。软件中断进程的调度优先级一般比设备驱动程序进程低,但却比用户进程的优先级高。只要有硬件中断到达,和设 备驱动程序关联的进程就会获得最高优先级,并被调度运行。如果没有设备驱动程序进程处于可运行状态,优先级最高的软件中断进程就会被调度运行。如果没有软 件中断进程处于可运行状态,就会运行优先级最高的用户进程。如果在一个软件中断进程或者用户进程正在运行的时候来了一个中断并使其设备驱动程序进程处于可 运行状态,调度程序将会抢占软件中断或用户进程来运行设备驱动程序进程。
在非中断线程化的 OS 中,如果把响应中断的所有工作都在 ISR 中完成,系统是无法忍受的,我们要做的是在 ISR 中尽量的减少代码,只做一些必要性的工作,如 in / out 操作,把一些其他不必要在 ISR 中工作放到其他地方,比如数据的处理,这也就是软中断目的所在。其实即使在中断线程化的 OS 当中(如:SOLARIS )也一样有软中断,但这里的软中断含义和那种推迟调度不是一个概念了。以下仅针对此帖题目举例说明硬件中断如何触发软中断,关于 如何注册软中断和注册步骤就不说了。这里所说的软中断是与题目相关的。
    
在 NT KERNEL 中把软件运行环境又分为三个软件中断 IRQL 等级,DISPATCH_LEVEL ,APC_LEVEL ,PASSVIE_LEVEL 。系统提供的 DPC 是为了处理硬件中断后续工作提供的一种机制,DPC 与 Linux Kernel 提供的基于 tasklet 实现的 BottomHalf 作用上有些相似,但又不一样。在使用 DPC 处理硬件中断后续的工作前,需显示调用相关的 kernel api 注册 DPC 。关于硬件中断如何触发 DPC 调用,可以看 HalEndSystemInterrupt() 这个函数,在这个函数中,首先确定没有其他嵌套硬件中断后(没有高于 DPC_LEVEL 的 IRQL ),把 IRQL 降低,并判断是否有 DPC 调用(之前使用 IoRequestDpc() 向系统注册的 DPC 回调函数,当把 DPC 回调函数插入DPC LIST 后,系统调用 HalRequestSoftwareInterrupt() 设置当前 IRQL 为 DPC_LEVEL ,如果当前有硬件级的 IRQL 高于 DPC_LEVEL 则 pending DPC ),如果有则设置 IRQL 为 DPC_LEVEL 并调用 KiDispatchInterrupt() 处理之前注册的 DPC 回调函数。KiDispatchInterrupt() 函数本身是在 IRQL == DPC_LEVEL 上运行的,它同样是处理线程调度的主函数。也就是说 DPC 调用点不光是在所有硬件ISR 处理完成后调用 DPC 。还有是处理任务调度时也会判断是否需要执行 DPC 。这里注意,DPC 与 DPC_LEVEL 不是一回事,DPC 回调函数运行级别在 DPC_LEVEL ,但并不是说所有 DPC_LEVEL 级别都是要运行 DPC 回调函数的。在非 SMP 环境下spinlock 的实现就是简单的提升当前 IRQL 为 DPC_LEVEL ,因为在这个级别的
IRQL
下所有其他软件级别运行的代码都将被阻塞,所以说线程调度主函数运行在这个级别是不会被任何线程抢占的,另DPC_LEVEL 虽然不是中断上下文,但在这个级别下,任何引起睡眠的机制都将导致系统崩溃。扯的有点远了。再简单说下 APC(
Asynchronous Procedure Call)
,故名思意,既然是“ 异步过程调用” 那么当前执行环境很可能是任意线程上下文。其实到了 APC 这里就跟硬件中断扯不上边了,虽然是这样系统还是把 APC 实现也定位为一种软中断,APC 运行在 APC_LEVEL 级别(同样系统调用 HalRequestSoftwareInterrupt() 函数设置当前IRQL 为APC_LEVEL )。关于如何触发 APC 可以去看一些读/ 写函数,当一个读/ 写函数设置了异步标志时,有几种情况(因为是异步的),首先说一下触发条件,条件是:“ 系统处理的当前线程是调用者线 程且 IRQL 小于 APC_LEVEL 时从当前线程 APC 队列里取出 APC 回调函数并把 IRQL 提升到 APC_LEVEL 进行调用” 。继续看这几种情况,如果系统当前处理线程不是调用者者线程,则清除 APC_LEVEL 标志,并将此 APC (回调函数)插入调用者线程的 APC 列然后返回。如果系统当前处理线程正是调用者线程,那么判断当前 IRQL 是否高于 APC_LEVEL ,如果高于则插入调用者线程 APC 队列,此次 APC 中断被记录并返回。如果系统当前处理线程是调用者线程且 IRQL 小于 APC_LEVEL 则满足调用条件,APC 回调函数立刻被调用。处理 APC 的调用点是在 syscall 返回时检查。
    
在 Linux Kernel 里引入 softirq 机制后,使用 tasklet 来实现 Bottom Half 。tasklet 也是 softirq 的一种应用,在使用 Bootom Half (tasklet )处理硬件中断后续工作前,需显示调用相关的 kernel api 注册 Bootom Half (tasklet )。关于硬件中断如何触发 softirq ,可以看 do_IRQ() 这个函数,这个函数在处理完设备驱动程序调用 request_irq() 注册的 ISR 后,会接着调用 irq_exit() ,在irq_exit() 中会检测是否注册了 softirq 回调函数,且在确定所有硬件中断都返回后调用 do_softirq() ,在这个函数当中会遍历软中断向量表,并调用相应的回调函数,被调用的函数就是 tasklet 注册的回调函数,也就是你注册的 Bottom Half 。上面只是针对硬件中断而言,其实处理软中断的调用点,不光是在硬件中断后触发,还有一些地方也调用了 do_softirq() 。如在任务调度中 schedule() 函数里也会判断是否需要执行软中断。还有在 syscall 调用时也有判断是否需要执行软中断的地方。软中断的运行环境同样是中断上下文,在中断上下文中任何引起睡眠的机制都将导致系统崩溃。
    
在 SOLARIS Kernel 中,有很大一部分硬件中断被线程化,如磁盘和网络中断,包括时钟中断。实现中断上下文可阻塞。被线程化的中断,与普通线程共用一个 dispatcher 。中断线程使用区别于 TS/IA/RT 调度等级的优先级,即全局优先级最高的等级。我个人认为在这种响应硬件中断时可阻塞的中断线程化的处理机制中无需提供像 DPC ,Bottom Half 这种机制,这也是跟以上两种非中断线程化 OS 主要区别。以上两种 OS 的中断处理机制,是为了不让在 ISR 中处理过多耗时操作,而提供了一个系统回调函数接口,把那些相对耗时的处理操作放在回调函数中延迟调用。而现在中断线程化并可阻塞了,我完全可以创建一个 中断线程,所有处理工作由系统负责,这样就无需再提供这种回调函数的接口了。既然不需要 DPC / tasklet 的Bootom Half 的这种推迟机制那么在 SOLAIRS 内核中软中断的实现自然也就不一样,它本身也是作为一种中断线程形式存在。关于软中断(softint )的调用可以查看 interrupt.s 的代码。在中断处理的入口中首先判断了是否为软中断调用 T_SOFTINT 。如果是,则跳转到 dosoftint() 去执行,首先会判断如果有比自身更高级的 pending 软中断,则直接返回。如果没有则判断当前处理线程优先级比自身高的话马上返回。如果可以处理当前软中断则先 lock BUS 防止其他CPU 重入这个软中断,设置当前 IPL 为软中断级。然后比较当前要中断的线程是否是一个中断线程,如果不是则再继续判断是否要设置时间片。如果需要则进行设置。如果当前是中断线程,则没有以上 的步骤。然后就是中断当前线程,并使用被中断线程的 LWP 。接下来保存被中断的线程,切换到新软中断线程运行,继续使用av_dispatch_softvect() 函数来执行被注册到 struct autovec 结构里的软中断
回调函数。等到调用完成后,退出软中断线程返回。以上步骤是在没有更高级的硬件中断线程在运行。如果当前有更高级 别的硬件中断正在执行的话,那么会在处理完硬件中断后无条件的跳转到软中断处理中执行。注意,这里没有判断。从以上流程可以看出软中断是有优先级的,即可 以进行抢占。软中断的调用是无条件调用的,即我可以直接显示的调用。这样我们可以看出系统在处理软中断时,从处理机制来讲是与硬中断平级的,当然有优先级 之分。这也意味着与 DPC 和 Bootom Half 这种被动调用机制有这明显的不同。之所以设计成可以直接显示调用,应该是为了某种性能调优而考虑的。在 SOLAIRS 的解释中,软中断是为一些伪设备所提供的。
结束*/
    
从上可以看出,linux 是多么... 啊,它既有nt 内核软中断的影子,也有unix 中断线程化的影子(在软中断执行时间超过一个阀值的时候,他就唤醒软中断线程,将之线程化,以线程上下文执行),这样,linux 包含了一种哲学,一种让人捉摸不透的哲学。

 

Fluent实战——残差震荡分析与收敛优化策略 本文深入探讨了Fluent仿真中残差震荡的成因与优化策略。残差震荡是流场物理或数值问题的关键信号,文章系统分析了网格质量、边界条件、物理模型非定常性及求解设置四大主因,并提供了库朗数与松弛因子的调参心法,以及针对超音速流、共轭传热等典型场景的实战优化方案,旨在帮助用户有效提升计算收敛性与结果可靠性。 阅读详情

相关推荐

Redis【实战篇】---- 分布式锁-redission

重入问题:重入问题是指 获得锁的线程可以再次进入到相同的锁的代码块中,可重入锁的意义在于防止死锁,比如HashTable这样的代码中,他的方法都是使用synchronized修饰的,假如他在一个方法内,调用另一个方法,那么此时如果是不可重入的,不就死锁了吗?所以可重入锁他的主要意义是防止死锁,我们的synchronized和Lock锁都是可重入的。不可重试:是指目前的分布式只能尝试一次,我们认为合理的情况是:当线程在获得锁失败后,他应该能再次尝试获得锁。

是微风,是晚霞,是无可替代 1万+

中断和优先级

《CM3权威指南》讲解的是Cortex-M3内核的整个体系,例如指令集、异常、 MPU等,《CM3编程手册》 中则是关于STM32F10/20/21/L1系列使用到的Cortex-M3的内容。换句话说《CM3编程手册》 是《CM3权威指南》的一个子集,本章内容就是参考这两个手册,对于本章没提到的内容,读者可自行阅读这两个手册扩展学习。 Cortex-M3内核有256种异常和中断,其中编号1~15是系统异常, 16~256是外部中断所如此多的中断, 导致了一些新问题。 比如两个中断同时发生,应该先执行哪个中断

qq_56926420的博客 8278

Flink 作业报错——TaskManager连接不上

Flink 作业报错——TaskManager连接不上

lm223的博客 1900

【翻译】运行于x86机器上的FreeBSD的PCI中断

来源http://people.freebsd.org/~jhb/papers/bsdcan/2007/article/article.html 摘要   在拥有多个独立设备的计算机里一个重要的元素是一个设备通知cpu它需要通过中断引起注意的能力。操作系统可见的对于pci设备的中断技术是非常复杂的,特别是在x86 pc系统上。这篇文章会涉及PCI INTx中断在x86上实现的多种方式以及系...

weixin_30492601的博客 177

PyTorch转ONNX遇到算子不支持?3种实战解决方案+TensorRT适配技巧

本文针对PyTorch模型导出ONNX时常见的算子不支持问题,提供了从诊断到解决的完整实战指南。首先讲解如何精准定位错误根源,随后详细介绍了三种核心解决方案:注册缺失的符号映射、实现自定义算子,以及为TensorRT开发插件的终极落地方案。文章还分享了构建稳健部署流水线的工程化实践,帮助开发者系统性地解决模型部署中的算子兼容性挑战。

fern8的博客 842

大模型-高通qnn基础

提供较低级别、高度可定制的统一API,通过单独的库加速所有AI加速器核心上的AI模型, 可以直接用于针对特定的加速器核心或从流行的运行时(包括Qualcomm Neural Processing SDK、TensorFlow Lite和ONNX运行时)委派工作负载。一个支持异构计算、系统级配置的一体化SDK,旨在将AI工作负载引导到我们平台上的所有加速器核心。为开发人员提供灵活性,包括核心间协作支持和其他高级功能。是一个为训练好的神经网络模型提供高级量化和压缩技术的库。

点滴的岁月 4088

Linux内核对中断函数的要求

1.linux内核对中断处理函数的要求 明确:CPU资源给进程,软中断,硬件中断使用; 明确:在linux系统中,硬件中断的优先级高于软中断,软中断的优先级高于进程; 明确:优先级是指某个任务获取CPU资源的能力; 明确:在linux系统,硬件中断无优先级;软中断有优先级;进程有优先级; 明确:在linux系统,任务分中断和进程 中断上下文:中断处理的整个流程,过程; 进程上

爱锻炼的程序员 1291

vscode中创建vue快捷键

1.安装Vetur插件(扩展里面直接搜) 2.vscode 界面里面左上角选则 文件=> 首选项=> 用户代码片段=>新建全局代码片段=>在输入框中新建名称为vue.json 3.删除里面的注释,当然你也可以留着,把下面的代码粘贴进去! { // Place your 全局 snippets here. Each snippet is defined under a snippet name and has a scope, prefix, body and // descri

Leon_940002463的博客 3207

【Linux 中断管理机制】

无

weixin_43300893的博客 1545

小秋SLAM入门实战ubuntu所有文章汇总

ubuntu 终端如何停止快速打印的输出以及恢复命令 ubuntu 终端如何快速打开当前路径下的图形化窗口界面? killall -9用途用法 ps -xu | grep这个命令的用途 linux 下 top命令显示的是内存是堆内存吗? zip分割和合并 关闭除当前 GNOME 终端窗口以外的所有其他 GNOME 终端窗口 如何在安装系统后设置短密码 【如何使用getrusage获取消耗的CPU时间和进程使用的最大物理内存】 【webots安装使用教程】 Linux系统下查看当前运行的进程和线程的几种方法

小秋 AI SLAM 入门实战教程 1402

DTI-ALPS 指标计算(附代码),评估脑类淋巴系统功能

DTI-ALPS 指标计算(附代码),评估脑类淋巴系统功能

xxx 1048

linux 内核软中断介绍

inux 内核软中断介绍

一叶知秋的博客 1581

Cesium初级开发教程之三十:Primitive集合

教程示例网站:https://thomaz529.github.io。

484

软中断介绍

软中断(Soft Interrupt)是一种由操作系统设计并执行的软件机制,它不是由硬件直接触发,而是由软件显式调用或触发的一种中断类型。软中断主要用于处理延迟执行的任务或轻量级异步任务,以减少对实时性的影响。因为它们的运作方式与上文描述的中断类似,但完全是用软件实现的,所以称为软中断(software interrupt)或softIRQ。通常软中断的优先级低于硬件中断,但高于普通进程调度。

congchp的博客 1839

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

认真聊聊中断(软中断)

Linux操作系统中断之软中断

wq_0708的博客 3740

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

什么是软中断

计算机中断是系统响应硬件请求的异步机制,分为硬中断(快速处理硬件请求)和软中断(延迟处理复杂任务)。硬中断会打断当前进程,可能导致中断丢失;软中断通过内核线程执行,解决长时间任务问题。Linux系统通过/proc/softirqs监控软中断类型和分布,top命令可查看CPU软中断负载。网络高负载时,NET_RX中断率会显著上升,可用tcpdump分析流量来源。中断机制提高了系统并发能力,但需平衡响应速度与稳定性。

LUCIAZZZ的博客 1220

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Linux软中断_复习

硬中断(如键盘中断)需要CPU开启中断才能被响应,关中断状态下,硬件中断请求(IRQ)会被暂时挂起,无法进入中断处理函数,因此系统对硬件设备的响应会变得极慢甚至无响应。操作是非原子的(本质是“读-改-写”三步),多CPU同时操作会导致计数丢失(如两个CPU同时读旧值,修改后写回,实际只增加1而非2)。是内核提供的主动调度点,用于允许优先级更低的进程(即使优先级低)获得运行机会。会尝试调度,导致系统死锁(中断上下文无法调度,永远等待锁释放)。软中断处理函数的执行上下文可能是中断上下文(不可调度),而。

C/C++ 1344

硬中断、软中断详解

硬中断、软中断详解

papaya的博客 4257

什么是软中断?

之所以综上可以知道内核维护了一个*struct softirq_action类型的软中断接口数组,而软中断的状态则是由前面的 * irq_cpustat_t 类型的数组管理,由定义可以知道状态是和CPU关联的,表示某一个CPU上的软中断状态。注意软件中断的处理过程对软中断连续执行的时间进行了限制其实是有原因的,因为上述软中断处理部分的代码执行机会有可能在中断上下文irq_exit()具体的调用链就是irq_exit()->invoke_softirq()->wakeup_softirq()如下(

m0_74282605的博客 3341

Linux 中断原理之软中断

软中断,顾名思义软件触发的中断。但这个解释又很容易被误解为"通过软件指令触发的(硬)中断"。其实这里说的软中断只是实现硬件中 断处理程序下半部的方法之一。(其他两种时现方法是tasklet 和工作队列, tasklet基于软中断)。 作为中断的下半部处理程序,其本质就在于软中断程序运行的时,系统可以继续响应硬件中断。 软中断一般会在硬件中断处理程序(上半部)退出时开始执行, 一个软中断不会抢占另外一个软中断,唯一可以抢占软中断的是中断处理程序 。我们都知道硬件中断有中断向量表,其实软中断也采用了类似的概念。

buls的博客 4682

Linux 之软中断 深度分析

smpboot_thread_fn 这个函数是调用的核心,通过上面红色标注的函数进行判断,如果有softirq_pending,就会调用 ht->thread_fn(td->cpu). 回到 softirq_threads这个实例,就可以知道调用softirq_threads函数。通过上面分析:通常情况下软中断执行在中断上下文中,硬中断结束之后会立马执行软中断,为什么说是通常情况下运行在中断上下文而不是一定运行在中断上下文?中断上半部就是现在内核中的硬中断处理程序,可以参考我的另一篇文章。

z20230508的博客 3152

CPU软中断小结

关于中断,我们可以理解为当使用键盘输入一段文字到操作系统中,操作系统收到这样请求后会打断当前正在运行的进程,然后调用系统内核中的中断处理程序来解决这个插入的请求。软中断的诞生是为了解决中断导致某些请求无法实时响应进而丢失的问题。举个例子,我们的计算机收到一个网络请求,计算机打断了当前正常运行的进程,进而处理这个请求。假如这个请求是一个大文件上传的请求,所以处理时间会非常的长。我们都知道,当操作系统处理一个中断任务时,会临时关闭中断。

禅与计算机程序设计的艺术 2111

Linux内核软中断分析

类型在编译时确定(如网络、定时器等),无法动态添加新类型。

m0_74186706的博客 1158

中断及软中断

一、中断一、中断。

m0_74186706的博客 1257

软中断

最近,某团外卖被爆出大数据杀熟,所谓的大数据杀熟指的是平台利用户的数据,分析你是否是钱多的人,或者是否是不纠结价格的人,如果是,那么你买同样的物品会比普通用户贵一点,一般这种没有特地去对比价格是很难发现的,所以平台就利用了这点额外赚一些钱。说来很可笑,我们作为平台的资深用户,竟然被平台背后偷偷捞一笔。 不过,大数据杀熟早已是屡见不鲜的事情了,事实上,几乎所有大平台都存在这种现象,没办法,这就是真实的互联网。 刹车,大数据杀熟的话题就说到这了,我们还是回归到今日的技术主题:什么是软中断?。 中断是什

是小木呀 1295

使用软中断

    软中断保留给系统中对时间要求最严格以及最重要的下半部使用。目前,只有两个子系统---网络和SCSI直接使用软中断。此外,内核定时器和taskelet都是建立在软中断上的。对于时间要求严格并能自己高效完成加锁工作的应用,软中断会是正确的选择。     怎样使用软中断呢? 1.分配索引 在编译期间,可以通过中定义的一个枚举类型来静态声明软中断。索引号小的软中断在索引号大的软

qinzhonghello的专栏 3431
上一篇: Linux 与 Windows 高速缓存处理机制
下一篇: 中断优先级和中断线程优先级
linuxcode_turing
博客等级 码龄17年 0粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值