Linux中设置SCHED_FIFO或SCHED_RR本质是启用实时调度,需root权限或CAP_SYS_NICE能力,须禁用继承机制,优先级1–99(越大越高),FIFO适合硬实时,RR适合软实时。
Linux 中设置线程调度策略为 SCHED_FIFO 或 SCHED_RR,本质是启用实时调度能力,并配合静态优先级(1–99)控制执行顺序。这两者都属于实时策略,但行为差异明显,设置时需注意权限、继承关系和核心绑定等关键点。
普通用户默认只能降低自己的 nice 值(对 `SCHED_OTHER`),但无法设置 `SCHED_FIFO`/`SCHED_RR` 或提高实时优先级。系统限制要求: - 调用 `pthread_setschedparam()` 或 `sched_setscheduler()` 设置实时策略时,进程需具备 `CAP_SYS_NICE` 能力; - 通常意味着以 root 运行,或通过 `sudo setcap cap_sys_nice+ep ./your_program` 授予权限; - 若未获权限,函数返回 -1 并设 `errno = EPERM`。
新线程默认继承创建者的调度策略和参数。若想自定义 `SCHED_FIFO` 或 `SCHED_RR`,必须先禁用继承: - 调用 `pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED)`; - 否则即使设置了 policy 和 priority,也会被忽略; - 这一步常被遗漏,导致看似配置成功,实则线程仍跑在 `SCHED_OTHER` 下。
`SCHED_FIFO` 和 `SCHED_RR` 共享同一套优先级数值体系: - 有效值为 1 到 99,**数字越大,优先级越高**; - 可用 `sched_get_priority_min()` / `sched_get_priority_max()` 查询当前策略支持的范围; - 示例:`struct sched_param param = {.sched_priority = 80};`; - 注意:`SCHED_OTHER` 不使用该字段,它依赖 `nice` 值(-20 ~ +19),二者不可混用或直接比较。
选 `SCHED_FIFO` 还是 `SCHED_RR`,取决于任务对确定性和公平性的权衡: - `SCHED_FIFO`:同优先级下先到先服务,一旦运行就独占 CPU,直到阻塞、退出或被更高优先级抢占;适合硬实时场景(如传感器采样); - `SCHED_RR`:同优先级线程按固定时间片(通常 10–100ms)轮转,避免单一线程长期霸占 CPU;适合多路音视频处理等软实时任务; - 两者都可被更高优先级实时线程抢占,且始终高于所有 `SCHED_OTHER` 线程。