Linux实时调度策略:SCHED_FIFO、SCHED_RR和SCHED_DEADLINE设置示例
一、前言
Linux 支持多种任务调度策略(Scheduling Policy),其中:
- 普通任务(SCHED_NORMAL) 是普通分时调度;
- 实时任务(SCHED_FIFO、SCHED_RR、SCHED_DEADLINE) 适用于对响应延迟、执行周期有严格要求的系统(如工业控制、音视频处理等)。
二、实时调度策略简介
| 调度策略 | 类型 | 优先级范围 | 时间片机制 | 特点 | 典型应用 |
|---|---|---|---|---|---|
| SCHED_FIFO | 实时调度 | 1–99 | 无时间片 | 高优先级任务永不主动让出 CPU,直到阻塞或结束 | 电机控制、传感器采样 |
| SCHED_RR | 实时调度 | 1–99 | 有时间片(默认 100ms) | 多个相同优先级任务轮流执行 | 多任务实时控制 |
| SCHED_DEADLINE | 实时调度 | 无优先级 | 通过 runtime/deadline/period 控制执行预算 | 最严格的周期性任务调度 | 视频渲染、实时信号处理 |
三、三种调度策略设置代码示例
SCHED_FIFO 测试程序
#define _GNU_SOURCE
#include <stdio.h>
#include <unistd.h>
#include <time.h>
#include <sys/prctl.h>
#include <pthread.h>
#include <sched.h>
int main() {
cpu_set_t mask;
CPU_ZERO(&mask);
CPU_SET(0, &mask);
if (sched_setaffinity(0, sizeof(mask), &mask) != 0)
perror("sched_setaffinity");
// 设置实时调度
struct sched_param param = { .sched_priority = 80 };
if (sched_setscheduler(0, SCHED_FIFO, ¶m) != 0)
perror("sched_setscheduler");
printf("Running under SCHED_FIFO with priority %d on CPU 0\n", param.sched_priority);
while (1) {
for (volatile int i = 0; i < 100000000; i++);
printf(".");
fflush(stdout);
usleep(500000); // 防止完全占满CPU
}
}编译与运行:
