深入剖析 Linux 内核调度机制
一、Linux 内核支持调度策略
主要分为实时调度策略和普通(非实时)调度策略,以及一种特殊的限期调度策略。
-
先进先出调度(SCHED_FIFO),非抢占式的实时调度策略,没有时间片。一直占用 CPU,直到主动放弃 CPU,或者被更高优先级的实时进程抢占。
-
轮流调度(SCHED_RR),抢占式的实时调度策略,有时间片。
-
限期调度策略(SCHED_DEADLINE),Linux 3.14 引入的一种基于 Earliest Deadline First (EDF) 和 Constant Bandwidth Server (CBS) 算法的实时调度策略。
用不同的调度策略调度实时进程。普通进程支持两种调度策略:
-
标准轮流分时(SCHED_NORMAL):默认的调度策略,调度大多数非实时、通用目的的进程。用完全公平调度器(CFS),为所有进程提供公平的 CPU 时间分配,同时考虑进程的
nice值。 -
批处理调度(SCHED_BATCH ):调度普通的非实时进程,针对 CPU 密集型、非交互式任务进行了优化。
-
空闲(SCHED_IDLE):最低优先级的调度策略。只有系统没有其他任何可运行的进程,
SCHED_IDLE进程才会被调度运行。

二、进程优先级
限期进程的优先级比实时进程高,实时进程的优先级比普通进程高。
优先级层次:
-
限期进程 (
SCHED_DEADLINE) 有最高的优先级,根据截止时间进行调度,在所有其他进程之前完成。 -
实时进程 (
SCHED_FIFO,SCHED_RR) 的优先级次之,高于所有普通进程。 -
普通进程 (
SCHED_NORMAL,SCHED_BATCH) 有相对较低的优先级。 -
空闲进程 (
SCHED_IDLE) 有最低的优先级。
限制进程的优先级是-1。实时进程的实时优先级是 1-99,优先级数值越大,表示优先级 越高。普通进程的静态优先级是 100-139,优先级数值越小,表示优先 级越高,可通过修改 nice 值改变普通进程的优先级,优先级等于 120 加上 nice 值。
优先级数值:
-
限期进程:优先级由截止时间决定,截止时间越早,逻辑优先级越高。
-
实时进程:优先级范围是 1 到 99。数值越大,优先级越高。
-
普通进程:静态优先级范围是 100 到 139。数值越小,优先级越高。普通进程的优先级可以修改
nice值来调整。nice值的范围是 -20 到 +19。静态优先级计算公式:静态优先级 = 120 + nice 值。 -
空闲进程:优先级最低,内部表示为 -1。
prio是调度优先级,数值越小,优先级越高;多数情况为normal_prio。
|
优先级 |
限期进程 |
普通进程 |
实时进程 |
|---|---|---|---|
|
prio |
normal_prio |
normal_prio |
normal_prio |
|
static_prio |
0 |
120 加上 nice 值,数值越小优先级越高。 |
0 |
|
normal_prio |
-1 |
static_prio |
99至rt_priority |
|
rt_priority |
0 |
0 |
1至99,数值越大优先级越高 |
在 task_struct 结构体中,4 个成员和优先级有关如下:
代码语言:C
自动换行
AI代码解释
// include/linux/sched.h int prio; int static_prio; int normal_prio; unsigned int rt_priority;
-
int prio;:进程的动态优先级,也是调度器实际用的优先级。数值越小,优先级越高。 -
int static_prio;:进程的静态优先级。普通进程由120 + nice 值决定;实时进程和限期进程为 0,因为优先级由rt_priority或截止时间决定。 -
int normal_prio;:进程的正常优先级。基于static_prio或rt_priority计算得出。 -
unsigned int rt_priority;:实时进程的实时优先级,范围是 1 到 99。对于非实时进程,值为 0。
更多推荐




所有评论(0)