本文主要是看了大神的这篇文章:http://blog.chinaunix.net/uid-24774106-id-3379478.html
自己稍作总结而已。
跟进程调度策略相关的代码为:
//调度策略
#define SCHED_OTHER 0
#define SCHED_FIFO 1
#define SCHED_RR 2
#ifdef __USE_GNU
# define SCHED_BATCH 3
#endif
struct sched_param {
/* ... */
int sched_priority; //优先级
/* ... */
};
//设置进程的调度策略和优先级
//第一个参数为进程pid;
//第二个参数为调度策略;
//第三个参数为优先级;
int sched_setscheduler (pid_t pid,
int policy,
const struct sched_param *sp);
SCHED_OTHER表示普通进程,对于普通进程,第三个参数sp->sched_priority只能是0
SCHED_FIFO 和SCHED_RR表示实时进程的调度策略,第三个参数的取值范围为[1,99]。
如果sched_setscheduler 优先级设置的值和调度策略不符合的话,会返回失败的。
下面是这三个调度策略的总结:
1.对于SCHED_OTHER,即普通进程调度策略,它应该是基于CFS, 它的特点是即使是最低优先级,他也能获得一定的时间片(这个自己还不太清楚,印象中在《深入理解linux内核》中有讲过,有空再看吧)。
2.SCHED_FIFO:高优先级会抢占低优先级,高优先级运行期间,低优先级没法抢占,只能等到高优先级主动退出;对于同等优先级,先运行的进程会一直占据cpu, 只有等到先运行的进程主动退出,后续进程才能得到时间片。
3.SCHED_RR: 同上,高优先级会抢占低优先级,高优先级运行期间,低优先级没法抢占,只能等到高优先级主动退出, ;对于同等优先级的进程,各个进程会轮流运行一定的时间片(大约100ms)。