惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

H
Help Net Security
爱范儿
爱范儿
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
博客园 - 三生石上(FineUI控件)
大猫的无限游戏
大猫的无限游戏
Hugging Face - Blog
Hugging Face - Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Vercel News
Vercel News
人人都是产品经理
人人都是产品经理
G
Google Developers Blog
WordPress大学
WordPress大学
S
SegmentFault 最新的问题
雷峰网
雷峰网
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Jina AI
Jina AI
博客园 - 叶小钗
D
DataBreaches.Net
D
Docker
月光博客
月光博客
博客园 - 司徒正美
Last Week in AI
Last Week in AI
有赞技术团队
有赞技术团队
腾讯CDC
酷 壳 – CoolShell
酷 壳 – CoolShell

博客园_首页

Plist 二进制格式 Milvus 和 PGVector,哪个更好? OpenClaw 已过时?在 VS Code 中运行 Hermes Agent! 第30篇文章:一个大三计科生的自白 Manim如何在数学公式中完美显示中文? Docker 部署 RocketMQ 5 并发编程核心概念辨析 C#事务处理最佳实践:别再让“主表存了、明细丢了”的破事发生 CLI 是什么?为什么大厂突然集体卷命令行? 【从0到1构建一个ClaudeAgent】协作-自主Agent UIImageView 设置图片不生效的原因排查 最小二乘问题详解20:无先验约束下的增量式SFM自由网平差 痞子衡嵌入式:大话双核i.MXRT1180之XIP应用里借助MU实现可靠Flash IAP的方法 AI Chat 封装, SemanticKerne.AiProvider.Unified 已发布 Windows下右键编辑js文件无法打开记事本——在注册表中使用环境变量 在后台服务中使用 Scoped 服务,为什么总是报错? H200 安装驱动并使用sglang启动模型 wireshark 抓包Trap上报告警内容 我用 AI 辅助开发了一系列小工具(2):图片压缩工具 [A Primer On MC and CC] 2.1 Memory Consistency 1 - 指令重排序和 SC 模型 Oracle数据库SCN推进技术详解与实践指南 玩转控件:封装个带图片的Label控件 Claude Code 4.7 真正该升级的不是模型,而是你的工作流 前端小白一句话,AI 帮我做了个颜值拉满的桌面媒体播放器。当代码不再是门槛,一句话编程就是现实。 5. WorkBuddy: 小龙虾的灵魂三件套,让你的小龙虾不只是工具 SQLite 分片方案实战:三种分片策略的深度对比 告别简陋 UI!一款基于 Fluent Design 和基于 WinUI 的开源免费、现代化的 Avalonia UI 控件库 关于二进制排列组合枚举的总结 AI开发-python-LangGraph框架(3-27-LangGraph从零实现大模型智能决策工作流) ElasticSearch主分片和副本分片概念详解
PREEMPT_RT 技术实现:Threaded interrupt handler
神经蛙(找工作中) · 2026-05-03 · via 博客园_首页

中断线程化,使得高优先级的中断变成了普通的内核线程,和其他程序共用CPU,通过优先级来决定谁能够获取CPU的使用权。将一些不重要的中断改在线程中执行,只要RT任务优先级比中断线程优先级高,就可以优先执行,以此来提高系统的实时性能

传统主线内核默认中断行为

普通硬中断上下文:关闭硬件中断,同时隐式禁止抢占、禁止软中断,中断处理全程在硬中断上下文执行。

为了清晰描述,我用excel画了下面这张图。从图中可以看到,硬中断、软中断、特定的tasklet都不在调度器的管辖范围内,运行在interrupt context中。无论是内核线程还是用户程序,在中断发生时,都需要立刻让出CPU的使用权。在实时系统中,其实很多中断所做的并不是特别重要的工作,或者说,即使有些许延迟,也是无关紧要的。主线内核中的默认中断行为,会严重影响RT任务的执行周期及抖动。

original-kernel-irq

PREEMPT_RT中的中断行为

PREEMPT_RT 默认强制开启线程化中断(threaded interrupts);除带 IRQF_NO_THREAD 标记的中断外,所有中断处理函数都运行在内核线程上下文,不再跑在硬中断上下文。

如下图所示,不重要的硬中断、所有软中断和tasklet都不在运行在interrupt context中,而是作为普通的内核线程,交给调度器,根据调度算法来决定是否可被抢占。换个说法就是,通过提高RT Task的优先级,在PREEMPT_RT kernel中,RT Task可以避免一些中断的干扰(传统内核中的中断,在PREEMPT_RT内核中已经变成了线程)。

preempt-kernel-irq

不会被线程化的中断
IRQF_NO_THREAD 标志的中断仍以原始硬中断方式运行、关硬件中断;

  • IPI 跨处理器中断 主动使用该标志
  • IRQF_TIMERIRQF_PER_CPU 类型中断隐式自带 IRQF_NO_THREAD,不会线程化。

线程化中断的线程属性
开启后,中断交由内核线程执行,调度策略为 SCHED_FIFO,默认优先级 50。

/*
 * Priority of a process goes from 0..MAX_PRIO-1, valid RT
 * priority is 0..MAX_RT_PRIO-1, and SCHED_NORMAL/SCHED_BATCH
 * tasks are in the range MAX_RT_PRIO..MAX_PRIO-1. Priority
 * values are inverted: lower p->prio value means higher priority.
 */

#define MAX_RT_PRIO		100

void sched_set_fifo(struct task_struct *p)
{
	struct sched_param sp = { .sched_priority = MAX_RT_PRIO / 2 };
	WARN_ON_ONCE(sched_setscheduler_nocheck(p, SCHED_FIFO, &sp) != 0);
}

/*
 * Interrupt handler thread
 */
static int irq_thread(void *data)
{
...
	sched_set_fifo(current);
...
}

本作品采用 CC BY-NC-SA 4.0 协议