Linux sched_core核心调度cookie匹配与强制idle
Linux sched_core核心调度cookie匹配与强制idlesched_core是CONFIG_SCHED_CORE引入的SMT同步调度机制解决超线程环境下同核两个硬件线程执行不同trust domain任务的侧信道安全问题。每个task_struct携带一个unsigned long cookiecore_cookie通过prctl(PR_SET_CORE_SCHED_CTX)或cgroup的cpu.core_tag接口设置。核心调度决策的核心约束是同一个物理核心上的两个硬件线程CPU必须同时运行cookie相同的任务否则其中一个线程必须强制idle。cstruct task_struct {#ifdef CONFIG_SCHED_COREunsigned long core_cookie; /* 核心调度cookie */#endif};struct rq {#ifdef CONFIG_SCHED_COREunsigned int core_enabled; /* 该CPU是否开启了核心调度 */unsigned int core_forceidle; /* 是否处于强制idle状态 */unsigned int core_forceidle_occupation;struct cpumask *core_pick_mask; /* 已挑选的任务集合 */#endif};核心调度的任务选择入口在__schedule()的pick_next_task()中。标准pick_next_task经过stop_sched_class - idle_sched_class - ... - fair_sched_class的优先级遍历在sched_core模式下被替换为sched_core_pick_next_task()。该函数为同一个物理核心上的每个CPU选择任务时强制校验cookie匹配约束。c#ifdef CONFIG_SCHED_COREstatic struct task_struct *sched_core_pick_next_task(struct rq *rq){struct task_struct *next, *p;struct rq *core_rq;int cpu, core_cpu cpu_of(rq);if (!rq-core_enabled)return pick_next_task(rq);core_rq rq-core_rq; /* 指向同核master rq */if (rq ! core_rq)return core_rq-core_pick_task; /* 从伙伴CPU的pick结果获取 *//* master CPU负责为整个核心做cookie匹配 */for_each_cpu_and(cpu, cpu_smt_mask(core_cpu), cpu_online_mask) {struct rq *sibling_rq cpu_rq(cpu);struct task_struct *sibling_curr sibling_rq-curr;/* 优先选择cookie匹配的任务 */next pick_next_task(sibling_rq);if (next next-core_cookie ! sibling_curr-core_cookie) {/* cookie不匹配查找匹配cookie的任务 */for_each_class(class) {p class-pick_task(sibling_rq);if (p p-core_cookie sibling_curr-core_cookie) {next p;break;}}}if (!next || next-core_cookie ! core_rq-core_pick_cookie) {/* 找不到匹配cookie的任务强制idle */next idle_sched_class.pick_task(sibling_rq);sibling_rq-core_forceidle 1;}__set_bit(cpu, core_rq-core_pick_mask);core_rq-core_pick_task next;}return core_rq-core_pick_task;}sched_core强制idle的触发条件是一个CPU选择了某个cookie的任务但核心上其他CPU在各自runqueue中都找不到相同cookie的可运行任务。此时pick_result中的core_forceidle被置位。强制idle状态下当前CPU的实际C-state不会进入深睡眠因为核心上的另一个线程还在运行共享L1 cacheidle thread通过play_dead或mwait的c1e浅睡眠轮询等待cookie匹配的任务到达。c/** sched_core的核心选择逻辑——pick_task迭代所有调度类* 返回与给定cookie匹配的任务找不到则返回NULL*/for_each_class(class) {p class-pick_task(rq);if (p (!cookie || p-core_cookie cookie)) {if (cookie)cookie_found true;next p;break;}}/* 如果找不到匹配cookie的任务强制idle */if (cookie !cookie_found) {rq-core_forceidle 1;next idle_sched_class.pick_task(rq);}cookie匹配的粒度是per-task。当任务通过execve()执行新程序时core_cookie不会被清除——它继承自父进程的prctl设置。但set_user()或seccomp事件可能通过security_task_alloc()钩子重置cookie。一个常见竞态是核心上的CPU0持有cookie A的任务正在运行CPU1的任务完成IO后wakeup但其cookie为B。此时CPU1在scheduler_tick的resched路径中检查到core力core_forceidle标记选择idle线程。但CPU1的__schedule()需要等待CPU0先完成当前调度周期——因为sched_core要求核心上所有CPU的pick_task在同一个rq-lock临界区内进行。core scheduler的deactivation路径也涉及cookie检查。当任务调用deactivate_task()如退出或阻塞时如果该任务是核心上最后一个携带特定cookie的任务则核心上所有CPU必须被重新pick_task——否则另一个CPU可能仍然拿着该cookie的idle强制并在等待一个已退出的任务。dequeue_task中通过sched_core_dequeue()检查是否需要触发core re-pickcstatic inline void sched_core_dequeue(struct rq *rq, struct task_struct *p){if (!sched_core_enabled(rq))return;/** 如果该任务是当前核心上该cookie的唯一任务* 标记core resched让所有CPU重新pick*/if (p-core_cookie task_on_rq_queued(p)) {struct task_struct *tmp;bool last true;for_each_online_cpu(cpu) {if (cpu cpu_of(rq))continue;tmp cpu_rq(cpu)-curr;if (tmp-core_cookie p-core_cookie task_on_rq_queued(tmp)) {last false;break;}}if (last || rq-core_forceidle) {/* 唤醒所有SMT兄弟CPU重新选择 */smt_mask cpu_smt_mask(cpu_of(rq));for_each_cpu_and(i, smt_mask, cpu_online_mask)resched_curr(cpu_rq(i));}}}sched_core的migration偏移处理存在一个显著性能折衷。当任务从cookie A的CPU migrate到cookie B的CPU时通过load balance它必须等待核心上其他所有CPU的当前任务完成——因为pick_next_task时无法在同一核心上混合不同cookie。社区解决方向是引入core-wide wakeup即wakeup路径检测到目标核心上正在运行不同cookie的任务时不立即唤醒而延迟到核心空闲。这通过TTWU_QUEUED - try_steal_cookie机制实现但仍处于experimental状态。另一个边界条件涉及PI优先级继承。持有mutex的任务cookie为A但被cookie B的高优先级任务等待时核心调度无法直接进行——因为mutex unlock发生在不同cookie的上下文。sched_core通过core_waiters计数器追踪当核心上等待锁的线程与持有者cookie不同时强制idle策略不应生效任务必须运行才能释放锁否则会导致ABBA死锁。

相关新闻

AI模型抽象层设计原理与工程实践:Models模块深度解析

AI模型抽象层设计原理与工程实践:Models模块深度解析

1. 项目概述:这不是一次简单的源码阅读,而是一场对模型抽象层的外科手术式解剖“verl 源码学习五 Models 模块深度解读”——这个标题里藏着一个被多数人忽略的关键信号:它不是在讲某个具体模型(比如BERT或ResNet)&…

2026/6/22 15:41:14阅读更多 →
NXP ISF框架实战:嵌入式多传感器融合开发的核心架构与避坑指南

NXP ISF框架实战:嵌入式多传感器融合开发的核心架构与避坑指南

1. 项目概述:从零构建嵌入式智能传感系统的核心框架在嵌入式开发领域,尤其是涉及多传感器融合的物联网(IoT)或智能硬件项目里,开发者常常面临一个经典难题:如何高效、稳定地管理来自不同物理接口&#xff0…

2026/6/22 15:36:11阅读更多 →
Steamless:3分钟学会移除Steam游戏DRM,真正拥有你的游戏

Steamless:3分钟学会移除Steam游戏DRM,真正拥有你的游戏

Steamless:3分钟学会移除Steam游戏DRM,真正拥有你的游戏 【免费下载链接】Steamless Steamless is a DRM remover of the SteamStub variants. The goal of Steamless is to make a single solution for unpacking all Steam DRM-packed files. Steamles…

2026/6/22 15:36:11阅读更多 →
终极免费高效:macOS菜单栏管理神器Ice完整指南

终极免费高效:macOS菜单栏管理神器Ice完整指南

终极免费高效:macOS菜单栏管理神器Ice完整指南 【免费下载链接】Ice Powerful menu bar manager for macOS 项目地址: https://gitcode.com/GitHub_Trending/ice/Ice Ice是一款功能强大的macOS菜单栏管理工具,专为整理杂乱菜单栏而设计&#xff0…

2026/6/22 16:51:48阅读更多 →
DeepSeek-V4 Infra:AI原生基础设施的硬件拓扑契约

DeepSeek-V4 Infra:AI原生基础设施的硬件拓扑契约

1. DeepSeek-V4 Infra 不是“部署一套K8s”那么简单:先拆解它到底在解决什么问题 你点开那个 GitLab CI/CD 配置页,看到 infra/apppipeline 路径和 js-runners-settings 标签,第一反应可能是:“哦,配个 runner&…

2026/6/22 16:51:48阅读更多 →
NSK滚珠丝杠RMA1002C7S-250技术指南

NSK滚珠丝杠RMA1002C7S-250技术指南

为您详细整理 RMA1002C7S-250 滚珠丝杠的完整参数规格、技术特点及产品应用。 | 编码 | 属性 | 数据 | 内容 | |------|------|--------|------| | A | 联 | 133 | 许 | | B | 系 | 2798 | 经 | | C | 我 | 2959 | 理 |该型号属于 NSK 搬运用滚…

2026/6/22 16:51:48阅读更多 →
Better Terrain:Godot 4地形系统终极优化指南

Better Terrain:Godot 4地形系统终极优化指南

Better Terrain:Godot 4地形系统终极优化指南 【免费下载链接】better-terrain Terrain plugin for Godot 4 项目地址: https://gitcode.com/gh_mirrors/be/better-terrain 你是否在为Godot 4的TileMap地形系统感到困惑?面对繁琐的配置、低下的运…

2026/6/22 16:51:48阅读更多 →
ComfyUI-LTXVideo:零基础玩转AI视频生成,让你的想象动起来!

ComfyUI-LTXVideo:零基础玩转AI视频生成,让你的想象动起来!

ComfyUI-LTXVideo:零基础玩转AI视频生成,让你的想象动起来! 【免费下载链接】ComfyUI-LTXVideo LTX-Video Support for ComfyUI 项目地址: https://gitcode.com/GitHub_Trending/co/ComfyUI-LTXVideo 想象一下,你有一个视频…

2026/6/22 16:51:48阅读更多 →
Seedance 2.0电影级AI视频生成的合规风险与技术解构

Seedance 2.0电影级AI视频生成的合规风险与技术解构

1. 项目概述:当“电影级画面”撞上合规红线最近在几个AI视频创作群和设计类社区里,几乎每天都能刷到“Seedance 2.0”这个词——有人发对比图,说用它生成的《赛博敦煌》短片连运镜节奏都像院线预告;有人贴出3秒成片的流程录屏&…

2026/6/22 16:46:46阅读更多 →
【人工智能】一文搞定到底什么是智能体

【人工智能】一文搞定到底什么是智能体

【人工智能】一文搞定到底什么是智能体 一文搞定到底什么是智能体【人工智能】一文搞定到底什么是智能体一. LM,WorkFlow,Agent分别有什么么不同二. Agent的思考过程是怎样的三. Agent的五个核心部分1)LLM2)Prompt3)Me…

2026/6/22 6:01:42阅读更多 →
嵌入式GUI控件实战:ROTARY、SCROLLBAR、SLIDER原理与应用

嵌入式GUI控件实战:ROTARY、SCROLLBAR、SLIDER原理与应用

1. 嵌入式GUI控件:从原理到实战的深度解析在嵌入式系统开发中,图形用户界面(GUI)的设计与实现往往是项目从“能用”到“好用”的关键一跃。不同于资源充沛的PC或移动平台,嵌入式设备的GUI需要在有限的CPU性能、内存空间…

2026/6/22 1:15:34阅读更多 →
Google AI Studio 300美元额度的真相与实战指南

Google AI Studio 300美元额度的真相与实战指南

1. 这300美金不是“送钱”,而是Google埋下的第一道技术门槛 你看到标题里那个醒目的“$300美金”时,第一反应可能是:又一个免费额度?领完就完事?我亲手试过——这300美金根本不是红包,而是一张入场券&…

2026/6/22 5:42:46阅读更多 →
Codex本地AI编码代理与CC Switch协议适配实战

Codex本地AI编码代理与CC Switch协议适配实战

1. Codex不是“另一个VS Code插件”,而是本地AI编码代理的临界点Codex这个名字,现在被太多人误读了。它不是ChatGPT那个早已停更的旧模型代号,也不是某个新出的VS Code扩展图标——它是2024年中后期悄然浮出水面的一类本地化AI编码代理&#…

2026/6/22 0:04:18阅读更多 →
从MSP430到Flexis QE128:8/32位MCU无缝迁移与低功耗设计实战

从MSP430到Flexis QE128:8/32位MCU无缝迁移与低功耗设计实战

1. 项目概述:当8位MCU遇到性能瓶颈,我们如何优雅升级?在嵌入式开发领域,尤其是电池供电的便携式设备、工业传感器节点或智能家居终端中,我们常常面临一个经典的两难选择:是选择功耗极低但性能有限的8位微控…

2026/6/22 0:04:18阅读更多 →
大语言模型空间推理能力提升:TEXT2SPACE数据集与ASCII增强技术解析

大语言模型空间推理能力提升:TEXT2SPACE数据集与ASCII增强技术解析

1. 项目缘起:当大语言模型“看”不懂空间 最近在折腾大语言模型(LLM)的各种应用时,我发现一个挺有意思的现象:你让模型写首诗、写代码、甚至做逻辑推理,它可能都表现得有模有样。但一旦涉及到需要理解“空间…

2026/6/22 0:04:18阅读更多 →