linux内核有五种调度方法:
SCHED_FIFO 实时调度策略,first in first out
SCHED_RR 实时调度策略,robin round
SCHED_OTHER 分时调度策略
SCHED_BATCH 批处理
SCHED_IDLE 优先级最低的策略
实时进程和分时进程的调度算法不同,分别在rt.c和fair.c中实现。实时进程的优先级总是高于普通进程。
实时进程根据实时优先级决定顺序。而分时进程按完全公平分配调度(CFS)。
实时进程有两种策略,FIFO和RR,实时优先级的范围[0, MAX_RT_PRIO-1], 默认为[0,99]。实时优先级队列是一组链表,每个优先级对应一个链表,先执行高的数值对应的链表。
FIFO 一旦处于可执行状态就会一直执行,直到它自己阻塞或者释放CPU。只能被优先级更高的进程抢占。一般用于延时要求较短的进程,被赋予较高的优先级。
RR 执行直到时间片用完或者自己阻塞和释放CPU。只能被优先级更高的进程抢占。一般用于延时要求稍长的进程,被赋予较低的优先级。
要设置实时优先级,可以调用sched_setscheduler()
http://blog.csdn.net/allwtg/article/details/5254306
也可以用linux命令 chrt. chrt 也是调用了sched_setscheduler()这个函数。
用法:
chrt -p pid
chrt -p 1
Output:
pid 1's current scheduling policy: SCHED_OTHER
pid 1's current scheduling priority: 0
chrt -m
Output:
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
To set scheduling policy to SCHED_FIFO, enter:
# chrt -f -p [1..99] {pid}
Set policy to SCHED_FIFO with 50 priority:
# chrt -f -p 50 1024
To set scheduling policy to SCHED_RR, enter:
# chrt -r -p [1..99] {pid}
To set policy scheduling policy to SCHED_OTHER, enter:
# chrt -o -p 0 {pid}
# chrt -o -p 0 1024
如果设置不成功可能是由于一些限制,
http://home.lupaworld.com/home-space-uid-56821-do-blog-id-232810.html
需要改变
real-time priority (-r) 0
可以直接使用 ulimit -r 99来改变,每次开机修改会重置。
如果要永久修改可以在/etc/security/limits.conf中修改。
还要给/usr/bin/chrt命令授权CAP_SYS_NICE能力,如下:
setcap cap_sys_nice=eip /usr/bin/chrt
否则可能会出现以下报错:
chrt: failed to set pid 0's policy: Operation not permitted