http://www.cnitblog.com/flutist1225/articles/19989.html
如何查看/设置/调整进程的优先级
1. 查看:ps –l xxx
2. 设置:nice
3. 调整:renice
4. 修改为实时进程: chrt
进程的nice值不是进程的优先级,他们不是一个概念,但是进程nice值会影响到进程的优先级变化。
5. API
a) nice
b) getpriority / setpriority
这是(类似)nice命令的api, 取值范围是-20~19,这个和nice值一致。数值越低优先级越高。
这个api可以针对PRIO_PROCESS,PRIO_PGRP, PRIO_USER.
A child created by fork(2) inherits its parent's nice value. The nice value is preserved across execve(2).
c) sched_getscheduler / sched_setscheduler
i. 设置进程的优先级,不同policy的进程,其优先级的取值范围不一样,可以通过sched_get_priority_min / sched_get_priority_max获取取值范围。同时,其对静态优先级也有要求。详见:man sched_setscheduler
d) Scheduling Policies
i. SCHED_FIFO: First In-First Outscheduling. A FIFO-classed process will continue running as long as nohigher-priority process becomes runnable.
a. 详见<Linux System Programing>
ii. SCHED_RR: Round Robinscheduling. Each process is only allowed to run for a maximum time quantum. Ifa SCHED_RR process has been running for a time period equal to or longer thanthe time quantum, it will be put at the end of the list for its priority. (man sched_rr_get_interval)
iii. SCHED_OTHER: Default Linux time-sharingscheduling
iv. SCHED_BATCH: Scheduling batchprocesses
不同调度策略的实时进程只有在相同优先级时才有可比性:
1. 对于FIFO的进程,意味着只有当前进程执行完毕才会轮到其他进程执行。由此可见相当霸道。
2. 对于RR的进程。一旦时间片消耗完毕,则会将该进程置于队列的末尾,然后运行其他相同优先级的进程,如果没有其他相同优先级的进程,则该进程会继续执行。
总而言之,对于实时进程,高优先级的进程就是大爷。它执行到没法执行了,才轮到低优先级的进程执行。等级制度相当森严啊。
Linux对普通的进程,根据动态优先级进行调度。而动态优先级是由静态优先级(static_prio)调整而来。Linux下,静态优先级是用户不可见的,隐藏在内核中。而内核提供给用户一个可以影响静态优先级的接口,那就是nice值,两者关系如下:
static_prio=MAX_RT_PRIO+nice+ 20
nice值的范围是-20~19,因而静态优先级范围在100~139之间。nice数值越大就使得static_prio越大,最终进程优先级就越低。
系统调度时,还会考虑其他因素,因而会计算出一个叫进程动态优先级的东西,根据此来实施调度。例如如果进程属于交互式进程,那么可以适当的调高它的优先级,使得界面反应地更加迅速,从而使用户得到更好的体验。
系统会严格按照动态优先级高低的顺序安排进程执行。动态优先级高的进程进入非运行状态或者时间片消耗完毕才会轮到动态优先级较低的进程执行。
e) Linux kernel中的prio相关宏
#define MAX_USER_RT_PRIO 100
#define MAX_RT_PRIO MAX_USER_RT_PRIO
#define MAX_PRIO (MAX_RT_PRIO+ 40)
#define DEFAULT_PRIO (MAX_RT_PRIO+ 20)
#define NICE_TO_PRIO(nice) (MAX_RT_PRIO+ (nice) + 20)
#define PRIO_TO_NICE(prio) ((prio)- MAX_RT_PRIO - 20)
i. 优先级的取值范围是:0 ~ 140
ii. 实时进程的优先级取值范围:0 ~ 99
iii. 非实时进程的优先级取值范围:100 ~ 140
iv. 进程默认的优先级:120
v. nice 与 prio的关系 (见上述转换宏)
6. 动态优先级调整
a) 打分
b) 奖励,惩罚
7. 红黑树优先级策略 (针对SCHED_OTHER类型的进程) (CFS算法)
实时进程吃CPU的时间也有控制, 系统会控制实时进程最多吃多少CPU, 可以通过proc调整这个比例:
/proc/sys/kernel/sched_*