chrt
(Change Real-Time Scheduling)用于设置或获取进程的实时调度策略和优先级,适用于需要精确控制CPU资源的实时任务(如音频/视频处理、关键系统服务等)。支持的调度策略包括:
- SCHED_OTHER:默认调度策略(普通任务,优先级范围
-20
到19
)。 - SCHED_FIFO:先进先出实时调度(优先级
1
到99
)。 - SCHED_RR:轮询实时调度(优先级
1
到99
)。 - SCHED_BATCH:后台批处理任务(低优先级,Linux 特有)。
- SCHED_IDLE:空闲调度(最低优先级,Linux 特有)。
基本语法
# 设置新进程属性
chrt [选项] 优先级 命令 [参数...]
# 操作现有进程
chrt [选项] -p [优先级] PID
核心功能
-
设置新进程的调度策略:
chrt [策略选项] [优先级] [命令]
- 例如:
chrt -f 1 ls
- 使用
SCHED_FIFO
策略,优先级1
运行ls
。
- 使用
- 例如:
-
修改现有进程的调度属性:
chrt -p [策略选项] [优先级] [PID]
- 例如:
sudo chrt -r -p 50 1234
- 将 PID
1234
的进程设置为SCHED_RR
策略,优先级50
。
- 将 PID
- 例如:
-
查看进程的调度信息:
chrt -p [PID]
- 例如:
chrt -p 1234
- 输出 PID
1234
的调度策略和优先级。
- 输出 PID
- 例如:
关键选项
选项 | 功能 |
---|---|
-f --fifo | 设置 SCHED_FIFO 策略(实时,无时间片限制)。 |
-r --rr | 设置 SCHED_RR 策略(实时,时间片轮询,默认策略)。 |
-o --other | 设置 SCHED_OTHER 策略(默认普通任务)。 |
-b --batch | 设置 SCHED_BATCH 策略(后台任务,低优先级)。 |
-i --idle | 设置 SCHED_IDLE 策略(最低优先级,空闲时运行)。 |
-p --pid | 操作现有进程(需指定 PID)。 |
-m --max | 显示支持的优先级范围(如 min=0, max=99 )。 |
-R --reset-on-fork | 设置 SCHED_RESET_ON_FORK 标志(子进程继承默认策略)。 |
-v --verbose | 显示详细信息(如策略名称、优先级)。 |
-h --help | 显示帮助信息。 |
-V --version | 显示版本信息。 |
优先级范围
- 实时策略(FIFO/RR):优先级
1
(最高)到99
(最低)。 - 普通策略(SCHED_OTHER):优先级
-20
(最高)到19
(最低)。 - 其他策略(Batch/Idle):通常不需显式设置优先级,系统自动分配。
使用示例
- 查看优先级范围:
chrt -m
# 输出示例:
# SCHED_OTHER min/max priority : 0/0
# SCHED_FIFO min/max priority : 1/99
# SCHED_RR min/max priority : 1/99
# SCHED_BATCH min/max priority : 0/0
# SCHED_IDLE min/max priority : 0/0
-
运行实时任务:
sudo chrt -f 10 my_realtime_app
- 使用
SCHED_FIFO
策略,优先级10
运行my_realtime_app
。
- 使用
-
修改现有进程的调度策略:
sudo chrt -r -p 50 $(pidof my_process)
- 将
my_process
的调度策略设为SCHED_RR
,优先级50
。
- 将
-
查看进程调度信息:
chrt -p 1234
- 输出示例:
pid 1234's current scheduling policy: SCHED_OTHER pid 1234's current scheduling priority: 0
- 输出示例:
-
设置后台任务:
chrt -b -0 my_background_task
- 使用
SCHED_BATCH
策略运行my_background_task
(无需显式指定优先级)。
- 使用
典型应用场景
-
实时音频处理:
sudo chrt -f 99 jackd -d alsa
-
高精度控制系统:
sudo chrt -r 80 /usr/bin/robot_control
-
低优先级批处理:
chrt -i 0 /path/to/background_job
常见问题解答
-
如何查看支持的优先级范围?
chrt -m
- 输出示例:
min=0, max=99
- 输出示例:
-
如何强制子进程恢复默认策略?
sudo chrt -f -R 10 my_app
- 添加
-R
标志后,子进程将使用SCHED_OTHER
策略。
- 添加
-
为何修改进程失败?
- 可能原因:未使用
sudo
或目标进程属于其他用户。 - 解决:确保以 root 权限执行命令。
- 可能原因:未使用
注意事项
-
权限要求:
- 修改进程调度策略需
CAP_SYS_NICE
权限(通常通过sudo
实现)。
- 修改进程调度策略需
-
实时策略风险:
SCHED_FIFO
和SCHED_RR
是实时策略,若设置不当可能导致系统无响应(如优先级过高且进程未释放CPU)。
-
策略兼容性:
SCHED_BATCH
和SCHED_IDLE
是 Linux 特有策略,非 POSIX 标准,其他系统可能不支持。
-
SCHED_RESET_ON_FORK 标志:
- 使用
-R
选项时,子进程会继承默认调度策略(如SCHED_OTHER
),避免父进程的实时策略影响子进程。
- 使用