1. 调度策略
//https://android.googlesource.com/kernel/common/+/refs/heads/android-4.14/include/uapi/linux/sched.h
.......
/*
* Scheduling policies
*/
#define SCHED_NORMAL 0
#define SCHED_FIFO 1
#define SCHED_RR 2
#define SCHED_BATCH 3
/* SCHED_ISO: reserved but not implemented yet */
#define SCHED_IDLE 5
#define SCHED_DEADLINE 6
/*
0: 默认的调度策略,针对的是普通进程。
1:针对实时进程的先进先出调度。适合对时间性要求比较高但每次运行时间比较短的进程。
2:针对的是实时进程的时间片轮转调度。适合每次运行时间比较长得进程。
3:针对批处理进程的调度,适合那些非交互性且对cpu使用密集的进程。
SCHED_ISO:是内核的一个预留字段,目前还没有使用
5:适用于SCHED_DEADLINE优先级较低的后台进程。
6:SCHED_DEADLINED在规定的期限内cpu必须要花指定的时间在本进程上。
SCHED_NORMAL和SCHED_BATCH调度普通的非实时进程,
SCHED_FIFO和SCHED_RR和SCHED_DEADLINE则采用不同的调度策略调度实时进程,
SCHED_IDLE则在系统空闲时调用idle进程.
*/
可以通过chrt查看进程的调度策略和优先级
pencil: $ chrt -p 551
pid 551's current scheduling policy: SCHED_BATCH
pid 551's current scheduling priority: 0 #实时优先级,普通进程为0
pencil: $ chrt -p 511
pid 511's current scheduling policy: SCHED_FIFO
pid 511's current scheduling priority: 15 #实时进程优先级 1(优先级最低)~99(优先级最高)
2. 内核优先级表示
2.1 概述
-
内核使用0~139表示内部优先级,
task_struct.prio
的数值越低, 优先级越高(注意:这里指的是task_struct.prio
,还有其他优先级表示,注意区分) -
实时优先级范围是 0 - MAX_RT_PRIO-1(即0 ~ 99)
-
普通进程的静态优先级范围是从 MAX_RT_PRIO - MAX_PRIO-1(即100~139),nice的值[-20,19]的映射的范围就是对应优先级的100 - 139,
优先级范围 | 描述 |
---|---|
0——99 | 实时进程 |
100——139 | 非实时进程 |
贴下这部分的代码,内核里面有详尽的注释
https://elixir.bootlin.com/linux/v5.1.5/source/include/linux/sched/prio.h
#define MAX_NICE 19
#define MIN_NICE -20<