一、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_FIFOSCHED_RR) 的优先级次之,高于所有普通进程。

  • 普通进程 (SCHED_NORMALSCHED_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。


 

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐