《深入理解Linux内核》笔记4:软中断/tasklet/工作队列

Linux下中断机制之tasklet执行过程(详细)总结 一、简介 由于中断会打断内核中进程的正常调度运行,所以要求中断服务程序尽可能的短小精悍;但是在实际系统中,当中断到来时,要完成工作往往进行大量的耗时处理。因此期望让中断处理程序运行得快,并想让它完成的工作量多,这两个目标相互制约,诞生——顶/底半部机制,本文主要介绍tasklet的执行过程。 读者可根据情况了解以下知识: 软中断过程总结 中断机制详细总结 由于软中断必须使用可重入函数,这就导致设计上的复杂度变高,作为设备驱动程序的开发者来说,增加了负担。而如果某种应用并不需要在多个CPU上并行执行,那么软 阅读详情

软中断、tasklet和工作队列并不是Linux内核中一直存在的机制,而是由更早版本的内核中的“下半部”(bottom half)演变而来。下半部的机制实际上包括五种,但2.6版本的内核中,下半部和任务队列的函数都消失了,只剩下了前三者。本文重点在于介绍这三者之间的关系。(函数细节将不会在本文中出现,可以参考文献,点这里)

(1)上半部和下半部的区别
上半部指的是中断处理程序,下半部则指的是一些虽然与中断有相关性但是可以延后执行的任务。举个例子:在网络传输中,网卡接收到数据包这个事件不一定需要马上被处理,适合用下半部去实现;但是用户敲击键盘这样的事件就必须马上被响应,应该用中断实现。
两者的主要区别在于:中断不能被相同类型的中断打断,而下半部依然可以被中断打断;中断对于时间非常敏感,而下半部基本上都是一些可以延迟的工作。由于二者的这种区别,所以对于一个工作是放在上半部还是放在下半部去执行,可以参考下面四条:
a)如果一个任务对时间非常敏感,将其放在中断处理程序中执行。
b)如果一个任务和硬件相关,将其放在中断处理程序中执行。
c)如果一个任务要保证不被其他中断(特别是相同的中断)打断,将其放在中断处理程序中执行。
d)其他所有任务,考虑放在下半部去执行。

(2)为什么要使用软中断?
软中断作为下半部机制的代表,是随着SMP(share memory processor)的出现应运而生的,它也是tasklet实现的基础(tasklet实际上只是在软中断的基础上添加了一定的机制)。软中断一般是“可延迟函数”的总称,有时候也包括了tasklet(请读者在遇到的时候根据上下文推断是否包含tasklet)。它的出现就是因为要满足上面所提出的上半部和下半部的区别,使得对时间不敏感的任务延后执行,而且可以在多个CPU上并行执行,使得总的系统效率可以更高。它的特性包括:
a)产生后并不是马上可以执行,必须要等待内核的调度才能执行。软中断不能被自己打断,只能被硬件中断打断(上半部)。
b)可以并发运行在多个CPU上(即使同一类型的也可以)。所以软中断必须设计为可重入的函数(允许多个CPU同时操作),因此也需要使用自旋锁来保护其数据结构。

(3)为什么要使用tasklet?(tasklet和软中断的区别)
由于软中断必须使用可重入函数,这就导致设计上的复杂度变高,作为设备驱动程序的开发者来说,增加了负担。而如果某种应用并不需要在多个CPU上并行执行,那么软中断其实是没有必要的。因此诞生了弥补以上两个要求的tasklet。它具有以下特性:
a)一种特定类型的tasklet只能运行在一个CPU上,不能并行,只能串行执行。
b)多个不同类型的tasklet可以并行在多个CPU上。
c)软中断是静态分配的,在内核编译好之后,就不能改变。但tasklet就灵活许多,可以在运行时改变(比如添加模块时)。
tasklet是在两种软中断类型的基础上实现的,但是由于其特殊的实现机制(将在4.3节详细介绍),所以具有了这样不同于软中断的特性。而由于这种特性,所以降低了设备驱动程序开发者的负担,因此如果不需要软中断的并行特性,tasklet就是最好的选择。

(4)可延迟函数(软中断及tasklet)的使用
一般而言,在可延迟函数上可以执行四种操作:初始化/激活/执行/屏蔽。屏蔽我们这里不再叙述,前三个则比较重要。下面将软中断和tasklet的三个步骤分别进行对比介绍。

(4.1)初始化
初始化是指在可延迟函数准备就绪之前所做的所有工作。一般包括两个大步骤:首先是向内核声明这个可延迟函数,以备内核在需要的时候调用;然后就是调用相应的初始化函数,用函数指针等初始化相应的描述符。
如果是软中断则在内核初始化时进行,其描述符定义如下:

   struct softirq_action
          {
                   
void ( * action)( struct softirq_action * );
                   
void * data;
          };

在\kernel\softirq.c文件中包括了32个描述符的数组static struct softirq_action softirq_vec[32];但实际上只有前6个已经被内核注册使用(包括tasklet使用的HI_SOFTIRQ/TASKLET_SOFTIRQ和网络协议栈使用的NET_TX_SOFTIRQ/NET_RX_SOFTIRQ,还有SCSI存储和系统计时器使用的两个),剩下的可以由内核开发者使用。需要使用函数:
         void open_softirq(int nr, void (*action)(struct softirq_action*), void *data)
初始化数组中索引为nr的那个元素。需要的参数当然就是action函数指针以及data。例如网络子系统就通过以下两个函数初始化软中断(net_tx_action/net_rx_action是两个函数):

    open_softirq(NET_TX_SOFTIRQ,net_tx_action);
     open_softirq(NET_RX_SOFTIRQ,net_rx_action);

这样初始化完成后实际上就完成了一个一一对应的关系:当内核中产生到NET_TX_SOFTIRQ软中断之后,就会调用net_tx_action这个函数。
tasklet则可以在运行时定义,例如加载模块时。定义方式有两种:
静态声明

DECLARE_TASKET(name, func, data)
DECLARE_TASKLET_DISABLED(name, func, data)

动态声明

void tasklet_init( struct tasklet_struct * t, void ( * func)(unsigned long ), unsigned long data)

其参数分别为描述符,需要调用的函数和此函数的参数—必须是unsigned long类型。也需要用户自己写一个类似net_tx_action的函数指针func。初始化最终生成的结果就是一个实际的描述符,假设为my_tasklet(将在下面用到)。

(4.2)激活
激活标记一个可延迟函数为挂起(pending)状态,表示内核可以调用这个可延迟函数(即使在中断过程中也可以激活可延迟函数,只不过函数不会被马上执行);这种情况可以类比处于TASK_RUNNING状态的进程,处在这个状态的进程只是准备好了被CPU调度,但并不一定马上就会被调度。
软中断使用raise_softirq()函数激活,接收的参数就是上面初始化时用到的数组索引nr。
tasklet使用tasklet_schedule()激活,该函数接受tasklet的描述符作为参数,例如上面生成的my_tasklet:

tasklet_schedule( & my_tasklet)

(4.3)执行
执行就是内核运行可延迟函数的过程,但是执行只发生在某些特定的时刻(叫做检查点,具体有哪些检查点?详见《深入》p.177)。
每个CPU上都有一个32位的掩码__softirq_pending,表明此CPU上有哪些挂起(已被激活)的软中断。此掩码可以用local_softirq_pending()宏获得。所有的挂起的软中断需要用do_softirq()函数的一个循环来处理。
而对于tasklet,由于软中断初始化时,就已经通过下面的语句初始化了当遇到TASKLET_SOFTIRQ/HI_SOFTIRQ这两个软中断所需要执行的函数:

    open_softirq(TASKLET_SOFTIRQ, tasklet_action, NULL);
     open_softirq(HI_SOFTIRQ, tasklet_hi_action, NULL);

因此,这两个软中断是要被区别对待的。tasklet_action和tasklet_hi_action内部实现就是为什么软中断和tasklet有不同的特性的原因(当然也因为二者的描述符不同,tasklet的描述符要比软中断的复杂,也就是说内核设计者自己多做了一部分限制的工作而减少了驱动程序开发者的工作)。

(5)为什么要使用工作队列work queue?(work queue和软中断的区别)
上面我们介绍的可延迟函数运行在中断上下文中(软中断的一个检查点就是do_IRQ退出的时候),于是导致了一些问题:软中断不能睡眠、不能阻塞。由于中断上下文出于内核态,没有进程切换,所以如果软中断一旦睡眠或者阻塞,将无法退出这种状态,导致内核会整个僵死。但可阻塞函数不能用在中断上下文中实现,必须要运行在进程上下文中,例如访问磁盘数据块的函数。因此,可阻塞函数不能用软中断来实现。但是它们往往又具有可延迟的特性。
因此在2.6版的内核中出现了在内核态运行的工作队列(替代了2.4内核中的任务队列)。它也具有一些可延迟函数的特点(需要被激活和延后执行),但是能够能够在不同的进程间切换,以完成不同的工作。


【中断】软中断、tasklet和任务队列 Linux中断知识汇总: xxxx 目录 中断下半部实现机制 什么是软中断? 什么是tasklet? 什么是工作队列? 软中断、tasklet和工作队列的区别与联系 软中断: tasklet: 工作队列: 如何选择合适的下半部机制? 中断下半部实现机制 为了让中断处理运行的快,同时要完成相应的全部工作。根据具体的内容将中断分为两个部分:上半部分(中断处理程序)和下半部分(推后处理程序)。上半部分需要立即执行,并且有严格的时间限制,这些工作是在所有中断被禁止的情况下完成的,剩余部. 阅读详情

相关推荐

下半部之软中断和tasklet

中断处理及下半部 由中断和异常的区别可知,中断处理程序以一部方式执行,并且他有可能会打断其他重要代码(甚至包括其他中断处理程序)的执行。因此为了避免被打断的代码停止时间过长,中断处理程序应该执行得越快越好。 中断处理程序不再进程上下文中运行,所以他们不能阻塞,所以他们有很高的的实现要求。操作系统个必须有一个快速、异步、简单的机制负责对硬件做出迅速响应并完成那些时间要求很请严格的操作。 因此,整个中断处理流程被分成了两个部分:第一个部分是中断处理程序,内核通过对他的异步执行完成对硬件中断的即时响应。第二部分是

qq_36822217的博客 495

Linux的tasklet函数详解

tasklet主要用在中断函数中。它对于中断处理特别有用,由于硬件中断必须尽快处理, 但大部分的数据管理可以延后到以后安全的时间执行。所以可以使用tasklet。 tasklet的使用比较简单,只需要定义tasklet及其处理函数并将两者关联即可,在定义时可以采用两种形式。 例子: struct tasklet_struct my_tasklet; Void my...

Android/Linux驱动开发传帮带学习,让驱动入门门槛更低! 3505

Sentence-BERT 语义相似度双塔模型

论文介绍 发表:2019,EMNLP 论文题目:《Sentence-BERT:sentence embeddings using siaese BERT-networks》 论文地址:https://arxiv.org/abs/1908.10084 Github:https://github.com/UKPLab/sentence-transformers 适用领域: 句向量生成 语义相似度计算 语义搜索 无监督任务(聚类) 1 概述 在20年之前的各种预训练模型中,比如bert,XLNet,Alb

weiyaner的博客 9194

中断机制以及中断上下部运行和内核代码分析

中断也称外中断,指来自CPU执行指令以外的事件发生(这里的中断是狭义上的中断)异常也称内中断、例外或陷入,指源自CPU执行指令内部的事件。

qq_58538265的博客 1242

从配置字到实际运动:手把手教你用EtherCAT调试伺服电机的控制模式(以倍福TwinCAT3为例)

本文详细介绍了如何使用EtherCAT调试伺服电机的控制模式,以倍福TwinCAT3为例。从环境搭建、模式配置到状态机切换,提供了完整的操作指南和典型故障排查方法,帮助工程师快速解决‘配置字写入了但电机不转’等常见问题,提升工业自动化现场的调试效率。

weixin_42783709的博客 421

《QGIS快速入门与应用基础》【专栏完整目录】

《QGIS快速入门与应用基础》第一卷专栏完整目录,覆盖 001–328 全部篇目与附录,逐篇可跳转。

LuckyHanMo的博客 1301

linux内核源码分析之中断tasklet

硬件中断(hardware interrupt):由系统自身和与之连接的外设自动产生。它们用于支持更高效 地实现设备驱动程序,也用于引起处理器自身对异常或错误的关注 软中断(SoftIRQ):用于有效实现内核中的延期操作。 同步中断和异常: 这些由CPU自身产生,针对当前执行的程序 异常可能因种种原因触发: 运行时发生的程序设计错误(典型的例子是除0); 出现了异常的情况或条件。 异步中断:这是经典的中断类型,由外部设备产生,可能发生在任意时间。 ...

1600

【GPFS专题4】---IBM Spectrum Scale (GPFS) 原理详解

IBM Spectrum Scale(原名为 GPFS,General Parallel File System)是一种高性能、分布式的集群文件系统,专为大规模数据共享和并行访问设计。它允许多个客户端同时访问共享文件,提供高可用性、容错性和扩展性,广泛应用于高性能计算(HPC)、大数据分析、AI 训练和企业级存储场景。IBM Spectrum Scale 通过分布式架构、并行访问和智能数据管理,为企业提供了高性能、高可用、可扩展的存储解决方案。

jundao1997的专栏 780

Linux中断(tasklet,工作队列,内核线程的使用)

本篇文章来讲解在Linux中tasklet,工作队列,内核线程的使用。本篇文章就讲解到这里,需要大家好好理解并进行实践。

m0_49476241的博客 1622

Android性能优化之Android Profiler

在移动应用开发中,打造一个流畅、省电且不卡顿的用户体验是至关重要的。然而,随着应用功能的日益复杂,内存泄漏、CPU暴涨、网络卡顿以及电量消耗过快等问题常常化身为隐形杀手,悄悄吞噬着用户体验。为了帮助开发者精准定位并解决这些性能瓶颈,谷歌在Android Studio中集成了一款强大的一站式性能分析工具Android Profiler。Android Profiler作为Android Studio内置的实时数据可视化工具,支持运行在Android 5.0及更高版本的设备上。

xiangzhihong8的专栏 202

华为HCIP的学习大纲和计划

HCIP(华为认证 ICT 高级工程师)核心围绕华为 ICT 技术体系,不同方向(如路由交换、云计算、安全等)课程目录不同,以下是最热门的。

迷逝 576

大模型思维链隐藏与提取:API场景下的原理分析与安全防护

思维链(Chain-of-Thought)是大模型实现复杂推理的核心机制,也是模型内部最敏感的中间产物。它既决定了AI在数学、逻辑等任务上的表现,也因可能暴露训练数据、系统指令与能力边界,成为企业级AI资产保护的重点。随着API应用的普及,思维链隐藏并非绝对可靠:指令冲突、格式诱导、多轮上下文污染等,都可能使模型在特定提示词下输出内部推理过程,形成所谓“思维链提取”风险。本文从思维链的概念与价值出发,解析模型隐藏它的商业与技术原因,并剖析提取现象背后的约束失效本质;同时面向API调用场景,给出输出过滤、上下

weixin_34126557的博客 311

qwen2vl ValueError: Image features and image tokens do not match: tokens: 568, features 600

本文介绍了一个用于计算多模态数据集中样本token数量的Python工具,特别针对包含文本和图像的Qwen2-VL模型数据集。

q742971636的博客 1012

深入理解Linux内核中断的下半部机制-软中断和tasklet

本文探讨了Linux内核中的中断处理机制,重点分析了上半部和下半部的实现原理。文章通过单片机GPS数据解析的实例,引出中断处理函数需快速执行的必要性,以避免数据丢失。Linux内核通过引入下半部机制(软中断、tasklet和工作队列)来解决这一问题。上半部(中断处理函数)仅完成简单任务,耗时操作则交由下半部处理。软中断通过raise_softirq触发,最终置位__softirq_pending标志位,并在中断退出时执行对应的处理函数。tasklet基于软中断实现,两者共同构成了高效的中断下半部处理机制。

qq_53686293的博客 830

SAM3 LoRA Fine-Tuning|SAM3微调(完全对齐官方训练和配置)

本文介绍了基于官方SAM3模型使用LoRA技术进行图像目标检测与分割微调的项目。项目完全对齐官方训练配置,支持多类别高效微调,且不影响原模型的开放词汇提示能力。微调后模型在航拍图像中对道路、车辆等目标的分割效果显著提升,误检率降低。 项目提供完整的训练和推理流程: 支持双卡并行训练,显存需求大(完整微调需30G+显存) 提供训练脚本和配置文件,可灵活调整参数 包含推理可视化工具,支持与原模型效果对比,内置训练结果分析工具,可生成指标对比图 数据集采用COCO格式。

weixin_46248968的博客 359

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

《深入理解Linux内核》软中断/tasklet/工作队列

http://www.cnblogs.com/li-hao/archive/2012/01/12/2321084.html 软中断、tasklet和工作队列并不是Linux内核中一直存在的机制,而是由更早版本的内核中的“下半部”(bottom half)演变而来。下半部的机制实际上包括五种,但2.6版本的内核中,下半部和任务队列的函数都消失了,只剩下了前三者。本文重点在于介绍这三者之

jianchaolv的专栏 793

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

软中断/tasklet/工作队列

《深入理解Linux内核》笔记4:软中断/tasklet/工作队列2009年06月02日 星期二 10:48软中断、tasklet和工作队列并不是Linux内核中一直存在的机制,而是由更早版本的内核中的“下半部”(bottom half)演变而来。下半部的机制实际上包括五种,但2.6版本的内核中,下半部和任务队列的函数都消失了,只剩下了前三者。本文重点在于介绍这三者之间

gchen_nj的专栏 854

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

WINCC7.3破解文件

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

linux软中断与tasklet

原文地址:http://blog.youkuaiyun.com/rockrockwu/article/details/7315677 软中断 软中断由 struct softirq_action{ Void(*action)(struct softirq_action *) } 表示。并且当前内核中的软中断总数固定为32个,由数组Static struct so

雜貨鋪 708

Linux内核Tasklet机制:中断下半部处理与性能优化指南

中断处理是操作系统内核的核心机制,负责响应硬件事件。在Linux内核中,中断分为上半部和下半部,上半部要求快速执行,下半部处理非紧急但需尽快完成的任务。Tasklet作为中断下半部的一种实现方式,基于软中断机制封装,提供简化的API接口。其技术价值在于降低中断延迟,保证关键操作的及时响应,同时通过串行化执行减少数据竞争风险。Tasklet适用于网络驱动、块设备处理等需要低延迟但处理时间较短的场景。本文深入解析Tasklet的工作原理、多核环境下的行为特性,以及在实际驱动开发中的最佳实践,帮助开发者合理运用这

abc20899的专栏 522

Linux内核Tasklet机制详解:中断下半部处理的核心技术

中断处理是操作系统核心机制之一,涉及硬件事件到软件响应的完整流程。在Linux内核中,中断上下文存在严格限制——不能睡眠、不能调用可能阻塞的函数。为解决这一矛盾,内核引入了上半部/下半部分离设计,其中Tasklet作为专门的中断下半部处理机制,在软中断上下文中执行耗时操作。这种设计既保证了中断响应的实时性,又避免了复杂操作导致的系统不稳定。从技术价值看,Tasklet通过串行化执行简化了并发控制,特别适合网络设备驱动中的数据包处理、块设备I/O完成回调等场景。相比工作队列,Tasklet具有更低的调度延迟;

weixin_33965305的博客 464

Linux内核Tasklet机制详解:中断下半部处理与驱动开发实践

中断处理是操作系统内核的核心机制,它负责响应硬件事件并确保系统实时性。Linux内核通过将中断处理分为上下两部分来解决响应速度与处理耗时的矛盾,其中下半部机制专门处理非紧急但必要的后续任务。Tasklet作为一种轻量级的下半部实现,基于软中断构建但提供了更简单的编程接口,它在软中断上下文中运行且不能睡眠,保证了低延迟执行。这种机制在驱动开发中具有重要价值,特别是在网络数据包处理、USB设备通信等需要快速响应但又不适合在中断上下文中完成全部工作的场景。通过理解Tasklet的串行执行特性和原子性调度原理,开发

weixin_30682415的博客 415

深入理解linux内核

深入理解linux内核读书笔记

weixin_44870037的博客 2854
上一篇: 从一道面试题谈linux下fork的运行机制
下一篇: Linux设备模型 学习总结
MacroCrazier
博客等级 码龄19年 39粉丝 26原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值