1. 调度策略
/*
* 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
- SCHED_FIFO
- 先进先出,不使用时间片,一直运行直到有更高优先级(SCHED_FIFO或SCHED_RR)任务到达或自己放弃;
- SCHED_FIFO级任务比任何SCHED_NORMAL级任务都优先得到调度;
- 多个通优先级的SCHED_FIFO任务轮流执行,只有运行任务主动让出,同优先级的任务才可以执行;
- 只要有SCHED_FIFO任务执行,其他级别较低的任务就只能等待它变为不可运行态才有机会运行;
- SCHED_RR:
- 有时间片,可以理解为带有时间片的SCHED_FIFO;
- 当时间片耗尽,同一优先级的其他实时任务被轮流调度;
- 时间片只能用来重新调度同一优先级进程;
- 对于SCHED_FIFO进程, 优先级总是立即抢占低优先级,但低优先级进程决不能抢占SCHED_RR任务,即使它的时间片耗尽
- SCHED_DEADLINE:
- 新支持的实时调度策略,针对突发型计算,且对延迟和完成时间高度敏感的任务适用;
- 基于Earliest Deadline First (EDF) 调度算法
- SCHED_NORMAL(SCHED_OTHER)
- 普通进程,分时调度策略, 非实时,目前采用CFS调度算法;
- SCHED_BATCH:
- 普通进程策略的分化版本;
- 采用分时策略,用于非交互的处理器消耗型进程;
- SCHED_IDLE:
- 优先级最低,在系统空闲时才跑这类进程
2. 优先级
//prio.h
#define MAX_USER_RT_PRIO 100
#define MAX_RT_PRIO MAX_USER_RT_PRIO
- 内核优先级
- 数值越小,任务优先级越高;
- 实时任务优先级0~99;
- 普通任务共享取值空间,优先级范围100~139,对应nice值为-20~19;
- 普通任务采用CFS调度算法, nice值不代表优先级,表示获取CPU的权重;
- 混乱的优先级
static_prio | 静态优先级,取值100 ~ 139,对非实时进程有效,通过nice系统调用来进行修改 |
rt_priority | 实时优先级,取值0~99,只对实时进程有效 |
normal_prio | 归一化优先级,其值取决于静态优先级和调度策略 |
prio | 动态优先级,取值0 ~ 139,调度器最终使用 |
- static_prio:
- 不会随时间改变,内核不会主动修改它,只能通过系统调用 nice 去修改 static_prio;
- static_prio = MAX_RT_PRIO + nice +20;
- rt_priority:
- 取值 0 ~ 99,与用户空间取值一致;
- normal_prio:
- 取值取决于静态优先级和调度策略;
- 实时进程: normal_prio = MAX_RT_PRIO -1 - p->rt_priority;
- 非实时进程:normal_prio = static_prio;
- prio:
- 调度器选择进程时最终使用的优先级数值,prio 值越小,表明进程的优先级越高;
- 实时进程:prio = MAX_RT_PRIO -1 - p->rt_priority;
- 非实时进程:prio = static_prio;
- 优先级转换
- 实时进程
- 用户态,优先级数值越大,优先级越高, 用户态 = 99 - 内核态;
- 内核态,prio数值越小,优先级越高, 内核态 = 99 - 用户态;
- 实时进程优先级设置5
- 实时进程
// 1)
sudo nice -n 5 ./test
// 2)
sudo renice -5 -p 5500
// 3)
nice() 系统调用
- top 优先级 (PR和NI显示)
- 实时进程 :TOP 中 PR = -1 - 用户视角; 用户99优先级, PR 显示 rt, (实时进程NI都为0);
- 普通进程:NI为用户设置,NI默认为0, PR默认为20; PR = 20 + NI;
用户 | 内核 | top(PR/NI) | |
RT 65 | 34 | -35(-1 - 34) | 0 |
RT 99 | 0 | rt | 0 |
普通 NICE 0 (默认) | 20 | 0 | |
普通 NICE 5 | 25 (20 + 5) | 5 | |
普通 NICE -5 | 15 (20 -5) | -5 |
- 实时进程门限,period时间内rt进程运行时间runtime
/proc/sys/kernel/sched_rt_period_us
/proc/sys/kernel/sched_rt_runtime_us