当前位置: 首页 > news >正文

软中断、Tasklet 与工作队列的机制分析

文章目录

  • 1 软中断(Softirq)
    • 1.1 概念与背景
    • 1.2 特点与执行
    • 1.3 触发与执行方式
    • 1.4 实现与使用
    • 1.5 软中断的替代机制
  • 2 Tasklet
    • 2.1 概念与特点
  • 3 Bottom Halves(BH)
    • 3.1 概念与历史
  • 4 工作队列(Workqueue)
    • 4.1 概念与特点
  • 5 软中断、Tasklet 与工作队列的区别
  • 6 延迟任务的含义与实现
    • 6.1 延迟任务的含义
    • 6.2 Softirq 和 Tasklet 的延迟任务实现
    • 6.3 延迟任务的优势
  • 7 总结
  • 参考链接
  • 封面

本文主要分析软中断、Tasklet 和工作队列的机制及其特点。

1 软中断(Softirq)

1.1 概念与背景

软中断是为解决在硬件中断处理过程中,由于长时间屏蔽中断导致中断响应延迟甚至丢失中断的问题而引入的机制。软中断本质上是一种在中断上下文中执行的延迟任务处理机制,它优先于所有任务的执行。

1.2 特点与执行

  • 中断上下文执行: 软中断在中断回调函数执行后触发,并且会在软中断执行函数 __do_softirq 中重新开启中断,允许被打断。因此,虽然软中断在中断上下文中执行,但它是可以被其他中断打断的。
  • 优先级: 软中断的优先级高于任何任务的优先级。同样,软中断比 tasklet 具有更高的优先级。
  • 多核并行: 软中断在多核系统中可以并行执行,但同一个软中断类型不会跨核迁移(即在哪个核触发的软中断就在哪个核上执行)。
  • 重入性: 由于软中断在多核上可以并行执行,因此它们的回调函数必须是可重入的,需要使用 spinlock 来保护临界区。

1.3 触发与执行方式

软中断可以在以下三个地方触发执行:

  1. 硬中断处理结束后: 在硬中断处理结束后,执行在硬中断中 raise 的软中断。
  2. local_bh_enable()/spin_unlock_bh(): 当下半部使能时执行,执行时机具有一定的随机性(不易预测)。
  3. ksoftirqd 线程: 当软中断正在执行或者执行时间过长时,软中断可能会在线程化的 ksoftirqd 中执行。启用实时补丁(RT Patch)后,软中断也会在线程化的 ksoftirqd 中执行。由于线程化执行方式受调度影响,执行时间更加不可预测。

1.4 实现与使用

  • 静态定义: 软中断在 enum 中静态定义,不能动态申请。系统中的软中断主要用于特权机制,不会随意定义新的静态软中断类型。
  • 全局数组管理: 所有软中断及其回调函数按照优先级索引,被定义在一个全局数组中。各类使用软中断的机制会在自己的中断处理函数中 raise 定义的软中断,随后在中断处理结束后执行这些软中断。
  • ksoftirqd 线程: 每个 CPU 都会创建一个 softirqd 线程,以确保未处理的软中断可以在线程中执行。软中断不会跨核触发,在哪个核 raise 的软中断,就会在哪个核执行。

1.5 软中断的替代机制

  • Tasklet: 基于软中断机制实现的 tasklet 提供了更简单的接口,便于在中断的下半部插入自定义代码。

2 Tasklet

2.1 概念与特点

Tasklet 是基于软中断的机制,用于处理需要延迟的任务。

  • 不能并行执行: 同一类型的 tasklet 只能在同一时间在一个 CPU 上运行,避免了竞争条件。
  • 适用场景: 适合处理简单的延迟执行任务。

3 Bottom Halves(BH)

3.1 概念与历史

BH(Bottom Halves)是一个历史概念,曾用于处理需要在中断上下文之外完成的任务。

  • 替代机制: 现在主要由软中断和 tasklet 取代。
  • 原本用途: 用于在中断处理程序之后执行不紧急的任务。

4 工作队列(Workqueue)

4.1 概念与特点

工作队列是一种在进程上下文中执行延迟任务的机制。

  • 上下文: 进程上下文中执行,允许睡眠和阻塞。
  • 适用场景: 适合需要长时间运行或可能阻塞的任务。
  • 并行性: 可以在多个 CPU 上并行执行。

5 软中断、Tasklet 与工作队列的区别

  • 执行上下文: 软中断和 tasklet 在中断上下文中运行,不允许睡眠;工作队列在进程上下文中运行,可以睡眠。
  • 复杂度与阻塞: 软中断和 tasklet 适合短小、非阻塞任务;工作队列适合复杂、可能阻塞的任务。
  • 并行性: 软中断支持并行执行;tasklet 不支持同类型的并行执行;工作队列根据需要可以并行执行。

6 延迟任务的含义与实现

6.1 延迟任务的含义

“延迟任务”指的是不需要在中断处理程序中立即完成的任务。这些任务可以稍后执行,以减少中断处理时间,从而提高系统的响应性。

6.2 Softirq 和 Tasklet 的延迟任务实现

  • Softirq:

    • 注册与调度: 在内核启动时注册,并在中断或其他触发条件下调度执行。
    • 执行: 在中断返回或内核调度点执行,确保不阻塞,因为它们在中断上下文中执行。
  • Tasklet:

    • 基于 Softirq: TaskletSoftirq 的一个实现,提供了更简单的接口。
    • 调度: 被提交到 tasklet 队列后,在适当的时机由内核运行。
    • 执行: 不允许同类型 tasklet 并行执行,避免竞争条件。

6.3 延迟任务的优势

  • 减少中断处理时间: 硬件中断处理程序应尽快完成,以便系统能够响应其他中断。将复杂或耗时的任务延迟到软中断或 tasklet 中执行,优化了中断响应时间。
  • 批量处理: 软中断可以批量处理多个事件,减少上下文切换和调度开销。
  • 非实时性任务: 某些任务不需要立即完成,可以稍后处理,如更新统计信息或调度其他工作。

这些机制确保了内核在处理高优先级任务时仍然保持高效和响应性。

7 总结

本文分析了软中断、Tasklet 和工作队列的机制、特点及其应用场景,阐明了它们在延迟任务处理中的重要性和相互关系。


参考链接

  • Linux Kernel Documentation

封面

由 DALL-E-3 生成
在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Python 中的 Input 函数及其实现机制
  • 2024新型数字政府综合解决方案(八)
  • flume系列之:查询多个flume agent组是否有topic重复接入情况
  • 电商平台的推荐算法需要备案吗?
  • 关联分析之fp-growth
  • Sublime Text 4 (Build 4180) 编译环境设置
  • uniapp接口请求this.$request
  • Idea使用Maven下载源码
  • Gafgyt僵尸网络针对云原生环境,SSH弱密码成GPU挖矿新目标
  • 开始使用 AWS SAM CLI
  • Java知识点一——列表、表格与媒体元素
  • 【安卓】解析XML格式数据
  • HCIE冲刺-----------论述解析
  • ubuntu24.04 编译安装PHP7.4
  • JS(三)——更改html内数据
  • 【node学习】协程
  • 2018一半小结一波
  • 3.7、@ResponseBody 和 @RestController
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • CSS实用技巧干货
  • echarts的各种常用效果展示
  • exif信息对照
  • flutter的key在widget list的作用以及必要性
  • Java|序列化异常StreamCorruptedException的解决方法
  • js对象的深浅拷贝
  • k8s 面向应用开发者的基础命令
  • LintCode 31. partitionArray 数组划分
  • vue2.0项目引入element-ui
  • vue2.0一起在懵逼的海洋里越陷越深(四)
  • vue学习系列(二)vue-cli
  • 聚簇索引和非聚簇索引
  • 那些年我们用过的显示性能指标
  • 吴恩达Deep Learning课程练习题参考答案——R语言版
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • 转载:[译] 内容加速黑科技趣谈
  • Linux权限管理(week1_day5)--技术流ken
  • 第二十章:异步和文件I/O.(二十三)
  • 关于Android全面屏虚拟导航栏的适配总结
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • ​水经微图Web1.5.0版即将上线
  • ​字​节​一​面​
  • !!java web学习笔记(一到五)
  • #数学建模# 线性规划问题的Matlab求解
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (30)数组元素和与数字和的绝对差
  • (附源码)node.js知识分享网站 毕业设计 202038
  • (附源码)ssm基于web技术的医务志愿者管理系统 毕业设计 100910
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (简单) HDU 2612 Find a way,BFS。
  • (区间dp) (经典例题) 石子合并
  • (全注解开发)学习Spring-MVC的第三天
  • (三)elasticsearch 源码之启动流程分析
  • (四十一)大数据实战——spark的yarn模式生产环境部署
  • (转)JAVA中的堆栈
  • ./mysql.server: 没有那个文件或目录_Linux下安装MySQL出现“ls: /var/lib/mysql/*.pid: 没有那个文件或目录”...