在Linux中,进程大至分为两类:实时进程 和 普通进程,这两种进程调度策略不同
实时进程:需要尽快得到响应的进程;
普通进程:常用的进程,优先级没有实时进程高
在内核里,不分进程线程,进程线程都是一种数据结构(任务),即task_struct结构体管理一个任务。
在task_struct中,有一个成员变量叫调度策略,即unsigned int policy; 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这样定义:
unsigned int rt_priority;
int prio, static_prio, normal_prio;
优先级是一个数值,数值越小,优先级越高,实时进程的优先级比普通进程的优先级高。
实时进程调度策略
实时进程有自己的调度策略,即实时调度策略,在上面policy变量的定义中SCHED_FIFO、
SCHED_RR、SCHED_DEADLINE属于实时进程的调度策略。
SCHED_FIFO:相同优先级情况下,先到先服务,类似队列的先进先出;但是优先级高的可以抢占优先级低的。
SCHED_RR:相同优先级情况下,采用时间片轮转的策略,当时间片用完后放到队列尾部;高优先级依然可以抢占低优先级。
SCHED_DEADLINE:DL调度器选择其deadline距离当前时间点最近的那个任务执行。
普通进程调度策略
在policy变量定义中,SCHED_NORMAL、SCHED_BATCH、SCHED_IDLE属于普通进程调度策略
SCHED_NORMAL:普通进程
SCHED_BATCH:后台进程,几乎不需要和前端交互,这类进程可以默默执行,不要影响需要交互的进程,可以降低它的优先级。
SCHED_IDLE:空闲时才调用的进程
以上讲的policy和priority,表示进程调度的策略和优先级,但还没有指明由谁去具体执行这些操作;在task_struct里定义了这样一个成员变量,它是真正去做事的。
struct sched_class *sched_class;
sched_class有以下几种实现:
stop_sched_class:优先级最高的进程才会使用这种策略,它会中断其他所有正在运行的进程,并且自己本身不会被其他任务打断。
dl_sched_class:对应上面写的deadline策略
rt_sched_class:对应RR算法或FIFO算法的调度策略,具体调度策略由进程的task_struct->policy指定
fair_sched_class:普通进程调度策略
idle_sched_class:空闲进程调度策略
常用的是fair_sched_class调度策略;下面主要讲普通进程的调度策略
在Linux中,有一个CFS(完全公平调度算法)。CFS给每一个普通进程安排一个vruntime(虚拟运行时间),进程运行时间越长,vruntime越大,在进程管理中,进程的vruntime越大的,其优先级会逐渐降低,让vruntime小的先运行,这样随着进程的vruntime不断变化,其是否运行也在变化,不会一直不被运行或一直运行。
vruntime = 实际运行时间 * nice_0_load / 权重,同样的实际运行时间,权重高的vruntime小,,获得的实际运行时间就多了。
调度队列与调度实体
以后再写。。。。。。。。。。。。。。