Linux 调度策略的类型大致可以分为 TSS (分时系统)和实时系统这两种。一方面.一般的进程是通过分时运行的。也就是说.使用 CPU 的时间达到分配给进程的时间(时间片)时,就会切换到其他进程。这种分时运行的调度策略称为 TSS 。另一方面,在实时制约较严格且要求保证实时的处理中,就需要指定静态的执行优先级.并严格按照执行优先级进行调度。对这种对应答性有要求的进程,可以使用实时调度策略。另外,与 TSS 调度策略的进程相比. CPU将优先分配给使用用实时调度策略的进程。

在 Linux 中,进程的静态优先级为 0-99 。 TSS 调度策略的优先级为 O0 ,实时调度策略的优先级可以指定的范圈为 100-139,数字越小,优先级越高。

Linux 2.6.23 以前一直采用的 O ( 1)调度程序,还会在 TSS 调度策略中加添动态优先级.长时间持续使用 CpU 的进程,其调度的动态优先级会逐渐降低。 Linux的进程调度程序是按照优先级来分配 CPU 的.因此长时间占用 CPU 的进程优先级与其他进程相比就相对较低。与之相对的是,频繁与用户进行交流的shell等对话进程由于 CPU 使用时间短,其调度的优先级变高.更容昌分配到 CPU 。因此.为等待用户输入而立即腾出 CPU 的比shell进程的优先级变得比其他进程高.用户的应答性就得到提高。在 Linux 2 . 6 . 23 导入的 CFS 调度程序中.没有之前的 0 ( l ) 调度程序所进行的经验性优先级变化. CFS 通过称为公平的 CPU 时间分配的结构来运行。

调度策略 RHEL6 ( Linux 2.6.32 )中定义下列调度策略。

实时调度:

SCHED_FIFO  高优先级可以抢占低优先级,相同优先级 先来先服务

SCHED_RR 相同优先级,轮流时间片服务

SCHED_DEADLINE 根据deadline进行,选择deadline最近的那个任务

普通调度策略:

SCHED_OTHER 普通进程

SCHED_BATCH 后台进程,优先级低于普通进程

SCHED_IDLE  只有cpu idle 的时候才执行

下面将分别对各调度策略进行介绍。

SCHED OTHER

这是 Linux 的标准调度策略,也是所谓 TSS 调度策略。

在 RHEL5 等 Linux 2 . 6 . 23之前的内核所使用的以优先级为基础的O(1)调度程序中,还加入了经脸性的判断,优先为会话进程赋予执行权。 TSS的时间片由优先级决定.

在 RHEL6 等 Linux 2 . 6 . 23之后的 CFS 调度器中.会公平地为所有 TSS 策略的进程分配 CPU 时间。其时间片是动态决定的.

SCHED FIFO

这是实时调度策略.即具有动态优先级的调度策略。 Linux 内核中能够为实时调度策略的进程指定的优先级为 1-99。使用了 SCHED _ FIFO 调度策略的进程,除了等待 I/O 完成时休眠、自发休眠或优先级更高的实时进程获得优先权以外,不会释放执行权。

使用 SCHEO _ FIFO 的实时调度策略时,需要注意的是.它的进程不会自动释放CPU . 也就是说执行权不会转移到其他进程。例如.实时调度该略的进程陷入无限循环时.其他所有优先级较低的进程永远不会被赋予执行权.此时系统就会死机。

SCHED_RR

这也是实时调度策略. RR 是轮询的缩写,与 SCHED_FIFO 不同的是.它具有时间片。时间片使用完时.执行权将转移到其他进程。在 2.6 .23 以前导人的 O(1)调度程序中,时间片是由优先级决定的。

引入CFS时SCHED _ RR的调度策略也进行了修改,时间片变为固定值 (100毫秒)。

SCHED_BATCH

  指定这个调度策略的进程不是会话型,不会根据休眠时间更改优先级。例如,备份处理等需要进行较大文件或大量文件存取的进程,是通过磁盘I/O来中止的。在 TSS 调度策略中,因为这个休眠,正在进行备份处理的进程优先级提高,需要应答性的shell等的优先级相对降低。这就会导致系统的应答性降低。

在 RHEL5的 O(1)调度程序中.使用了这个调度策略的进程被识别为休眼时间为0的 CPU bound进程。因此,优先级必然会变成比会话型shell进程低。

对非会话型的进程(即所谓的补丁处理)使用这个调度策略,就可以使会话型进程的优先级保持相对较高,并确保应答性.

在 Linux 2 . 6 . 23 导入的 CFS 中,对进行补丁处理的进程改变了处理的方法,优先级不会因休眠时间而发生变化。在导入 CFS 的 RHEL6 中. SCHEO _ BATCH 和 SCHEO _ OTHER 几乎没有区别.因此可以不使用。

SCHED_IDLE

这是由 CFS 导人的新等级。 CPU 空闲时,即 SCHEO _ IDLE 等级以外处于可执行状态的进程消失时,将被赋予执行权。也就是它将成为优先级最低的进程。

特殊标志: SCHED_RESET_0N_FORK

为了限制实时调度策略的进程运行,而为调度策略添加了标志flag,设置了标志flag的实时调度策略进程.在执行fork时.新生成的子进程就成为SCHED_OTHER策略的进程。

Linux 代码中有5个实现,

  • stop_sched_class 优先级最高的任务会使用这种策略,会中断所有其他线程,且不会被其他任务打断;

  • dl_sched_class 就对应上面的 deadline 调度策略;

  • rt_sched_class 就对应 RR 算法或者 FIFO 算法的调度策略,具体调度策略由进程的 task_struct->policy 指定;

  • fair_sched_class 就是普通进程的调度策略;

  • idle_sched_class 就是空闲进程的调度策略

实际调度代码会挨个调用这些class

Chrt命令

用户使用chrt命令可以简单更改调度策略。

chrt的用法参照:

https://www.linuxcool.com/chrt

更多精彩,欢迎关注公众号

Logo

更多推荐