【C语言】linux内核软中断

一、什么是软中断?

内核中的软中断(Softirqs)和任务下半部(Tasklets)是Linux内核中用于在中断上下文之外处理中断服务的一种底层机制。这些机制解决了不能在中断服务例程(ISR)中执行耗时操作或者需要睡眠的操作的问题。软中断提供了一种在中断上下文中延迟处理的方法,允许中断处理分为两个阶段:顶半部和底半部。

顶半部(Top Half)

- 发生硬件中断时,首先会执行顶半部。
- 顶半部的代码通常运行在硬中断上下文,需要尽可能快地执行,因为在顶半部执行期间,相同的中断或其他中断可能被锁定,这会影响系统响应时间。
- 它通常负责快速执行与硬件交互的必要步骤,如读取寄存器或复位硬件中断状态,并且快速结束,以免长时间占用中断。

底半部(Bottom Half)

- 底半部是中断处理的延迟执行部分,用于执行更复杂或耗时的操作。
- 它在中断上下文之外执行,可以被其他中断打断。
- 底半部机制允许系统维持较高的响应性,因为顶半部可以快速释放中断线,让其他中断能够得到处理。

软中断(Softirqs)

- 软中断是Linux内核处理底半部工作的最原始的机制。
- 它们是静态定义的,数量固定,具体在<linux/interrupt.h>中定义。
- 每个CPU都有自己的软中断向量和状态。
- 软中断的处理是延迟的,常常是在中断返回后或者在其他处理器空闲时由内核调度器触发执行。
- 它们具有高性能,但开发起来相对复杂,因此Linux中还引入了更简化的底半部处理机制,即任务下半部(Tasklets)。

任务下半部(Tasklets)

- Tasklets是建立在软中断之上的一个简化的抽象,提供了更简单的接口。
- Tasklets可以动态创建,运行在软中断的上下文中,允许将小任务推迟到不会影响系统实时行为的时候执行。
- Tasklets可以被禁用和重新启用,但在设计上,同一个Tasklet在系统中的多个CPU之间不会并行执行。

软中断和任务下半部的处理通常发生在如下几个时间点:

1. 中断处理的硬中断返回后。
2. 当系统中断返回到用户空间前。
3. 内核检测到某个CPU运行在空闲循环(idle loop)时。
在多处理器系统中,软中断和任务下半部的处理需要考虑并发性和负载均衡,内核通常会在不同的CPU上分配这些任务,以充分利用系统资源。

二、软中断的实现

内核软中断(Softirqs)在Linux内核中是通过一系列底层机制实现的。下面是一个高层次的概述,展示了软中断是如何工作和实现的:
1. 内核数据结构定义
   - 软中断在内核中通过一个数据结构(通常是数组)来表示,其中每个条目代表一个软中断类型。Linux内核为每个处理器维护一个这样的数据结构。
   - 在`<linux/interrupt.h>头文件中预定义了一组软中断类型,例如网络相关的 NET_TX_SOFTIRQ` 和 NET_RX_SOFTIRQ,以及调度器相关的 SCHED_SOFTIRQ 等。
2. 初始化
   - 在系统启动时,内核会初始化软中断机制,包括预定义软中断向量的初始化。
3. 中断处理和软中断激活
   - 当硬件中断发生并被服务时,顶半部(Top Half)快速执行,并且在必要时通过调用特定的函数例如 raise_softirq 激活一个或多个软中断。
   - 激活软中断涉及到设置相应软中断的状态,通常是通过设置标志位来指示这个软中断需要被处理。
4. 软中断处理
   - 软中断处理可以在几种不同的上下文中执行。最常见的情形包括从中断上下文返回到用户态之前,以及内核检测到CPU空闲时。
   - 当内核准备处理软中断时,它会检查每个软中断的状态,并对设置了激活标志的软中断调用其注册的处理函数。
   - 这个处理函数是在软中断注册时指定的,是执行实际任务的代码,比如网络数据的接收和发送处理函数。
5. 并发和锁定
   - 由于软中断可以在多核系统中的任意CPU上执行,因此内核必须确保某一特定类型的软中断在同一时刻只能在一个CPU上运行。内核中实现了锁机制来管理这种并发。
   - 为了保证性能和避免死锁,软中断的执行过程中一般不能进行阻塞操作。
6. 性能优化
   - 内核会尝试尽可能高效地处理软中断,包括可能的负载均衡(将软中断工作分配给不同的CPU)以及“延迟处理”(如ksoftirqd守护线程)来降低软中断对实时任务的影响。
7. ksoftirqd守护线程
   - 对于每个CPU,内核都维护了一个名为ksoftirqd的内核线程。这个线程负责确保软中断得到处理,特别是当系统很忙且软中断无法及时处理时。
   - 这个线程的优先级很低,只有当系统的软中断负载较重时才会运行,以避免影响到更重要的任务。
综上所述,软中断是内核为了处理不适合在硬件中断上下文直接执行的任务而设计的一种轻量级机制。它们可以延迟执行并分担中断处理的负载,同时满足系统对实时性的需求。

三、内核抢占与软中断

Linux 内核自 2.6 版本开始,引入了主动抢占(Voluntary Preemption)和完全抢占(Preemptive Kernel)的概念,并且在随后的更新中继续提升了对抢占的支持。在 Linux 内核中,对抢占的支持可以通过内核配置选项进行调整。
有以下几种内核抢占模型:
1. 无抢占内核(No Preemption):这是传统的 Linux 内核模型,用于需要非常高稳定性和响应时间不是首要考虑的服务器环境。
2. 自愿抢占(Voluntary Preemption, CONFIG_PREEMPT_VOLUNTARY):这种模式在内核中插入许多显式的抢占点,以便提高系统的响应性。这种模式适合大多数台式机和笔记本电脑使用,因为它在系统响应性和稳定性之间提供了一个很好的折衷。
3. 抢占式内核(Preemptive Kernel, CONFIG_PREEMPT):这个选项是为了最大程度地降低内核代码的延迟,特别适合需要高响应性的桌面和嵌入式系统,但可能会牺牲一些稳定性。
4. 实时内核(Real-time Kernel, CONFIG_PREEMPT_RT):这是通过实时补丁(PREEMPT_RT)获得的 Linux 内核变种,可以为需要实时响应的系统提供预测性的、低延迟的行为。适用于工业、科研、音视频处理等对实时性要求很高的场合。
发行版维护者或用户可以根据自己的需求选择适当的抢占模式。

内核抢占(Kernel Preemption)
内核抢占是指操作系统允许一个内核模式的进程被另一个更高优先级的进程抢占。这通常发生在以下几种情况:
1. 当一个进程完成了它的时间片。
2. 当更高优先级的进程准备运行时,例如,从睡眠状态被唤醒。
3. 一些同步机制可能会导致当前运行的进程放弃处理器。
在没有抢占的内核中,一旦进程进入内核模式执行系统调用或其他内核任务,它会一直运行,直到主动放弃CPU控制权。这可能会导致系统响应变慢,因为高优先级任务可能需要等待低优先级任务完成其内核模式下的工作。内核抢占能够提高系统的响应性,特别是在多任务环境下。
软中断(Softirqs)
软中断是Linux内核中处理中断相关工作的一种机制。它们是相对硬件中断的概念(在旧一些的资料可能会碰到"硬中断"这一英文直译术语,但通常现在更倾向于直接使用英文"hardware interrupt");硬件中断是由CPU外部设备触发的,是中断处理的第一阶段。
当硬件中断发生时,CPU会立刻暂停当前执行的任务,转而执行一个非常短小的中断服务程序(Interrupt Service Routine, ISR),ISR的任务是快速地响应中断,执行一些紧急处理,然后标记软中断去完成剩余工作。这使得中断服务程序可以快速结束,CPU可以尽快恢复其他任务的执行。软中断处理则是延后执行的,可以批量处理一些工作,或者在处理器比较空闲的时候再执行。
通过将中断处理分为两个阶段,Linux内核能够提供快速响应硬件中断的同时,又能将耗时的处理工作推迟到软中断中去完成,以减少对系统性能的影响。软中断可以被内核抢占,但它们自己之间不会抢占彼此,因此可以保证一定程度的执行顺序。

在早期的 Linux 内核中,内核是非抢占的,意味着一旦一个进程进入内核模式执行系统调用或者内核代码,它会一直运行到返回到用户模式,除非它自己放弃 CPU。在这种模式下,一个正在执行的内核路径不会被另一个更高优先级的任务抢占。
随着 Linux 内核的发展,为了提高系统的响应性和实时性,引入了「抢占式内核」(PREEMPT) 功能。从 2.6 版本开始,Linux 内核提供了可配置的抢占模型。抢占式内核允许在执行内核代码时(不包括关键区,即临界区和中断处理程序),根据需要将 CPU 让给更高优先级的任务,这在多任务系统中尤为重要,能够减少任务响应时间,提高系统的实时性。
对于抢占式内核,一旦有更高优先级的任务需要运行,当前任务可以在内核态被抢占,只要它们不在临界区内。这种特性对于需要快速响应外部事件的实时操作系统尤为重要。
关于软中断(softirq)是 Linux 内核中一种底层的机制,用来处理非即时的中断处理工作。它们通常发生在两种情况下:
1. 硬件中断的底半部(bottom half)处理:当硬件产生中断时,中断处理被分为两部分。上半部(顶半部,top half)是指那些必须立即执行的处理工作,由硬件中断直接触发并立即执行;下半部是指可以推迟处理的、不那么急迫的工作,通常由软中断来处理。
2. 在内核中需要异步处理的其他情况。
软中断可以被抢占,它们的执行可以在任何非临界的内核上下文中发生,但是软中断本身不会主动放弃处理器控制权。这意味着一旦软中断开始执行,它们会运行到完成,除非它们被硬中断或者硬件中断的上半部抢占。这样设计是为了避免复杂的锁依赖和避免软中断处理被无限期地推迟。
总结来说,最新的 Linux 内核提供了抢占式内核的功能,可以通过配置选项开启或关闭。而软中断作为内核中的一种机制,用于处理那些可以延后而非即时处理的工作,与内核抢占机制相辅相成,共同提高系统的效率和响应速度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/278266.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

服务器数据恢复—raid5热备盘上线同步数据失败的如何恢复数据

服务器数据恢复环境&故障&分析&#xff1a; 一台存储上有一组由多块硬盘组建的raid5阵列&#xff0c;该raid5阵列中的一块硬盘掉线&#xff0c;热备盘自动上线同步数据的过程中&#xff0c;raid阵列中又有一块硬盘掉线&#xff0c;热备盘的数据同步被中断&#xff0c;r…

JavaWeb06-MVC和三层架构

目录 一、MVC模式 1.概述 2.好处 二、三层架构 1.概述 三、MVC与三层架构 四、练习 一、MVC模式 1.概述 MVC是一种分层开发的模式&#xff0c;其中 M&#xff1a;Model&#xff0c;业务模型&#xff0c;处理业务 V&#xff1a; View&#xff0c;视图&#xff0c;界面展…

腾讯云优惠券领取的几种方法,助你降低云服务成本

随着云计算技术的广泛应用&#xff0c;越来越多的企业和个人选择使用云服务来降低运营成本、提高运营效率。腾讯云作为国内领先的云服务提供商&#xff0c;凭借其出色的性能、稳定性和安全性&#xff0c;赢得了广大用户的信赖。为了回馈用户&#xff0c;腾讯云经常推出各种优惠…

Python实现BOA蝴蝶优化算法优化循环神经网络分类模型(LSTM分类算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 蝴蝶优化算法(butterfly optimization algorithm, BOA)是Arora 等人于2019年提出的一种元启发式智能算…

element el-cascader获取完整数据

<el-table-column prop"createTime" label"编辑店铺分类"><template slot-scope"scope"><el-cascaderref"cascader"v-model"scope.row.shoptypeone":options"commoditylist"placeholder"请选…

RPC 和 序列化

RPC 1 RPC调用流程 1.1 clerk客户端调用远程服务 Clerk::PutAppend() raftServerRpcUtil::PutAppend() raftServerRpcUtil是client与kvserver通信的入口&#xff0c; 包含kvserver功能的一对一映射&#xff1a;Get/PutAppend&#xff0c;通过stub对象——raftKVRpcProctoc:…

爬虫神器!使用Python一键下载网页图片,省时高效!

引言 爬虫技术在当今信息时代中扮演着重要的角色&#xff0c;可以自动化获取互联网上的数据。本教程将围绕你提供的Python爬虫代码展开&#xff0c;旨在实现自动下载图片的功能。通过这个示例&#xff0c;你将学习如何利用爬虫技术批量获取网页中的图片&#xff0c;并将其保存…

MC78L05ACDR2G线性稳压器芯片中文资料规格书PDF数据手册引脚图参数图片价格

产品概述&#xff1a; MC78L00A系列线性稳压器价格便宜&#xff0c;易于使用&#xff0c;适用于各种需要最高100mA的调节电源的应用。与大功率MC7800和MC78M00系列一样&#xff0c;这款稳压器也提供内部电流限制和高温关断&#xff0c;因此非常坚固耐用。在很多应用中&#xf…

【C语言】linux内核pci_save_state

一、中文注释 //include\linux\pci.h /* 电源管理相关的例程 */ int pci_save_state(struct pci_dev *dev);//drivers\pci\pci.c /*** pci_save_state - 在挂起前保存PCI设备的配置空间* dev: - 我们正在处理的PCI设备*/ int pci_save_state(struct pci_dev *dev) {int i;/* X…

odoo17开发教程(14):Computed Fields And Onchanges

目录 概述&#xff1a; 计算字段Computed Fields 依赖关系 实践&#xff1a; 计算总面积 计算最佳报价。 Inverse Function反函数 实践&#xff1a;计算报价的有效日期。 其他信息 Onchanges 实践&#xff1a;设置花园面积和方向值。 如何使用它们&#xff1f; 概述…

漫谈5种注册中心

01 注册中心基本概念 1.1 什么是注册中心&#xff1f; 注册中心主要有三种角色&#xff1a; 服务提供者&#xff08;RPC Server&#xff09;&#xff1a;在启动时&#xff0c;向 Registry 注册自身服务&#xff0c;并向 Registry 定期发送心跳汇报存活状态。 服务消费者&…

鸿蒙开发学习:【OpenHarmony HAR】

OpenHarmony js/ts三方库使用的是OpenHarmony静态共享包&#xff0c;即HAR(Harmony Archive)&#xff0c;可以包含js/ts代码、c库、资源和配置文件。通过HAR&#xff0c;可以实现多个模块或者多个工程共享ArkUI组件、资源等相关代码。HAR不同于HAP&#xff0c;不能独立安装运行…

Python数据分析-Matplotlib1

一、折线图的绘制 1.数据分析流程 2.运用Matplot绘制折线图 #encodingutf-8 import random from matplotlib import pyplot as plt #绘图工具库 from matplotlib import font_manager #解决中文显示问题 from cProfile import label #设置字体方式 my_font font_manager.Fon…

jscpd对项目进行查重(支持150+类语言)

jscpd jscpd 查重时能够跳过标记为忽略的块和新行以及空符号和注释&#xff08;不支持尖括号注释<!-- --&#xff01;>&#xff09;&#xff0c;重复率判定依据为一定长度标识符的MD5值是否相同。 安装 npm install -g jscpd配置参数(查看更多) OptionTypeDefaultDes…

挑战杯 机器视觉目标检测 - opencv 深度学习

文章目录 0 前言2 目标检测概念3 目标分类、定位、检测示例4 传统目标检测5 两类目标检测算法5.1 相关研究5.1.1 选择性搜索5.1.2 OverFeat 5.2 基于区域提名的方法5.2.1 R-CNN5.2.2 SPP-net5.2.3 Fast R-CNN 5.3 端到端的方法YOLOSSD 6 人体检测结果7 最后 0 前言 &#x1f5…

VS2019加QT5.14中Please assign a Qt installation in ‘Qt Project Settings‘.问题的解决

第一篇&#xff1a; 原文链接&#xff1a;https://blog.csdn.net/aoxuestudy/article/details/124312629 error:There’ no Qt version assigned to project mdi.vcxproj for configuration release/x64.Please assign a Qt installation in “Qt Project Settings”. 一、分…

Docker学习之使用harbor搭建私有仓库(超详解析)

实验目的&#xff1a; 使用centos7&#xff0c;基于harbor构建私有仓库 实验步骤&#xff1a; 下载相关安装包和依赖&#xff1a; [rootlocalhost ~]# yum install -y yum-utils device-mapper-persistent-data lvm2 wget //安装docker所需要的相关依赖 [rootlocalhost ~]#…

[ThinkPHP]Arr返回1

$detailId (int)Arr::get($detail, null); var_dump($detailId); 打印结果&#xff1a;int(1) 原因&#xff1a; vendor/topthink/think-helper/src/helper/Arr.php

如何定期清理数据库中的无效数据?

企业的数据库在运行相当长一段时间后&#xff0c;都会出现无效数据的堆积&#xff0c;这些数据包含了过时、重复、错误、缺失&#xff08;空字段&#xff09;的数据&#xff0c;长期占据着宝贵的数据库空间。而在上云热潮的推动下&#xff0c;绝大多数企业已经将他们的业务数据…

Linux第77步_处理Linux并发的相关函数

了解linux中的“原子整形数据”操作、“原子位数据”操作、自旋锁、读写锁、顺序锁、信号量和互斥体&#xff0c;以及相关函数。 并发就是多个“用户”同时访问同一个共享资源。如&#xff1a;多个线程同时要求读写同一个EEPROM芯片&#xff0c;这个EEPROM就是共享资源&#x…