Linux 内核进程优先级与调度策略 ① ( SCHED_FIFO 调度策略 | SCHED_RR 调度策略 | 进程优先级 )

Posted 韩曙亮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux 内核进程优先级与调度策略 ① ( SCHED_FIFO 调度策略 | SCHED_RR 调度策略 | 进程优先级 )相关的知识,希望对你有一定的参考价值。

文章目录





一、Linux 内核调度策略



Linux 内核调度策略 :

  • SCHED_OTHER : 分时调度策略 ;
  • SCHED_FIFO : 实时调度策略 , 先到先服务 ; 进程 一旦 占有 CPU , 就一直运行 , 直到 有更高优先级的进程到达 时才放弃 CPU , 或者 进程自己放弃 CPU ;
  • SCHED_RR : 实时调度策略 , 时间片轮转 ; 进程分配到 CPU 时间片用于执行 , 该时间片用完后 , 该进程 放到该优先级队列的末尾 , 等待系统重新分配时间片执行 ;

总结一下 , 就是 如果有 多个 相同优先级 的 " 实时进程 " ,

  • SCHED_FIFO 策略需要 等待进程主动放弃 才可以执行其它优先级相同的任务 ,
  • SCHED_RR 策略 每个 优先级相同的进程 , 都可以执行一个时间片 ;

特别注意 : 进程的优先级计算出的 调度权重 是可以修改的 , 由开发者确定 ;


参考 【Linux 内核】调度器 ⑨ ( Linux 内核调度策略 | SCHED_NORMAL 策略 | SCHED_FIFO 策略 | SCHED_NORMAL 策略 | SCHED_BATCH策略 ) 博客 , 介绍了 Linux 内核相关的调度策略 ;


1、SCHED_FIFO 调度策略


SCHED_FIFO" 实时进程调度策略 " , 这是一种 先进先出 ( First In First Out ) 调度策略 ;

该策略 不涉及 CPU 时间片机制 ( 分时复用机制 ) , 在没有高优先级进程的前提下 , 只能 等待其它进程主动释放 CPU 资源 ;

SCHED_FIFO 调度策略中 , 被 调度器 调度运行后的 进程 , 其运行时长不受限制 , 可以运行任意长的时间 ;


2、SCHED_RR 调度策略


SCHED_RR " 实时进程调度策略 " , 使用的是 时间片轮转 机制 , 对应的 时间值 运行时会 减少 ;

进程 使用完 CPU 时间片 后 , 会加入到 与 进程优先级 相应的 执行队列末尾 ;

同时 , 释放 CPU 资源 , CPU 时间片会被轮转给 相同进程优先级 的 其它进程 ;





二、进程优先级



实时进程优先级 取值范围 1 1 1 ~ 99 99 99 , 其数值越大 , 优先级越高 ;

就绪状态 的 实时任务 , 可以 立刻抢占非实时任务 ;

如果 所有的 进程都采用 Linux 分时调度策略时 , 创建该进程时 , 必须 指定 优先级计算参数 nice , 取值范围 − 20 -20 20 ~ 19 19 19 , 进程在 CPU 上的执行时间 是 结合 nice 值计算出的 优先级权重 决定的 ;


在之前的博客

中 , 简单介绍了 进程优先级概念 , 本篇博客中开始介绍 Linux 内核中优先级相关源码 ;


进程优先级限期进程实时进程普通进程
prio 调度优先级等于 normal_prio 字段等于 normal_prio 字段等于 normal_prio 字段
static_prio 调度优先级字段 值总为 0 0 0 , 没有意义字段 值总为 0 0 0 , 没有意义 120 + n i c e \\rm 120 + nice 120+nice , 其数值越小 , 优先级越高
normal_prio 正常优先级 − 1 -1 1 99 − r t _ p r i o r i t y 99 - \\rm rt\\_priority 99rt_priority 120 + n i c e \\rm 120 + nice 120+nice , 其数值越小 , 优先级越高
rt_priority 实时优先级字段 值总为 0 0 0 , 没有意义字段 值为 1 1 1 ~ 99 99 99 , 其数值越大 , 优先级越高字段 值总为 0 0 0 , 没有意义

以上是关于Linux 内核进程优先级与调度策略 ① ( SCHED_FIFO 调度策略 | SCHED_RR 调度策略 | 进程优先级 )的主要内容,如果未能解决你的问题,请参考以下文章

Linux 内核进程优先级与调度策略 ② ( 获取调度策略对应的进程优先级函数 | sched_get_priority_max 函数 | sched_get_priority_min 函数 )

Linux 内核进程优先级与调度策略 ② ( 获取调度策略对应的进程优先级函数 | sched_get_priority_max 函数 | sched_get_priority_min 函数 )

Linux 内核进程优先级与调度策略 ③ ( 设置获取线程优先级的核心函数 | 修改线程调度策略函数 )

Linux 内核实时调度类 ① ( 进程分类 | 实时进程普通进程 | Linux 内核 SCHED_FIFOSCHED_RR 调度策略 | 实时调度实体 sched_rt_entity )

Linux 操作系统原理 — 用户进程与内核线程的调度策略与切换开销

Linux(内核剖析):12---进程调度之与调度相关的系统调用