首页 > 系统相关 >Linux开发讲课10--- Linux软中断

Linux开发讲课10--- Linux软中断

时间:2024-06-22 22:00:18浏览次数:12  
标签:10 中断 上半部 --- 线程 内核 外卖 Linux CPU

中断是系统用来响应硬件设备请求的一种机制,它会打断进程的正常调度和执行,然后调用内核中的中断处理程序来响应设备的请求。

你可能要问了,为什么要有中断呢?我可以举个生活中的例子,让你感受一下中断的魅力。

比如说你订了一份外卖,但是不确定外卖什么时候送到,也没有别的方法了解外卖的进度,但是,配送员送外卖是不等人的,到了你这儿没人取的话,就直接走人了。所以你只能苦苦等着,时不时去门口看看外卖送到没,而不能干其他事情。

不过呢,如果在订外卖的时候,你就跟配送员约定好,让他送到后给你打个电话,那你就不用苦苦等待了,就可以去忙别的事情,直到电话一响,接电话、取外卖就可以了。

这里的“打电话”,其实就是一个中断。没接到电话的时候,你可以做其他的事情;只有接到了电话(也就是发生中断),你才要进行另一个动作:取外卖。

这个例子你就可以发现,中断其实是一种异步的事件处理机制,可以提高系统的并发处理能力。

由于中断处理程序会打断其他进程的运行,所以,为了减少对正常进程运行调度的影响,中断处理程序就需要尽可能快地运行。如果中断本身要做的事情不多,那么处理起来也不会有太大问题;但如果中断要处理的事情很多,中断服务程序就有可能要运行很长时间。

特别是,中断处理程序在响应中断时,还会临时关闭中断。这就会导致上一次中断处理完成之前,其他中断都不能响应,也就是说中断有可能会丢失。

那么还是以取外卖为例。假如你订了 2 份外卖,一份主食和一份饮料,并且是由 2 个不同的配送员来配送。这次你不用时时等待着,两份外卖都约定了电话取外卖的方式。但是,问题又来了。

当第一份外卖送到时,配送员给你打了个长长的电话,商量发票的处理方式。与此同时,第二个配送员也到了,也想给你打电话。

但是很明显,因为电话占线(也就是关闭了中断响应),第二个配送员的电话是打不通的。所以,第二个配送员很可能试几次后就走掉了(也就是丢失了一次中断)。

软中断

如果你弄清楚了“取外卖”的模式,那对系统的中断机制就很容易理解了。事实上,为了解决中断处理程序执行过长和中断丢失的问题,Linux 将中断处理过程分成了两个阶段,也就是上半部和下半部:

上半部用来快速处理中断,它在中断禁止模式下运行,主要处理跟硬件紧密相关的或时间敏感的工作。

下半部用来延迟处理上半部未完成的工作,通常以内核线程的方式运行。

比如说前面取外卖的例子,上半部就是你接听电话,告诉配送员你已经知道了,其他事儿见面再说,然后电话就可以挂断了;下半部才是取外卖的动作,以及见面后商量发票处理的动作。

这样,第一个配送员不会占用你太多时间,当第二个配送员过来时,照样能正常打通你的电话。

除了取外卖,我再举个最常见的网卡接收数据包的例子,让你更好地理解。

网卡接收到数据包后,会通过硬件中断的方式,通知内核有新的数据到了。这时,内核就应该调用中断处理程序来响应它。你可以自己先想一下,这种情况下的上半部和下半部分别负责什么工作呢?

对上半部来说,既然是快速处理,其实就是要把网卡的数据读到内存中,然后更新一下硬件寄存器的状态(表示数据已经读好了),最后再发送一个软中断信号,通知下半部做进一步的处理。

而下半部被软中断信号唤醒后,需要从内存中找到网络数据,再按照网络协议栈,对数据进行逐层解析和处理,直到把它送给应用程序。

所以,这两个阶段你也可以这样理解:

上半部直接处理硬件请求,也就是我们常说的硬中断,特点是快速执行;

而下半部则是由内核触发,也就是我们常说的软中断,特点是延迟执行。

实际上,上半部会打断 CPU 正在执行的任务,然后立即执行中断处理程序。而下半部以内核线程的方式执行,并且每个 CPU 都对应一个软中断内核线程,名字为 “ksoftirqd/CPU 编号”,比如说, 0 号 CPU 对应的软中断内核线程的名字就是 ksoftirqd/0。

不过要注意的是,软中断不只包括了刚刚所讲的硬件设备中断处理程序的下半部,一些内核自定义的事件也属于软中断,比如内核调度和 RCU 锁(Read-Copy Update 的缩写,RCU 是 Linux 内核中最常用的锁之一)等。

那要怎么知道你的系统里有哪些软中断呢?

查看软中断和内核线程

不知道你还记不记得,前面提到过的 proc 文件系统。它是一种内核空间和用户空间进行通信的机制,可以用来查看内核的数据结构,或者用来动态修改内核的配置。其中:

/proc/softirqs 提供了软中断的运行情况;

/proc/interrupts 提供了硬中断的运行情况。

运行下面的命令,查看 /proc/softirqs 文件的内容,你就可以看到各种类型软中断在不同 CPU 上的累积运行次数:

                ​​​​​​​        

在查看 /proc/softirqs 文件内容时,你要特别注意以下这两点。

第一,要注意软中断的类型,也就是这个界面中第一列的内容。从第一列你可以看到,软中断包括了 10 个类别,分别对应不同的工作类型。比如 NET_RX 表示网络接收中断,而 NET_TX 表示网络发送中断。

第二,要注意同一种软中断在不同 CPU 上的分布情况,也就是同一行的内容。正常情况下,同一种中断在不同 CPU 上的累积次数应该差不多。比如这个界面中,NET_RX 在 CPU0 和 CPU1 上的中断次数基本是同一个数量级,相差不大。

不过你可能发现,TASKLET 在不同 CPU 上的分布并不均匀。TASKLET 是最常用的软中断实现机制,每个 TASKLET 只运行一次就会结束 ,并且只在调用它的函数所在的 CPU 上运行。

因此,使用 TASKLET 特别简便,当然也会存在一些问题,比如说由于只在一个 CPU 上运行导致的调度不均衡,再比如因为不能在多个 CPU 上并行运行带来了性能限制。

另外,刚刚提到过,软中断实际上是以内核线程的方式运行的,每个 CPU 都对应一个软中断内核线程,这个软中断内核线程就叫做 ksoftirqd/CPU 编号。那要怎么查看这些线程的运行状况呢?

其实用 ps 命令就可以做到,比如执行下面的指令:

        ​​​​​​​        

注意,这些线程的名字外面都有中括号,这说明 ps 无法获取它们的命令行参数(cmline)。一般来说,ps 的输出中,名字括在中括号里的,一般都是内核线程。

Linux 中的中断处理程序分为上半部和下半部:

上半部对应硬件中断,用来快速处理中断。

下半部对应软中断,用来异步处理上半部未完成的工作。

Linux 中的软中断包括网络收发、定时、调度、RCU 锁等各种类型,可以通过查看 /proc/softirqs 来观察软中断的运行情况。

标签:10,中断,上半部,---,线程,内核,外卖,Linux,CPU
From: https://blog.csdn.net/qq_42837317/article/details/139888694

相关文章

  • 青岛二中集训日报(D10-D12)
    D9模拟赛.我太菜了.上来直接判定不可做了.其实感觉T1才是那个跳跃性最强的,拿着随机性质找暴力当正解了属于是.T2反倒比较自然,其实就是数位dp,被唬住了没敢细推而已.T3暴力还是很可拿的,转换根的地方有点技巧性,不过也没有那么邪门.总体而言是套吓人但不算难度特别大的题.然......
  • x-s、x-t、x-s-common、x-b3-traceid 签名算法分析记录(2024/6/20)
    【作者主页】:小鱼神1024【擅长领域】:JS逆向、小程序逆向、AST还原、验证码突防、Python开发、浏览器插件开发、React前端开发、NestJS后端开发等等【学习交流】:知识星球:https://t.zsxq.com/gkn0r;vx:studypy1024本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提......
  • 苹果cms10影视网整站源码下载/苹果cms模板MXone Pro自适应影视电影网站模板
    下载地址:苹果cms10影视网整站源码下载/苹果cms模板MXonePro自适应影视电影网站模板模板带有夜间模式、白天晚上自动切换,有观影记录、后台设置页。全新UI全新框架,加载响应速度更快,seo更好,去除多余页面优化代码。MXonePro是一款简约清新,美观大气,单纯的影视模板,没有复杂的页面......
  • SciTech-点焊机-微波炉变压器制作一台1000W电流500A的加强版点焊机;
    用微波炉变压器制作一台加强版点焊机:输出电流500A,功率1000瓦微波炉有大功率全铜变压器。初级线圈由大功率可控硅控制导通时间;次级拆除,用超大粗铜导线绕3圈或数圈,得到低压大功率次级输出,作为点焊能源。常用的微波炉电路图:控制板部分由“低压变压器”输送功率;2.整机大部......
  • C语言程序设计-2 程序的灵魂—算法
    【例2.1】求1×2×3×4×5。最原始方法:步骤1:先求1×2,得到结果2。步骤2:将步骤1得到的乘积2乘以3,得到结果6。步骤3:将6再乘以4,得24。步骤4:将24再乘以5,得120。这样的算法虽然正确,但太繁。改进的算法:S1:使t=1S2:使i=2S3:使t×i,乘积仍然......
  • c语言回顾-联合和枚举
    前言前面讲解了自定义类型-结构体,本节小编将讲解新的自定义类型联合体和枚举。1.联合体1.1联合体类型的声明像结构体一样,联合体也是由一个或者多个成员构成,这些成员可以不同的类型。但是编译器只为最大的成员分配足够的内存空间。联合体的特点是所有成员共用同......
  • 2024-06-22:用go语言,给定一个起始下标为 0 的长度为3的整数数组 nums,根据这些数字构建
    2024-06-22:用go语言,给定一个起始下标为0的长度为3的整数数组nums,根据这些数字构建三角形。如果无法构成三角形,则返回"none";否则根据三角形的边长关系返回对应类型的字符串:equilateral(等边三角形)、isosceles(等腰三角形)或scalene(不等边三角形)。输入:nums=[3,3,3]。输出:"e......
  • 内容安全复习 7 - 对抗攻击与防御
    文章目录概述攻击对抗性攻击的目的攻击的损失函数如何攻击FGSM黑盒与白盒真实世界的攻击防御被动防御主动防御概述动机(1)不仅要在实验室中部署机器学习分类器,也要在现实世界中部署;实际应用(2)分类器对噪声具有鲁棒性和在“大多数情况下”有效是不够的。(3)想要鲁棒的......
  • 【机器人学】4-1.六自由度机器人动力学-开篇-基础知识
        从现在开始进入机器人动力学。前面的正逆解和雅克比矩阵只是开胃小菜,动力学开始进入微观控制层面,难度也比前面的章节难一些,我打算用3个小结带大家入门机器人动力学。在实际的动力学中,质量分布都是已知的,不需要求解。这一章就先到这里,以上4个基础知识足够......
  • 2024华为OD机试真题- 找出作弊的人-(C++/Python)-C卷D卷-100分
     2024华为OD机试题库-(C卷+D卷)-(JAVA、Python、C++) 题目描述公司组织了一次考试,现在考试结果出来了,想看一下有没人存在作弊行为,但是员工太多了,需要先对员工进行一次过滤,再进一步确定是否存在作弊行为。过滤的规则为:找到分差最小的员工ID对(p1,p2)列表,要求p1<......