在 task_struct ( Task ) 中,有一个成员变量 policy
,我们叫调度策略。它有以下几个定义
#define SCHED_NORMAL 0
#define SCHED_FIFO 1
#define SCHED_RR 2
#define SCHED_BATCH 3
#define SCHED_IDLE 5
#define SCHED_DEADLINE 6
配合调度策略的,还有我们刚才说的优先级,也在 task_struct 中。
int prio, static_prio, normal_prio;
unsigned int rt_priority;
优先级其实就是一个数值,对于实时进程,优先级的范围是 0~99;对于普通进程,优先级的范围是 100~139。数值越小,优先级越高。
对于实时进程,有如下几种调度策略:
- SCHED_FIFO:相同优先级先到先得,高优先级可以抢占低优先级
- SCHED_RR:轮流调度算法,采用时间片,相同优先级的任务当用完时间片会被放到队列尾部,以保证公平性,而高优先级的任务也是可以抢占低优先级的任务。
- SCHED_DEADLINE:按照任务的 deadline 进行调度的。当产生一个调度点的时候,DL 调度器总是选择其 deadline 距离当前时间点最近的那个任务,并调度它执行。
而对于普通进程,有如下几种
- SCHED_NORMAL:普通进程
- SCHED_BATCH:后台进程,因为不需要支持前台交互,所以可以降低优先级
- SCHED_IDLE:特别空闲时才会跑的进程
policy
定义了具体的策略,而真正的运行依赖于 sched_class
,即调度策略的实现类,它有如下几种
- stop_sched_class 优先级最高的任务会使用这种策略,会中断所有其他线程,且不会被其他任务打断;
- dl_sched_class 就对应上面的 deadline 调度策略;
- rt_sched_class 就对应 RR 算法或者 FIFO 算法的调度策略,具体调度策略由进程的task_struct->policy 指定;
- fair_sched_class 就是普通进程的调度策略;
- idle_sched_class 就是空闲进程的调度策略。