Linux 调度策略 SCHED_OTHER SCHED_FIFO SCHED_RR SCHED_BATCH SCHED_IDLE
Linux 调度策略的类型大致可以分为 TSS (分时系统)和实时系统这两种。一方面.一般的进程是通过分时运行的。也就是说.使用 CPU 的时间达到分配给进程的时间(时间片)时,就会切换到其他进程。这种分时运行的调度策略称为 TSS 。另一方面,在实时制约较严格且要求保证实时的处理中,就需要指定静态的执行优先级.并严格按照执行优先级进行调度。对这种对应答性有要求的进程,可以使用实时调度策略。另外,
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
更多精彩,欢迎关注公众号
更多推荐
所有评论(0)