当前位置: 首页 > news >正文

用pthread_setschedparam设置调度策略

目录

一、POSIX 标准调度策略

二、各策略的核心区别

1. SCHED_FIFO(先进先出)

2. SCHED_RR(时间片轮转)

3. SCHED_OTHER(默认策略)

三、优先级与抢占规则

四、设置调度策略的代码示例

五、其他扩展策略(非标准)

1. Linux 特有的策略

2. 其他系统的扩展

六、使用注意事项

七、总结


在 POSIX 线程库(pthread)中,pthread_setschedparam 函数用于设置线程的调度策略和优先级。POSIX 标准定义了三种基本调度策略,不同操作系统可能会扩展额外的策略。以下是对这些策略的详细介绍:

一、POSIX 标准调度策略

POSIX 标准定义的三种调度策略通过 sched.h 头文件中的宏表示:

策略宏数值描述优先级范围
SCHED_FIFO1先进先出实时调度策略1(最低)~ 99(最高)
SCHED_RR2时间片轮转实时调度策略1(最低)~ 99(最高)
SCHED_OTHER0默认非实时调度策略(CFS)0(唯一有效值)

二、各策略的核心区别

1. SCHED_FIFO(先进先出)
  • 特性
    • 线程一旦获得 CPU,将一直运行直到主动放弃(如调用 sched_yield())或被更高优先级线程抢占。
    • 同一优先级的线程按 FIFO 队列顺序执行。
    • 高优先级线程可能导致低优先级线程饥饿(长时间无法执行)。
  • 适用场景
    • 对响应时间要求极高的任务(如实时控制系统)。
    • 任务执行时间短且不适合被中断的场景。
  • 限制
    • 需要特权(通常需要 root 权限)才能设置。
    • 优先级范围为 1~99,数值越高优先级越高。
2. SCHED_RR(时间片轮转)
  • 特性
    • 与 SCHED_FIFO 类似,但每个线程执行一个时间片后,会被放入队列尾部,允许同优先级线程轮流执行。
    • 时间片长度由操作系统决定(如 Linux 中可通过 sched_rr_get_interval() 查询)。
    • 仍会抢占低优先级线程,但同一优先级内不会导致饥饿。
  • 适用场景
    • 同优先级任务需要公平共享 CPU 时间的实时场景。
    • 计算密集型实时任务,避免长时间独占 CPU。
  • 限制
    • 与 SCHED_FIFO 共享同一优先级范围(1~99)。
    • 需要特权权限。
3. SCHED_OTHER(默认策略)
  • 特性
    • 非实时策略,基于系统负载动态调整线程优先级。
    • 在 Linux 中实现为完全公平调度器(CFS),使用虚拟运行时间(vruntime)确保公平性。
    • 线程优先级只能通过 nice 值(-20~19)间接调整,且 nice 值仅影响调度权重,不直接映射到优先级数值。
  • 适用场景
    • 普通非实时应用(如桌面程序、服务器进程)。
    • 不需要严格实时保证的任务。
  • 限制
    • 无法设置绝对优先级,只能调整相对权重。
    • 优先级值固定为 0,通过 nice 值调整(nice 值越低,优先级越高)。

三、优先级与抢占规则

  1. 实时策略(SCHED_FIFO/SCHED_RR

    • 高优先级线程可立即抢占低优先级线程。
    • 同一优先级内,SCHED_FIFO 按 FIFO 顺序执行,SCHED_RR 按时间片轮转。
  2. 非实时策略(SCHED_OTHER

    • 无法抢占实时线程,只能在实时线程主动让出 CPU 时执行。
    • 线程间通过调度权重(由 nice 值决定)竞争 CPU 时间。

四、设置调度策略的代码示例

#include <pthread.h>
#include <sched.h>
#include <iostream>void* thread_func(void* arg) {// 获取当前线程IDpthread_t tid = pthread_self();// 设置线程属性为SCHED_FIFO,优先级50struct sched_param param;param.sched_priority = 50;if (pthread_setschedparam(tid, SCHED_FIFO, &param) != 0) {std::cerr << "Failed to set scheduling parameters" << std::endl;// 可能需要root权限}// 线程执行逻辑while (true) {// 高优先级任务...}return nullptr;
}int main() {pthread_t thread;pthread_attr_t attr;// 初始化线程属性pthread_attr_init(&attr);// 设置为分离状态pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);// 创建线程if (pthread_create(&thread, &attr, thread_func, nullptr) != 0) {std::cerr << "Failed to create thread" << std::endl;return 1;}// 销毁线程属性pthread_attr_destroy(&attr);// 主线程继续执行其他任务while (true) {// 低优先级任务...}return 0;
}

五、其他扩展策略(非标准)

部分操作系统可能提供额外的调度策略:

1. Linux 特有的策略
策略宏描述优先级范围
SCHED_BATCH批处理调度,适合非交互的 CPU 密集型任务同 SCHED_OTHER
SCHED_IDLE最低优先级,仅在系统空闲时执行同 SCHED_OTHER
SCHED_DEADLINE截止时间调度,适合有严格时间约束的任务需要特殊参数配置
2. 其他系统的扩展
  • FreeBSD:支持 SCHED_RRSCHED_FIFOSCHED_OTHER 及 SCHED_ULE(公平调度)。
  • Windows:通过 SetThreadPriority 和 SetProcessPriorityClass 实现类似功能,但命名和机制不同。

六、使用注意事项

  1. 权限要求
    设置实时调度策略(SCHED_FIFO/SCHED_RR)通常需要特权权限(如 root 或 CAP_SYS_NICE 能力)。

  2. 优先级范围
    实时策略的优先级范围为 1~99,数值越高优先级越高;SCHED_OTHER 的优先级固定为 0,通过 nice 值调整。

  3. 系统稳定性
    不当使用高优先级实时线程可能导致系统响应变慢甚至无响应(如所有 CPU 时间被高优先级线程占用)。

  4. 兼容性
    非标准策略(如 SCHED_BATCH)可能降低代码的可移植性。

七、总结

策略调度方式优先级范围抢占特性适用场景
SCHED_FIFO先进先出1~99高优先级可抢占短周期、响应敏感的实时任务
SCHED_RR时间片轮转1~99高优先级可抢占需要公平性的实时任务
SCHED_OTHER动态优先级(CFS)固定为 0不可抢占实时线程普通非实时应用

合理选择调度策略和优先级是实现高性能、高可靠性多线程应用的关键。实时策略应谨慎使用,避免影响系统整体稳定性。

http://www.lqws.cn/news/533071.html

相关文章:

  • Altera PCI IP target设计分享
  • STM32F103ZET6开发板【项目工程创建】+具体实现步骤流程
  • 构建高效字符串编解码系统:Prefix-Token-Suffix三元组方法
  • python pyecharts 数据分析及可视化
  • 创客匠人解析视频号公私域互通逻辑:知识变现的破圈与沉淀之道
  • [特殊字符]推客带货小程序解决方案——0门槛裂变营销,佣金赚不停!
  • 408考研逐题详解:2010年第7题——连通图的边
  • 代码随想录|图论|06岛屿数量(广搜BFS)
  • PhoneRescue 4.3绿色版!解决iPhone数据丢失、系统崩溃等场景
  • 单片机 - STM32F103“复用功能重映射”完整解析:从JTAG释放到TIM重映射实战详解
  • CTF:PHP 多关卡绕过挑战
  • 专注推理查询(ARQs):一种提升大型语言模型指令遵循度、决策准确性和防止幻觉的结构化方法
  • 【攻防篇】解决:阿里云docker 容器中自动启动xmrig挖矿
  • ISP Pipeline(5): Auto White Balance Gain Control (AWB) 自动白平衡
  • 数据结构大项目
  • react - ReactRouter—— 路由传参
  • 【STM32 学习笔记】PWR电源控制
  • Java 大视界 -- 基于 Java 的大数据可视化在智慧城市能源消耗动态监测与优化决策中的应用(324)
  • 【linux】全志Tina配置swupdate工具进行分区打包
  • 《PT100两线制温度测量系统设计:从电路原理到嵌入式实现》
  • 【嵌入式ARM汇编基础】-ELF文件格式内部结构详解(二)
  • 香港政府发表《香港数字资产发展政策宣言 2.0》,提出「LEAP」框架
  • 星型模式(Star Schema)
  • lua脚本为什么能保证原子性
  • 云效代码仓库导入自建gitlab中
  • Redis核心知识详解:从全局命令到高级数据结构
  • 首款SUV小米YU7、小米AI眼镜等新品重磅发布,玄戒O1超大规模量产
  • 湖北理元理律师事务所:科学债务优化如何守护民生底线
  • MySQL 总是差八个小时,如何破?
  • Linux中部署Jenkins保姆间教程