8. 中断下半页 与 延迟处理

目录

中断下半页

软中断

Tasklet

Work Queues

回顾一下

Reference


(偷个懒:这里不将怎么用hhh)

我们现在开始考虑中断的部分了。我们直到处理设备(不管是CPU自己的还是外部设备的)的中断是操作系统的一个重要任务。

我们说中断是异步的——我们不知道何时会来中断:一旦来了,就会打断当前的执行上下文督促操作系统进行处理,同样的,还不可以滞留过久,否则将会影响用户的体验

注意到:我们更青睐于那些可以被中断的中断(Interrruptable Interrupt),也就是那些一旦发生了其他中断我们仍能接受并处理而不是丢失,比起来,那些屏蔽了中断的中断则很有可能会导致中断的丢失

以及我先说的是:中断运行在中断上下文!

中断下半页

我们提升用户体验的办法就是拆分中断处理的流程:接受中断(Interrupt Handlers)和处理中断(Bottom Halves),上半部分要求经可能的防止阻塞,将耗时的操作放到下半部分。一个可以遵循的准则是:

  1. 如果某些工作对时间非常敏感,必须马上处理,那么就放在上半部做;

  2. 如果某些工作和hardware直接相关,那么就放在上半部做;

  3. 如果某些工作要求不能同样的中断抢占,那么放在上半部做(因为上半部是关掉这个中断的);

  4. 其他的工作,考虑放到下半部来做。

在kernel比较早的的版本中,下半部是用的BH interface,这些interface在现在已经不用了。当时的实现,是有一个global的静态创建的32个下半部的list,上半部通过设置32bit中的一个,来决定哪个下半部执行,并且在系统中,同一个时间只能有一个下半部执行。这个我们现在不关心。我们关心的是比较新的Task Queue和Softirqs(软中断)和Taskle。

软中断

嗯,具备原子性:也就是说,排除真正的硬中断处理器句柄以外,软处理句柄是优先级最高的,他也只能被硬中断处理器句柄中断(遇到真货了)

通过NR_SOFTIRQS的定义,我们可以看到系统中会存在很多的softirq类型,每个softirq类型是否会被调用,取决于它是否被marked。通常来说,在interrupt handler返回之前,会把需要调用的softirq mark,这个过程称为raising softirq。这样在将来的某个时刻,kernel检查到某个softirq被mark,就会调用它。检查并调用的过程发生在:

  1. 在hardware interrupt code返回时。(也就是interrupt handler执行结束,要返回时)

  2. 在ksoftirqd线程中。

  3. 其他显示指明要检查并调用相应softirq的code中,比如network子系统。

Tasklet

/* Tasklets --- multithreaded analogue of BHs.
​Main feature differing them of generic softirqs: taskletis running only on one CPU simultaneously.
​Main feature differing them of BHs: different taskletsmay be run simultaneously on different CPUs.
​Properties:* If tasklet_schedule() is called, then tasklet is guaranteedto be executed on some cpu at least once after this.* If the tasklet is already scheduled, but its execution is still notstarted, it will be executed only once.* If this tasklet is already running on another CPU (or schedule is calledfrom tasklet itself), it is rescheduled for later.* Tasklet is strictly serialized wrt itself, but notwrt another tasklets. If client needs some intertask synchronization,he makes it with spinlocks.*/
​
struct tasklet_struct
{struct tasklet_struct *next;unsigned long state;/*state是tasklet的状态,有以下几种值:TASKLET_STATE_SCHED表示tasklet已经被调度,准备运行TASKLET_STATE_RUN表示tasklet正在运行。*/atomic_t count; // count是tasklet的reference counter,如果不是0,说明tasklet被disable,不能被运行;如果是0,表示可以运行。void (*func)(unsigned long);unsigned long data;
};

tasklet是在softirqs的基础上实现的,但是应用起来更简单。比起softirqs,大多数时候都是使用tasklet。非常简单,只要调用相应的函数即可。

两个tasklet不能同时concurrently;和softirqs一样,tasklet不能sleep。在其他中断运行的时候(因为是下页,其他中断当然可以运行)如果当前的下页和中断有share data,需要考虑同步的问题。

值得注意的是,softirqs是可以自我启动的,为了解决陷入自我循环中,浪费大量的系统资源。一种方式是不去处理这个softirqs的reactivated,直到它的interrupt handler再次出现才执行。另一种方式是,使用一个叫ksoftirqs的kernel thread去处理这些自启动,但是设定其优先级较低,使其在资源不紧张时调用。

被调度的tasklet存储在两个per CPU的数据结构中,这两个数据结构分别是:tasklet_vec和tasklet_hi_vec。这两个数据结构都是list,里面是等待被执行的tasklet,tasklet_vec中对应的是TASKLET_SOFTIRQ,tasklet_hi_vec对应的是HI_SOFTIRQ。前者通过tasklet_schedule来调度,后者通过tasklet_hi_schedule来调度,这两个函数的参数都是tasklet_struct的指针,并且功能类似

我们来看看Tasklets是如何被调度的:

  1. 首先检查tasklet的状态是不是TASKLET_STATE_SCHED,如果是那么实际上就是准备运行了直接返回

  2. 发起__tasklets_scheduled()

  3. 保存中断系统的状态然后禁用本地中断。这将会保证调度不会发生混乱

  4. 然后添加到调度的头区

  5. 然后发出一个Tasklet_softirq这样的话我们的do_softirq继续完成真正的处理工作

  6. 然后恢复状态返回

Work Queues

work queue和我们之前看到的所有bottom half都不一样,因为它是运行在process context中,也就是说它可以sleep,可以等I/O,可以分配memory,可以等待semaphore等等,使用work queue对下半部的实现几乎没有要求,kernel的绝大部分函数都能调用。

work queue也需要kernel来调度,并且调度的时间是不确定的。从这些方便看,使用work queue完全可以使用自己创建的kthread来代替,是的,kernel的实现也是通过per CPU的work thread来实现的,不过从device driver的角度看,直接使用work queue可以免去创建kthread和维护它的麻烦,稍微方便一些

回顾一下

选择哪一种下半部,取决于driver的需求,根据driver功能的不同,或者不同的特点,选择合适的下半部。

softirq,从它本身的性质看,比较适合高度并行化的工作,因为相同type的softirq可以同时运行在多个CPU上,高度并行化的工作可以充分利用softirq的这种性质;如果涉及到共享的数据,那就需要加锁保护,破坏了softirq并行化的机制。

tasklet,基于softirq,但是和softirq又有不同,最大的不同点在于相同的tasklet不支持同时运行在多个CPU上,这样对于device driver而言更加适合,因为tasklet handler往往需要处理数据,串行执行,可以保证driver在handler中不用加锁

如果下半部只能运行在process context中,那么work queue就是唯一的选择了。work queue相较于softirq和tasklet来说,因为使用了kthread,所以涉及到context switch,导致性能不如softirq和tasklet。

总结来说,driver绝大部分情况只需要在tasklet和work queue之间做出选择:如果下半部需要在将来的某个时刻调用,或者其中会导致sleep,就使用work queue,否则使用tasklet。

Reference

[Bottom Halves and Deferring Work LKD 08] - gapofsky - 博客园 (cnblogs.com)

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

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

相关文章

柱状图展示异步统计数据

PC端 APP端 Controller层 package com.cnpc.dj.party.controller;import com.alibaba.fastjson.JSONObject; import com.cnpc.dj.common.JsonResult; import com.cnpc.dj.common.context.BaseContextHandler; import com.cnpc.dj.common.utils.DateUtils; import com.cnpc.dj.…

js的算法-交换排序(快速排序)

快速排序 基本思想 快速排序的基本思想是基于分治法的:在待排序表L【1...n】中任意取一个元素p 作为枢轴(或基准,通常取首元素)。通过一趟排序将待排序表划分为独立的两部分L【1...k-1】和L【k1...n】;这样的话,L【1…

【视觉论文】VIT - Vision Transformers

论文:AN IMAGE IS WORTH 16X16 WORDS: TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE 链接:https://arxiv.org/abs/2010.11929 很多人博主都写烂了的论文,我到现在才真正翻开论文看,21年的工作,正好是刚毕业那年&…

分析 MyBatis/MyBatis-Plus 慢 SQL 的分析组件 --SQL 慢镜️‍♀️

大家好!我是聪ζ🌱我做了一个分析 MyBatis/MyBatis-Plus 慢 SQL 的分析组件 --SQL 慢镜🕵️‍♀️ GitHub仓库地址🚀: https://github.com/lhccong/sql-slow-mirror 点点 star 我的朋友们✨ 背景🧊: 大家…

使用autocannon和0x对网站进行性能分析(node)

npm i autocannon -g autocannon -c 100 -d 5 -p 10 http://localhost:3000/ 0x -o app.js 火焰图是根据程序的栈的状态对出现函数的采样数据统计而得,宽度代表函数运行一次所需的时长、高度代表栈的层数、颜色深度代表函数在采样中出现的频率,因此宽度…

Python-GEE遥感云大数据分析、管理与可视化

原文链接:Python-GEE遥感云大数据分析、管理与可视化https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247601238&idx2&sn6b0557cf61451eaff65f025d648da869&chksmfa820db1cdf584a76de953b96519704177e6206d4ecd47a2f2fabbcac2f7ea619b0bce184…

标准版/开源版 移动端新增页面使用文档

在标准版开发的实际使用中,随着用户移动端的产品和信息内容不断增多,新增页面来展示对应的产品详情、模块等内容。针对一些概念或者步骤较多的内容,可以新增子页面构建多级模块结构,帮助用户快速定位。 下面就如何新增页面做一讲…

2024深圳杯数学建模挑战赛B题:批量工件并行切割下料问题思路代码成品论文分析

更新完整代码和成品完整论文 《2024深圳杯&东三省数学建模思路代码成品论文》↓↓↓ https://www.yuque.com/u42168770/qv6z0d/zx70edxvbv7rheu7?singleDoc# 问题重述 深圳杯数学建模挑战赛2024B题:批量工件并行切割下料问题 板材切割下料是工程机械领域重要…

qmt教程1---qmt安装,提供下载链接

以前写的qmt不太完善现在重新好好的学习一下qmt,重新封装qmt,使用方便 1第一步下载qmt 点击安装 下一步 下一步 默认路径,安装完成 2登录qmt,选择行情加交易,选择极简模式 登录情况 我把qmt上线了 比如我们获取一分钟…

利用ollama和open-webui本地部署通义千问Qwen1.5-7B-Chat模型

目录 1 安装ollama 2 安装open-webui 2.1 镜像下载 3 配置ollama的模型转换工具环境 3.1 下载ollama源码 3.2 下载ollama子模块 3.3 创建ollama虚拟环境 3.4 安装依赖 3.5 编译量化工具 7 创建ollama模型 8 运行模型 参考文献: 1 安装ollama curl -fsSL …

算法训练营day15

一、层序遍历 参考链接7.2 二叉树遍历 - Hello 算法 (hello-algo.com) 层序遍历本质上属于广度优先遍历,也称广度优先搜索, BFS通常借助队列的先入先出的特性实现 参考链接102. 二叉树的层序遍历 - 力扣(LeetCode) 像这种较为…

2SD1666 封装TO-220F 实物拍摄 功能介绍

2SD1666 是一款 NPN 硅晶体管,适合于低频和音频放大以及开关应用。以下是它的主要功能和参数的详细介绍:功能:低频放大: 适用于音频放大器和其他低频放大应用。 开关: 可用于电源开关和电机控制等应用。 主要参数:极限工作电压 (VCEO): 60V 最大电流允许…