调度相关介绍

文章介绍了Linux中的五种调度器类,包括stop、deadline、rt、cfs和idle,并详细阐述了进程的优先级概念,如nice值和schedulingpriority。实时进程的优先级在0到99之间,可以通过系统调用获取。调度策略包括SCHED_DEADLINE、SCHED_FIFO、SCHED_RR等,各有不同的调度行为。用户可以使用chrt和nice命令修改进程的调度策略和优先级。
摘要由CSDN通过智能技术生成

调度类介绍

5种调度器类

  • stop 调度类
  • deadline 调度类
  • rt 调度类
  • cfs 调度类
  • idle 调度类

调度优先级

  1. 用户空间看

进程优先级就是nice value和scheduling priority

  • nice value : -20(最高) ~ 19(最低)

通过修改 nice value 的值可以改变普通进程获取 CPU 资源的比例;

  • scheduling priority:
    • 实时进程的优先级:1(最低优先级)~ 99(最高优先级)
    • 普通进程的优先级:被设定为 0
    • 范围:0 ~ 139

实时进程的优先级可以通过 sched_get_priority_min 和 sched_get_priority_max 系统调用获得

  1. 内核空间看:有静态优先级、realtime优先级、归一化优先级和动态优先级等概念
  • 静态优先级:task struct中的static_prio成员为静态优先级
    • 值越小,进程优先级越高;
    • 0 ~ 99 用于 实时进程,100 ~ 139用于普通进程;
    • 缺省值是 120;
    • 用户空间可以通过 nice() 或者 setpriority() 对该值进行修改;
    • 通过 getpriority() 获取该值;
    • 新创建的进程会继承父进程的静态优先级;
  • 实时优先级:task_struct 中的 rt_priority 表示该线程的实时优先级
    • 0 是普通进程
    • 1 ~ 99 是实时进程;
    • 99 的优先级最高;
  • 归一化优先级:task_struct 中的 normal_prio 成员,根据静态优先级、实时优先级和调度策略来计算得到,数值越小优先级越大
    • deadline 进程的归一化优先级为: MAX_DL_PRIO - 1
    • rt 进程的归一化优先级为:MAX_RT_PRIO - 1 - rt_priority
    • normal 进程的归一化优先级为:nice + 120
  1. 进程优先级和 nice 的关系:
  • 普通进程优先级 PR = NI + 20;
  1. 调度策略与优先级的关系
调度类归一化优先级范围
Deadline-1
RT1 ~ 99
CFS100 ~ 139

调度策略与优先级的关系

调度策略

  • 实时进程:

    • SCHED_DEADLINE:距离当前时间最近的 deadline 任务优先被调度
    • SCHED_FIFO:相同优先级的任务,先来先执行;优先级更高的任务,可以插队
    • SCHED_RR:循环执行,每个任务分配相同时间,相同优先级任务,轮流执行,如果没有执行完,就到队列末尾,再分配时间执行,而优先级高的任务,可以插队抢先执行
  • 普通进程:

    • SCHED_OTHER:共享时间的调度策略;
    • SCHED_BATCH:此策略将使调度程序始终假定该线程是CPU密集型的;
    • SCHED_IDLE: 非常低优先级的工作,nice 值对该策略无效,该策略的目的是以极低的优先级工作;

修改线程的调度策略及优先级

命令行

  1. chrt 命令

    1.1 描述

    设置或检索现有PID的实时调度属性,或使用给定属性运行命令;

    1.2 命令介绍:

    1.2.1 格式:

    • chrt [options] priority command argument …
    • chrt [options] -p [priority] PID

    1.2.2 策略:

    • -o, --other

      设置调度策略为 SCHED_OTHER(time-sharing scheduling),默认的调度策略

    • -f, --fifo

      设置调度策略为 SCHED_FIFO

    • -r, --rr

      设置调度策略为 SCHED_RR

    • -b, --batch

      设置调度策略为 SCHED_BATCH

    • -i, --idle

      设置调度策略为 SCHED_IDLE

    • -d, --deadline

      设置调度策略为 SCHED_DEADLINE

      • 优先级参数必须为 0
      • 有三个参数 --sched-runtime, --sched-deadline & --sched-period
      • 至少要设定 --sched-period

    1.2.3 调度选项:

    • -T, --sched-runtime

      • deadline调度策略使用的参数,单位:ns
      • 进程的运行时长
    • -P, --sched-period

      • deadline调度策略使用的参数,单位:ns
      • 进程调度的周期
    • -D, --sched-deadline

      • deadline调度策略使用的参数,单位:ns
      • 一个调度周期内进程运行时长最晚结束时间
    • -R, --reset-on-fork

      • 使用 SCHED_RESET_ON_FORK 或者 SCHED_FLAG_RESET_ON_FORK标志
      • 每个线程都有一个 reset_on_fork 调度标志,用于指示其线程是否继承父线程的的调度策略
        • 如果该进程具有 SCHED_FIFO 或者 SCHED_RR 调度策略,则子进程恢复到 SCHED_OTHER;
        • 如果进程具有负的 nice 值,则自进程恢复到 0;

Tips:

          arrival/wakeup                    absolute deadline
               |    start time                    |
               |        |                         |
               v        v                         v
          -----x--------xooooooooooooooooo--------x--------x---
                        |<--- Runtime ----------->|
                |<----------- Deadline ---------->|
                |<-------------- Period ------------------>|

1.2.4 选项:

  • -a, --all-tasks

    设置或检索给定PID的所有任务(线程)的调度属性

  • -m, --max

    显示最大/最小的有效优先级,即对应调度策略的优先级的范围

  • -p, --pid

    操作已经存在的 pid 对应的线程

  1. nice 命令

    2.1 描述
    以指定的 nice 值运行程序

    2.2 命令介绍

    2.2.1 格式

    nice [OPTION] [COMMAND [ARG]…]

    2.2.2 参数

    • -n, --adjustment=N
      以 nice 值为 N 运行该程序,默认是 10

    2.3 实例

    • nice ls :以 nice 值为 10 运行 ls 命令
    • nice -n 1 ls:以 nice 值为 1 运行 ls 命令
  2. renice 命令

    3.1 描述
    调整进程的 nice 值

    3.2 命令介绍

    3.2.1 格式

    renice [-n] priority [-g|-p|-u] identifier…

    3.2.2 参数

    • -n, --priority priority

      • 定义调度优先级;
      • 如果使用该参数,则该参数必须是第一个;
    • -g, --pgrp

      • 该参数为进程组 ID
    • -p, --pid

      • 该参数为进程 ID
      • 默认参数
    • -u, --user

      • 该参数为用户的名字或者用户 ID

    3.3 实例

    renice -n 5 701251 :将进程 id 为 701251 的 nice 值改为 5

系统调用

  1. nice
  2. getpriority
  3. setpriority
  4. sched_setscheduler
  5. sched_getscheduler
  6. sched_setparam
  7. sched_getparam
  8. sched_get_priority_max
  9. sched_get_priority_min
  10. sched_rr_get_interval
  11. sched_yield
  12. sched_setaffinity
  13. sched_getaffinity
  14. sched_setattr
  15. sched-getattr

参考文献

  1. [进程]chrt 修改线程的调度策略及优先级
  2. Linux调度器:进程优先级
  3. 一文辨析,性能分析top命令中进程NI和PR
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值