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