暗无天日

=============>DarkSun的个人博客

使用chrt修改进程调度策略及优先级

Linux内核调度策略

linux内核有五种调度方法:

SCHED_FIFO
first in first out 实时调度策略
SCHED_RR
robin round 实时调度策略
SCHED_DEADLINE
基于Earliest Deadline First (EDF) 调度算法
SCHED_OTHER
分时调度策略
SCHED_BATCH
批处理
SCHED_IDLE
优先级最低的策略

其中,前三个是实时进程的调度方法,后两个时一般进程的调度算法。 实时实时进程一般由操作系统创建,普通用户只能创建普通进程,且不管怎样,实时进程的优先级总是要高于普通进程。 实时进程根据实时优先级决定调度权值,优先级的设定范围默认为 1-99

FIFO实时调度策略中的进程一旦处于可执行状态就会一直执行,直到它自己阻塞或者被优先级更高的进程抢占。一般用于延时要求较短的进程,被赋予较高的优先级。

RR实时调度策略中的进程会有一个时间片,进程执行直到时间片用完或者自己阻塞后系统将重新分配时间片,并该进程置于就绪队列尾.从而保证了所有具有相同优先级的RR任务的调度公平。 RR实时调度策略同时也能被优先级更高的进程抢占。一般用于延时要求稍长的进程,被赋予较低的优先级。

SCHED_DEADLINE是新支持的实时进程调度策略,针对突发型计算,且适用于延迟和完成时间高度敏感的任务

后三个进程是普通进程的调度策略。

SCHED_OTHER策略是普通进程的默认调度策略。 SCHED_OTHER调度策略首先根据进程的nice值确定分配CPU的执行时间。若进程没有等待资源则进程变为就绪状态。 然后调度程序遍历就绪队列中的进程,计算每个进程的动态优先级(counter+20-nice),并挑选动态优先级最高的进程去运行,直到时间片用完或主动放弃CPU。

SCHED_BATCH策略与SCHED_OTHER很类似,区别在于该策略认为进程是非交互式的CPU密集型进程,该策略的进程不会去抢占其他SCHED_OTHER调度策略的进程。

SCHED_IDLE策略则是只有在没有其他进程可运行的状态下才才会被调度

使用chrt查看/修改进程调度策略

查看进程的调度策略及优先级

chrt -p $pid

比如,我想查看Emacs进程的调度策略及优先级那么可以

chrt -p $(pidof emacs)
pid 1032 当前的调度策略︰ SCHED_OTHER
pid 1032 的当前调度优先级:0

查看每种策略的有效优先级范围

chrt -m
SCHED_OTHER 最小/最大优先级    : 0/0
SCHED_FIFO 最小/最大优先级     : 1/99
SCHED_RR 最小/最大优先级       : 1/99
SCHED_BATCH 最小/最大优先级    : 0/0
SCHED_IDLE 最小/最大优先级     : 0/0
SCHED_DEADLINE 最小/最大优先级 : 0/0

设置进程的调度策略

chrt [-b/-f/-o/-r/-i/-d] -p [$priority] $pid

其中:

-b
设置为 SCHED_BATCH 调度策略
-f
设置为 SCHED_FIFO 调度策略
-o
设置为 SCHED_OTHER 调度策略
-r
设置为 SCHED_RR 调度策略
-i
设置为 SCHED_IDLE 调度策略
-d
设置为 SCHED_DEADLINE 调度策略
priority
为要设置的优先级