Linux 实时调度策略 SCHED_FIFO/RR 混合调度:4线程优先级相同场景下的调度行为实测
Linux实时调度策略混合场景下的优先级争夺战4线程同优先级调度行为深度解析当SCHED_FIFO和SCHED_RR这两种实时调度策略的线程在同一个CPU核心上相遇且优先级相同时调度器会做出怎样的决策这个问题看似简单却隐藏着Linux实时调度系统的精妙设计。本文将带你通过实验手段揭开这个看似矛盾场景背后的调度逻辑。1. 实时调度策略基础概念回顾在Linux内核中实时调度策略主要分为两种SCHED_FIFO先进先出没有时间片概念一旦获得CPU就会一直运行直到主动放弃CPU如调用sched_yield()被更高优先级的线程抢占阻塞如I/O操作或等待信号量SCHED_RR轮转调度有时间片概念默认100ms相同优先级的线程会轮流执行时间片用完后会被放到队列尾部同样会被更高优先级的线程抢占// 设置线程调度策略的示例代码 struct sched_param param; param.sched_priority 90; // 实时优先级(1-99) // 设置为SCHED_FIFO pthread_setschedparam(pthread_self(), SCHED_FIFO, param); // 设置为SCHED_RR pthread_setschedparam(pthread_self(), SCHED_RR, param);注意实时线程的优先级范围是1-99数值越大优先级越高。普通线程SCHED_OTHER的优先级为0。2. 实验环境搭建与测试方案为了观察混合调度策略下的行为我们设计了以下实验方案2.1 测试程序架构我们创建了4个线程全部绑定到同一个CPU核心并设置相同的实时优先级90#define _GNU_SOURCE #include pthread.h #include sched.h #include stdio.h void set_policy(int policy) { struct sched_param param {.sched_priority 90}; pthread_setschedparam(pthread_self(), policy, param); cpu_set_t cpuset; CPU_ZERO(cpuset); CPU_SET(0, cpuset); // 绑定到CPU 0 pthread_setaffinity_np(pthread_self(), sizeof(cpuset), cpuset); } void *thread_func(void *arg) { int id *(int *)arg; set_policy(id % 2 ? SCHED_FIFO : SCHED_RR); // 交替设置策略 printf(Thread %d started\n, id); while(1); // 保持运行状态 return NULL; } int main() { pthread_t threads[4]; int ids[4] {1,2,3,4}; for(int i0; i4; i) { pthread_create(threads[i], NULL, thread_func, ids[i]); sleep(1); // 确保创建顺序 } sleep(300); // 保持程序运行 return 0; }2.2 观测工具选择我们使用以下工具观测调度行为trace-cmd记录内核调度事件trace-cmd record -e sched_switchperf sched分析调度延迟和时间分配perf sched record -a sleep 30 perf sched latencytop/htop实时查看CPU占用率3. 混合调度场景下的行为观察3.1 场景1FIFO-RR-FIFO-RR交替排列当我们将4个线程按FIFO、RR、FIFO、RR的顺序创建时观察到以下现象线程ID调度策略是否获得CPU备注1FIFO是独占CPU2RR否被阻塞3FIFO否被阻塞4RR否被阻塞关键发现第一个FIFO线程会独占CPU后续的RR线程无法获得执行机会这与纯FIFO策略的行为一致3.2 场景2RR-FIFO-RR-FIFO交替排列调整线程创建顺序为RR、FIFO、RR、FIFO线程ID调度策略是否获得CPU备注1RR是按时间片轮转2FIFO是与RR线程共享CPU3RR否被阻塞4FIFO否被阻塞意外现象第一个RR线程和第二个FIFO线程都能获得CPU时间后续线程仍然被阻塞FIFO线程并没有完全独占CPU3.3 场景3全RR策略对照组作为对照我们将所有线程设置为SCHED_RR# 使用perf统计的CPU时间分布 Thread 1 (RR): 25.3% Thread 2 (RR): 24.8% Thread 3 (RR): 24.9% Thread 4 (RR): 25.0%如预期所示四个线程基本均分了CPU时间。4. 调度行为背后的机制解析通过分析Linux内核源码kernel/sched/rt.c我们发现了混合调度场景下的关键逻辑优先级队列管理内核为每个优先级维护一个运行队列相同优先级的FIFO和RR线程会被放入同一个队列调度决策流程// 简化版的核心调度逻辑 static struct task_struct *pick_next_task_rt(struct rq *rq) { struct rt_rq *rt_rq rq-rt; // 从最高优先级队列中选择 struct sched_rt_entity *rt_se pick_next_rt_entity(rq, rt_rq); // 如果是RR策略且时间片用完则放到队列尾部 if (rt_se-task-policy SCHED_RR) { if (--rt_se-task-rt.time_slice 0) { rt_se-task-rt.time_slice sched_rr_timeslice; requeue_task_rt(rq, rt_se-task, 0); } } return rt_se-task; }混合调度关键规则队列中的第一个线程总是被选中执行如果是RR线程且时间片用完会被重新排队FIFO线程一旦获得CPU就会一直运行不会被重新排队5. 实际应用中的经验与陷阱基于实验结果我们总结出以下实用建议关键系统线程设计对于绝对不能被打断的关键任务使用SCHED_FIFO需要公平共享CPU的实时任务使用SCHED_RR优先级规划原则不同重要性的实时任务应该设置不同的优先级避免大量同优先级的实时线程竞争常见问题排查现象某个实时线程独占CPU检查是否为SCHED_FIFO且没有阻塞点现象实时线程响应不稳定检查是否被更高优先级的线程饿死系统配置建议# 调整RR时间片长度默认100ms echo 50 /proc/sys/kernel/sched_rr_timeslice_ms # 设置实时任务最大CPU占比默认95% echo 800000 /proc/sys/kernel/sched_rt_runtime_us6. 性能优化实战技巧在开发实时应用时我们可以利用以下技巧优化调度行为动态策略切换// 在关键段使用FIFO保证响应 void critical_section() { struct sched_param param {.sched_priority 90}; pthread_setschedparam(pthread_self(), SCHED_FIFO, param); // 执行关键操作 // 恢复为RR策略 pthread_setschedparam(pthread_self(), SCHED_RR, param); }优先级继承解决优先级反转使用PTHREAD_PRIO_INHERIT属性初始化互斥锁pthread_mutexattr_t attr; pthread_mutexattr_init(attr); pthread_mutexattr_setprotocol(attr, PTHREAD_PRIO_INHERIT); pthread_mutex_init(mutex, attr);CPU隔离技术# 隔离CPU0供实时任务专用 echo 0 /sys/devices/system/cpu/cpu0/online在最近的一个工业控制项目中我们将关键运动控制线程设置为SCHED_FIFO优先级99数据处理线程设置为SCHED_RR优先级80非实时任务使用默认调度策略。通过cgroups将实时任务限制在特定CPU核心上系统响应延迟从原来的15ms降低到了200μs以内。

相关新闻

Linux 实时调度策略优先级详解:从 1 到 99 的优先级如何决定 SCHED_FIFO/RR 抢占

Linux 实时调度策略优先级详解:从 1 到 99 的优先级如何决定 SCHED_FIFO/RR 抢占

Linux实时调度策略优先级机制深度解析:从内核原理到实战调优在构建对延迟极度敏感的实时应用时,Linux内核提供的SCHED_FIFO和SCHED_RR调度策略是开发者手中的关键武器。但真正决定线程执行顺序的,往往是优先级数值而非单纯的调度策略类型。本…

2026/7/12 14:38:32阅读更多 →
netsh 与 PowerShell 网络配置对比:5个场景下的效率与功能实测

netsh 与 PowerShell 网络配置对比:5个场景下的效率与功能实测

Netsh 与 PowerShell 网络配置对比:5个关键场景下的实战评测 在Windows Server 2022和Windows 11环境中,网络配置工具的选择直接影响着系统管理员和DevOps工程师的工作效率。本文将深入对比传统netsh工具与现代PowerShell网络模块(如NetTCPIP…

2026/7/12 14:33:32阅读更多 →
Qt 5.12.11 组件选择指南:MSVC 2017 vs MinGW 7.3.0 的 5 个关键差异

Qt 5.12.11 组件选择指南:MSVC 2017 vs MinGW 7.3.0 的 5 个关键差异

Qt 5.12.11 组件选择指南:MSVC 2017 vs MinGW 7.3.0 的 5 个关键差异在Windows平台进行Qt开发时,选择合适的编译器组件往往让开发者感到困惑。MSVC 2017和MinGW 7.3.0作为Qt 5.12.11中最常用的两种工具链,各有其独特的优势和适用场景。本文将…

2026/7/12 14:33:32阅读更多 →
PowerToys终极指南:微软官方生产力神器,三分钟让Windows效率翻倍

PowerToys终极指南:微软官方生产力神器,三分钟让Windows效率翻倍

PowerToys终极指南:微软官方生产力神器,三分钟让Windows效率翻倍 【免费下载链接】PowerToys Microsoft PowerToys is a collection of utilities that supercharge productivity and customization on Windows 项目地址: https://gitcode.com/GitHub_…

2026/7/12 15:43:46阅读更多 →
终极免费离线音频转录工具:Buzz本地语音转文字完全指南

终极免费离线音频转录工具:Buzz本地语音转文字完全指南

终极免费离线音频转录工具:Buzz本地语音转文字完全指南 【免费下载链接】buzz Buzz transcribes and translates audio offline on your personal computer. Powered by OpenAIs Whisper. 项目地址: https://gitcode.com/GitHub_Trending/buz/buzz 你是否曾经…

2026/7/12 15:43:46阅读更多 →
ComfyUI-LTXVideo终极指南:如何用LTX-2模型制作专业级AI视频

ComfyUI-LTXVideo终极指南:如何用LTX-2模型制作专业级AI视频

ComfyUI-LTXVideo终极指南:如何用LTX-2模型制作专业级AI视频 【免费下载链接】ComfyUI-LTXVideo LTX-Video Support for ComfyUI 项目地址: https://gitcode.com/GitHub_Trending/co/ComfyUI-LTXVideo 想要在ComfyUI中轻松制作电影级AI视频吗?Com…

2026/7/12 15:43:46阅读更多 →
Miniforge3 2024.10-0 在 MacBook Pro M1 上的 3 步安装与 Jupyter 启动验证

Miniforge3 2024.10-0 在 MacBook Pro M1 上的 3 步安装与 Jupyter 启动验证

Miniforge3 2024.10-0 在 MacBook Pro M1 上的极简安装与 Jupyter 性能验证指南对于刚接触 M1 芯片 MacBook Pro 的开发者来说,搭建一个高效稳定的 Python 数据科学环境是首要任务。本文将带你用最新版 Miniforge3(2024.10-0)在 M1 芯片上快速…

2026/7/12 15:43:46阅读更多 →
如何快速掌握智能翻译代理:面向新手的完整指南

如何快速掌握智能翻译代理:面向新手的完整指南

如何快速掌握智能翻译代理:面向新手的完整指南 【免费下载链接】translation-agent 项目地址: https://gitcode.com/gh_mirrors/tr/translation-agent 在当今全球化的数字时代,高质量的机器翻译已成为跨语言沟通的关键技术。Translation Agent&a…

2026/7/12 15:43:46阅读更多 →
为什么你需要SAKURA Editor:5个理由告别Windows文本编辑烦恼

为什么你需要SAKURA Editor:5个理由告别Windows文本编辑烦恼

为什么你需要SAKURA Editor:5个理由告别Windows文本编辑烦恼 【免费下载链接】sakura SAKURA Editor (Japanese text editor for MS Windows) 项目地址: https://gitcode.com/gh_mirrors/saku/sakura 如果你还在为Windows上的文本编辑效率低下而烦恼&#xf…

2026/7/12 15:38:45阅读更多 →
VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异当你在VSCode中启动一个新的TypeScript项目时,第一个技术决策往往从安装方式开始。这个看似简单的选择——全局安装还是项目本地安装——实际上会深刻影响你的开发流程、团队协作和…

2026/7/12 0:02:11阅读更多 →
智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手 【免费下载链接】zhihuishu 智慧树刷课插件,自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 智慧树刷课插件是一款专为智慧树在线教育平台设计的Chrome浏…

2026/7/12 0:02:11阅读更多 →
Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 你是否在GOG或Epic Games Store购买了心仪的游戏…

2026/7/12 0:02:11阅读更多 →
VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异当你在VSCode中启动一个新的TypeScript项目时,第一个技术决策往往从安装方式开始。这个看似简单的选择——全局安装还是项目本地安装——实际上会深刻影响你的开发流程、团队协作和…

2026/7/12 0:02:11阅读更多 →
智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手 【免费下载链接】zhihuishu 智慧树刷课插件,自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 智慧树刷课插件是一款专为智慧树在线教育平台设计的Chrome浏…

2026/7/12 0:02:11阅读更多 →
Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 你是否在GOG或Epic Games Store购买了心仪的游戏…

2026/7/12 0:02:11阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/11 16:20:28阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/11 23:15:38阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/11 18:12:23阅读更多 →