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

Linux中断下半部分:软中断,tasklet和工作队列

为什么要有下半部分

  1. 中断会打断其他程序,为了打断其他程序时间短,就需要中断处理程序快。
  2. 执行中断处理程序后,相同中断不会触发,甚至所有中断都不能触发(设置IRQF_DISABLED,其他硬件与操作系统无法通信)
  3. 中断上下文下不能阻塞
    所以将中断分为上下部分,上部分处理反应很快的部分,下半部分处理对时间要求宽松的事件。
    上半部分需要处理硬件,比如将网卡接收的数据包复制到操作系统的缓存区。
    上半部分保证不被中断。
    其他所有都放在下部分。

下半部分的运行时机

通常下半部分在中断处理程序一返回就会马上运行,下半部分执行的关键是,它们运行时允许中断。
如果我们需要在一段时间后允许,我们可以使用内核定时器实现下半部分的任务。

内核提供的下半部分的实现方式

现在能用的有软中断,tasklet,工作队列。

软中断

软中断使用较少(相对于tasklet),但是tasklet是基于软中断实现的。
软中断是在编译期间静态分配的,不像tasklet那样能动态地注册或者注销。
内核可以注册32个软中断,而当前内核版本只注册了9个。

软中断结构体:
struct softirq_action{void (*action)(struct softirq_action*);
};
内核中的全局变量:
static struct softirq_action softirq_vec[NR_SOFTIRQS];//32个软中断
软中断处理函数action函数原型:
void softirq_handler(struct softirq_action *);

当只有一个处理器上,一个软中断不会抢占另一个软中断,唯一可以抢占软中断的是中断处理程序。不过,软中断可以在不同处理器上执行。

触发软中断

一个注册的软中断只有在标记后才会执行,中断处理程序会在返回前标记它的软中断,使其在稍后执行。
在下列地方,会遍历寻找待处理的软中断并且执行:

  • 从中断处理程序返回后
  • 在ksoftirqd内核线程中
  • 在那些主动执行检查软中断的代码中

具体代码

u32 pending;
pending=local_softirq_pending();
if(pending){
struct softirq_action *h;
set_softirq_pending(0);
h=softirq_vec;do{if(pending & 1)h->action(h);h++;pending>>=1;}while(pending);
}
  1. 是执行do_softirq(),通过将宏local_softirq_pending()的返回值保存到局部变量pending,它是一个32位的位图(如果第n位设置为1,则执行n位的软中断处理程序)。
  2. 重置宏为全0
  3. 依次遍历位图,遇到1则执行相应的软中断处理程序。

使用软中断

软中断保留给系统中对时间最敏感最严格的下半部分使用。目前,只有两个子系统(网络和SCSI)直接使用软中断。此外,内核定时器和tasklet都是建立在软中断上的。相比之下,tasklet可以动态生成,使用更方便。

分配索引

软中断有32位,因为do_softirq()是从下到大的遍历位图,所以小的索引会在大的索引之前执行,索引具有优先级。

tasklet优先级软中断描述
HI_SOFTIRQ0优先级高的tasklet
TIMER_SOFTIRQ1定时器的下半部
NET_TX_SOFTIRQ2发送网络数据包
NET_RX_SOFTIRQ3接收网络数据包
BLOCK_SOFTIRQ4BLOCK装置
TASKLET_SOFTIRQ5正常优先级的tasklet
SCHED_SOFTIRQ6调度程序
HRTIMER_SOFTIRQ7高分辨率定时器
RCU_SOFTIRQ8RCU锁定
注册软中断处理程序

open_softirq(NET_TX_SOFTIRQ,net_t_action);//网络子系统注册自己的软中断处理函数。
有两个参数,第一个是索引号,第二个是处理函数。

触发软中断

raise_softirq(NET_TX_SOFTIRQ);//将中断号为2的网络发送标志设置为1
在do_softirq()中会触发其函数net_t_action();

tasklet

只在高频率使用软中断,大多数情况使用tasklet。
tasklet本质上也是软中断,只不过同一个处理程序的多个实例不能在多处理器上同时运行。所以软中断需要考虑多个处理器同时运行软中断执行函数。而tasklet不需要考虑并发问题。

struct tasklet_struct {struct tasklet_struct *next;		//链表下一个unsigned long state;		//状态atomic_t count;		//引用计数void (*func)(unsigned long);	//核心处理函数unsigned long data;			//给func的参数
}

state状态有:0,TASKLET_STATE_SCHED(已被调度),TASKLET_STATE_RUN(正在运行,只在多处理器上使用)
每个tasklet都存放在两个链表中的其一: tasklet_vec(普通tasklet),tasklet_hi_vec(高优先级tasklet).

创建tasklet

静态创建:
DECLARE_TASKLET(tasklet_name,tasklet_func,tasklet_data);
tasklet不能睡眠,所以不能使用阻塞,信号量等。

两个相同的tasklet绝不会在多个处理器上同时执行,这点和软中断不同

tasklet的调度:tasklet_schedule()或者tasklet_hi_schdule()(高优先级tasklet);

tasklet_schedule()执行步骤:

  1. 检查tasklet的状态,如果不是0,直接返回。
  2. 调用_tasklet_schedule(),将tasklet状态设置为scheduled。
  3. 保存中断状态,禁止本地中断。
  4. 把需要调度的tasklet加到每个处理器的tasklet_vec链表表头。
  5. 将软中断的TASKLET_SOFTIRQ(5)设置为1,这样下次do_softirq()会执行这个tasklet。
  6. 恢复中断(中断返回会触发do_softirq() )

tasklet的执行

do_softirq()检测到位图的TASKLET_SOFTIRQ为1,则执行tasklet_action().
tasklet_action():

  1. 此时处于禁止中断的状态(因为do_softirq()禁止中断),并且为当前处理器检查tasklet_vec链表,检索完后清楚tasklet_vec链表。
  2. 允许中断,执行下半部分,执行每一个待处理的tasklet。
  3. 如果是多处理器,每个处理器都会检查tasklet是否为TASKLET_STATE_RUN状态(其他处理器已经运行了),如果正在其他处理器上运行那么就不运行了。
  4. 将tasklet状态改为TASKLET_STATE_RUN.
  5. 执行func函数(tasklet数据结构中的)
  6. 清楚tasklet的状态。
  7. 运行下一个tasklet,直到结束。

工作队列

当需要睡眠时,那么就使用工作队列。
将工作推后,交由一个内核进程去执行(在进程上下文中执行)。

相关文章:

Linux中断下半部分:软中断,tasklet和工作队列

为什么要有下半部分 中断会打断其他程序,为了打断其他程序时间短,就需要中断处理程序快。执行中断处理程序后,相同中断不会触发,甚至所有中断都不能触发(设置IRQF_DISABLED,其他硬件与操作系统无法通信)中…...

Flink CEP实现10秒内连续登录失败用户分析

1、什么是CEP? Flink CEP即 Flink Complex Event Processing,是基于DataStream流式数据提供的一套复杂事件处理编程模型。你可以把他理解为基于无界流的一套正则匹配模型,即对于无界流中的各种数据(称为事件),提供一种组合匹配的…...

QSqlRelationalTableModel 关系表格模型

一、 1.1 QSqlRelationalTableModel继承自QSqlTableModel,并且对其进行了扩展,提供了对外键的支持。一个外键就是一个表中的一个字段 和 其他表中的主键字段之间的一对一的映射。例如,“studInfo”表中的departID字段对应的是“departments…...

JS和CSS实现的原生轮播图

JSCSS实现滑动轮播图 使用JS加CSS来实现的幻灯片&#xff0c;主要使用的是CSS的transform属性中的translate来实现&#xff0c;适合与用户交互的轮播图&#xff0c;展现轮播图的数量&#xff0c;用户可自由进行选择。 <!DOCTYPE html> <html lang"en">&…...

【微服务】skywalking自定义链路追踪与日志采集

目录 一、前言 二、自定义链路追踪简介 2.1 自定义链路追踪应用场景 2.2 链路追踪几个关键概念 三、skywalking 自定义链路追踪实现 3.1 环境准备 3.2 集成过程 3.2.1 导入核心依赖 3.2.2 几个常用注解 3.2.3 方法集成 3.2.4 上报追踪信息 四、skywalking 自定义日志…...

MYSQL基础问题

一&#xff0e;DBMS 是什么 DBMS&#xff08;Database Management System&#xff09;,数据库管理系统&#xff0c;是一种操纵和管理 数据库的大型软件&#xff0c;用于建立、使用和维护数据库。对数据库进行统一的管理和 控制&#xff0c;以保证数据库的安全性和完整性。 二…...

SpringBoot使用Guava实现日志脱敏(含源码)

点击下载《SpringBoot使用Guava实现日志脱敏&#xff08;含源码&#xff09;》 1. 摘要 本文将介绍如何使用Google Guava库进行日志脱敏&#xff0c;保护敏感数据的安全。我们将详细解释脱敏的必要性&#xff0c;然后介绍如何使用Guava中的Strings、Maps和CharMatcher类来进行…...

数据结构—动态查找

动态查找介绍 1. 动态查找的引入&#xff1a;当查找表以线性表的形式组织时&#xff0c;若对查找表进行插入、删除或排序操作&#xff0c;就必须移动大量的记录&#xff0c;当记录数很多时&#xff0c;这种移动的代价很大。 2. 动态查找表的设计思想&#xff1a;表结构本身是…...

Tarjan算法学习笔记

目录 无向图的割点与桥 时间戳&#xff1a; 搜索树&#xff1a; 追溯值&#xff1a; 割边判定法则&#xff1a; 割点判定法则&#xff1a; 无向图的双连通分量 定理&#xff1a; 边双连通分量(e-DCC)的求法&#xff1a; e-DCC的缩点&#xff1a; 有向图的连通性 追…...

vue 项目涉及的焦点聚焦、格式化日期、判断是否为对象或数组、判断是否为空、深拷贝、节流、防抖

焦点聚焦 import Vue from vue // 插件对象(必须有 install 方法, 才可以注入到 Vue.use 中) export default {install () {Vue.directive(fofo, {inserted (el) {el el.querySelector(input)el.focus()}})} }格式化日期格式 export const formatDate (time) > {// 将xx…...

软件工程知识梳理6-运行和维护

软件维护需要的工作量很大&#xff0c;大型软件的维护成本高达开发成本的4倍左右。所以&#xff0c;软件工程的主要目的就是要提高软件的可维护性&#xff0c;减少软件维护所需要的工作量&#xff0c;降低软件系统的总成本。 定义&#xff1a;软件已经交付使用之后&#xff0c;…...

docker- php7.4

安装 gd拓展 anzhuanga在Dockerfile里面安装php7.4的GD库 - 知乎 apt update apt install -y libwebp-dev libjpeg-dev libpng-dev libfreetype6-devdocker-php-source extractdocker-php-ext-configure gd \ --with-jpeg/usr/include \ --with-freetype/usr/include/docker-…...

开发一个Android App,在项目中完成添加联系人的功能,通过ContentResolver向系统中添加联系人信息。

实现步骤&#xff1a; &#xff08;1&#xff09;添加动态联系人的权限。 &#xff08;2&#xff09;创建Activity和布局文件&#xff0c;添加输入框和按钮等控件。 &#xff08;3&#xff09;完成添加联系人的功能。 代码文件如下&#xff1a; activity_main.xml文件 <!…...

Flume搭建

压缩包版本&#xff1a;apache-flume-1.9.0-bin.tar 百度盘链接&#xff1a;https://pan.baidu.com/s/1ZhSiePUye9ax7TW5XbfWdw 提取码&#xff1a;ieks 1.解压 tar -zxvf /opt/software/apache-flume-1.9.0-bin.tar.gz -C /opt/module/ 2. 修改文件名 [rootbigdata1 opt]…...

Web APIs 1 DOM操作

Web APIs 1 引入&#xff1a;const优先Web API 基本认知01 作用和分类02 什么是DOM03 DOM树04 DOM对象 获取DOM对象01 根据CSS选择器获取02 其他获取DOM元素方法 操作元素内容01 innerText 属性02 innerHTML 属性 操作元素属性操作元素的常用属性操作元素的样式属性操作表单元素…...

dvwa,xss反射型lowmedium

xss&#xff0c;反射型&#xff0c;low&&medium low发现xss本地搭建实操 medium作为初学者的我第一次接触比较浅的绕过思路high low 发现xss 本关无过滤 <script>alert(/xss/)</script> //或 <script>confirm(/xss/)</script> //或 <scr…...

从云计算到物联网:虚拟化技术的演变与嵌入式系统的融合

文章目录 一、硬件性能提升&#xff1a;摩尔定律与嵌入式虚拟化二、CPU多核技术&#xff1a;为嵌入式虚拟化提供支持三、业务负载整合&#xff1a;嵌入式虚拟化的核心需求四、降低硬件成本&#xff1a;虚拟化技术的经济效益五、软件重用与移植&#xff1a;虚拟化技术的优势六、…...

linux 文件查看 head 、 cat 、 less 、tail 、grep

查看文件详细信息 stat 文件 cat 》》适合显示小文件【行数比较少】&#xff0c;如果行数较多&#xff0c;屏幕显示不完整&#xff08;如果虚拟操作&#xff0c;是无法上下键的&#xff0c;或者滚动鼠标的&#xff0c;第三方 xsheel&#xff0c;crt 可以方向键查看&#xf…...

13.2 Web与Servlet进阶(❤❤)

13.2 Web与Servlet进阶 1. 请求与响应1.1 URL与URI1.2 HTTP请求的结构1. 结构2.后端获取访问工具类型:getHeader().toLowerCase方法1.3 响应的结构1. 结构2. 响应常见状态码3. 后端设置响应参数4. 响应的ContentType作用1.4 请求转发与响应重定向应用1. 请求转发:getRequestDis…...

记录解决报错--vue前后端分离,接口401(Unauthorized)

1.场景 前端访问不了后端接口。报错401。 2.解决步骤 ①在页面console.log(111)查看走到代码的位置没有。&#xff08;走到了&#xff0c;没问题&#xff09; ②查看vue.config.js配置。这段配置就是vue访问api的url。&#xff08;没问题&#xff09; devServer: {port: 80…...

【杂谈】-递归进化:人工智能的自我改进与监管挑战

递归进化&#xff1a;人工智能的自我改进与监管挑战 文章目录 递归进化&#xff1a;人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管&#xff1f;3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

C++中string流知识详解和示例

一、概览与类体系 C 提供三种基于内存字符串的流&#xff0c;定义在 <sstream> 中&#xff1a; std::istringstream&#xff1a;输入流&#xff0c;从已有字符串中读取并解析。std::ostringstream&#xff1a;输出流&#xff0c;向内部缓冲区写入内容&#xff0c;最终取…...

PL0语法,分析器实现!

简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

Swagger和OpenApi的前世今生

Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章&#xff0c;二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑&#xff1a; &#x1f504; 一、起源与初创期&#xff1a;Swagger的诞生&#xff08;2010-2014&#xff09; 核心…...

论文笔记——相干体技术在裂缝预测中的应用研究

目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术&#xff1a;基于互相关的相干体技术&#xff08;Correlation&#xff09;第二代相干体技术&#xff1a;基于相似的相干体技术&#xff08;Semblance&#xff09;基于多道相似的相干体…...

【C++进阶篇】智能指针

C内存管理终极指南&#xff1a;智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...

Redis:现代应用开发的高效内存数据存储利器

一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发&#xff0c;其初衷是为了满足他自己的一个项目需求&#xff0c;即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源&#xff0c;Redis凭借其简单易用、…...

淘宝扭蛋机小程序系统开发:打造互动性强的购物平台

淘宝扭蛋机小程序系统的开发&#xff0c;旨在打造一个互动性强的购物平台&#xff0c;让用户在购物的同时&#xff0c;能够享受到更多的乐趣和惊喜。 淘宝扭蛋机小程序系统拥有丰富的互动功能。用户可以通过虚拟摇杆操作扭蛋机&#xff0c;实现旋转、抽拉等动作&#xff0c;增…...

Qt 事件处理中 return 的深入解析

Qt 事件处理中 return 的深入解析 在 Qt 事件处理中&#xff0c;return 语句的使用是另一个关键概念&#xff0c;它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别&#xff1a;不同层级的事件处理 方…...

Python实现简单音频数据压缩与解压算法

Python实现简单音频数据压缩与解压算法 引言 在音频数据处理中&#xff0c;压缩算法是降低存储成本和传输效率的关键技术。Python作为一门灵活且功能强大的编程语言&#xff0c;提供了丰富的库和工具来实现音频数据的压缩与解压。本文将通过一个简单的音频数据压缩与解压算法…...