调度类介绍
5种调度器类
- stop 调度类
- deadline 调度类
- rt 调度类
- cfs 调度类
- idle 调度类
调度优先级
- 用户空间看
进程优先级就是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 系统调用获得
- 内核空间看:有静态优先级、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
- 进程优先级和 nice 的关系:
- 普通进程优先级 PR = NI + 20;
- 调度策略与优先级的关系
调度类 | 归一化优先级范围 |
---|---|
Deadline | -1 |
RT | 1 ~ 99 |
CFS | 100 ~ 139 |
调度策略
-
实时进程:
- SCHED_DEADLINE:距离当前时间最近的 deadline 任务优先被调度
- SCHED_FIFO:相同优先级的任务,先来先执行;优先级更高的任务,可以插队
- SCHED_RR:循环执行,每个任务分配相同时间,相同优先级任务,轮流执行,如果没有执行完,就到队列末尾,再分配时间执行,而优先级高的任务,可以插队抢先执行
-
普通进程:
- SCHED_OTHER:共享时间的调度策略;
- SCHED_BATCH:此策略将使调度程序始终假定该线程是CPU密集型的;
- SCHED_IDLE: 非常低优先级的工作,nice 值对该策略无效,该策略的目的是以极低的优先级工作;
修改线程的调度策略及优先级
命令行
-
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 对应的线程
-
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 命令
- -n, --adjustment=N
-
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
-
系统调用
- nice
- getpriority
- setpriority
- sched_setscheduler
- sched_getscheduler
- sched_setparam
- sched_getparam
- sched_get_priority_max
- sched_get_priority_min
- sched_rr_get_interval
- sched_yield
- sched_setaffinity
- sched_getaffinity
- sched_setattr
- sched-getattr