当前位置: 首页 > 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…...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程&#xff1a;&#xff08;白话解释&#xff09; 我们将原始待发送的消息称为 M M M&#xff0c;依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)&#xff08;意思就是 G &#xff08; x ) G&#xff08;x) G&#xff08;x) 是已知的&#xff09;&#xff0…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指&#xff1a;像函数调用/返回一样轻量地完成任务切换。 举例说明&#xff1a; 当你在程序中写一个函数调用&#xff1a; funcA() 然后 funcA 执行完后返回&…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)

0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述&#xff0c;后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作&#xff0c;其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日&#xff0c;中天合创屋面分布式光伏发电项目顺利并网发电&#xff0c;该项目位于内蒙古自治区鄂尔多斯市乌审旗&#xff0c;项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站&#xff0c;总装机容量为9.96MWp。 项目投运后&#xff0c;每年可节约标煤3670…...

HBuilderX安装(uni-app和小程序开发)

下载HBuilderX 访问官方网站&#xff1a;https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本&#xff1a; Windows版&#xff08;推荐下载标准版&#xff09; Windows系统安装步骤 运行安装程序&#xff1a; 双击下载的.exe安装文件 如果出现安全提示&…...

蓝桥杯3498 01串的熵

问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798&#xff0c; 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...

React---day11

14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store&#xff1a; 我们在使用异步的时候理应是要使用中间件的&#xff0c;但是configureStore 已经自动集成了 redux-thunk&#xff0c;注意action里面要返回函数 import { configureS…...

GruntJS-前端自动化任务运行器从入门到实战

Grunt 完全指南&#xff1a;从入门到实战 一、Grunt 是什么&#xff1f; Grunt是一个基于 Node.js 的前端自动化任务运行器&#xff0c;主要用于自动化执行项目开发中重复性高的任务&#xff0c;例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...

MySQL 知识小结(一)

一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库&#xff0c;分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷&#xff0c;但是文件存放起来数据比较冗余&#xff0c;用二进制能够更好管理咱们M…...