进程的优先级关系
从下图可以看出:
- 系统主要包括实时进程和普通进程。
- 实时进程优先级高于普通进程,实时进程会比普通进程更优先得到调度。
- nice 值可以转换为对应的优先级值,即nice 值 [-20,19] 对应于优先级值 [100,139]。
实时进程调度(Realtime Process Scheduling)
Linux的实时属于软实时,并不对完成时间作保证。实时进程调度具有两种策略:
- SCHED_FIFO (first-in, first-out) 先入先出策略
- SCHED_RR (round-robin) 时间片轮转策略
相同点:
- 会顺序轮流执行。
- 只有更高优先级的实时进程可以抢占其处理器。
- 优先级都是静态的。
不同点:
- SCHED_FIFO 不存在时间片,会一直执行,直到它受阻塞或显示地释放处理器。
- SCHED_RR 具有时间片长度,耗尽时间片时,在同一优先级的其他实时进程被调度。
普通进程调度
系统运行的绝大部分进程都是普通进程,普通进程具有三种调度策略,最重要的是第一种。注意,交互进程也属于普通进程。
-
SCHED_NORMAL
完全公平调度策略(Completely Fair Scheduling, CFS),在 Linux 中称为 SCHED_NORMAL,在 POSIX 中称为 SCHED_OTHER,是最重要的调度策略。CFS 实现的基本原理是:
- 按照其优先级分配给相应比例的处理器时间
- 每个进程运行一段时间,然后选择运行最少的进程作为下一个运行进程
- 确保每个进程得到预先设定的处理器使用比。
-
SCHED_BATCH
也通过完全公平调度器来实现,主要用于非交互、CPU 使用密集的批处理进程。它们不会抢占CF调度器处理的另一个进程,因此不会干扰交互进程。 -
SCHED_IDLE
用于低优先级的任务,这些任务在系统中没有其他任务需要使用CPU时才会大量使用CPU。
参考:
《Linux 内核设计与实现》