个人主页:chian-ocean
文章专栏-Linux
前言:
进程优先级调度是操作系统中的一种调度机制,其核心是为每个进程分配一个 优先级(Priority),然后根据优先级的高低决定进程执行的顺序和时间。这种机制确保了关键任务(优先级高)能够及时执行,而不那么重要的任务(优先级低)可能需要等待。
优先级调度
进程优先级调度是操作系统用来决定 哪个进程优先占用 CPU 的机制。它通过给每个进程分配一个 优先级值,优先级高的进程比优先级低的进程更早被调度运行。这种机制在 资源有限 的情况下,能够确保关键任务及时完成,同时提高系统的运行效率。
- **优先级:**就是对资源访问优先的问题。
- **存在的理由:**是由于CPU的资源不足。
Linux 中的PRI和NI
在 Linux 系统中,PRI(Priority) 和 NI(Nice 值) 是两个与进程优先级相关的重要参数。它们共同影响进程在调度器中的调度顺序。以下是它们的关系和区别的详细说明:
ps -al | head - 1 ; ps ajx | grep <进程名>
PRI(Priority,优先级)
PRI 是进程的最终优先级值,由内核计算决定,直接影响调度器为进程分配 CPU 的顺序。
PRI 的范围
- 实时任务:范围为 1 到 99,数值越小,优先级越高。
- 普通任务:范围为 100 到 139,数值越小,优先级越高。
PRI 的计算公式
对于普通任务:
PRI=100+NI+动态调整值
- NI 是进程的 Nice 值。
- 动态调整值 是内核根据进程的运行情况动态计算的。
实时任务
实时任务的 PRI 只与其静态优先级有关,不会动态调整。
NI(Nice 值)
NI(Nice 值) 是用户空间设置的静态优先级,用于影响普通任务的 PRI。Nice 值的作用是调整进程的优先级,帮助用户控制某些任务的资源分配。
NI 的范围
Nice 值的范围为 -20 到 19:
nice > -20 nice < 19
- -20:最高优先级。
- 19:最低优先级。
- 默认值为 0。
NI 的作用
- Nice 值越低,进程优先级越高,进程更容易获得 CPU 时间。
- Nice 值越高,进程优先级越低,进程更少占用 CPU。
**调整NI值(nice) **
在 Linux 系统中,可以通过 top
命令的交互模式来修改正在运行进程的 nice
值。这是一个方便的方式,无需退出 top
界面即可调整优先级。
启动 top
命令:
top
你将看到系统中所有运行的进程列表。
找到目标进程:
- 在
top
的输出中找到需要调整nice
值的进程PID
。 - 使用快捷键
/
可以进行搜索。例如输入进程名称后按回车即可定位。
选择修改进程优先级的选项:
- 按下
r
键,top
会提示你输入目标进程的 PID。
输入目标进程的 PID:
- 根据提示,输入你需要修改的进程号(PID),然后按回车。
设置新的 nice
值:
top
会提示你输入新的nice
值。- 输入一个值(范围:-20 到 19),然后按回车。
- 例如:
- 输入
-10
提高优先级(需要 root 权限)。 - 输入
10
降低优先级。
- 输入
# 1. top
# 2. 按r
# 3. 输入基进程的PID
# 4. 输入修改的nice值
验证修改:
- 在
top
界面中,找到对应的进程,检查其NI
列(即nice
值列)是否更新。
ps -al | head -1 && ps -al | grep <PID>or<进程名>
注意事项
-
提高优先级(降低
nice
值)可能导致其他进程的响应变慢,因此要谨慎操作。 -
普通用户尝试设置负值
nice
(优先级提升)时,会提示权限不足。
执行
#普通用户的情况之下
1. top 2. r #设置nice值
# 提示 permission denied
linux优先级调度策略
linux调度器的演变
Linux 调度器经历了多次改进,每次改进都更好地适应不同的应用场景:
- O(n) 调度器(早期 Linux 内核):简单但效率低。
- O(1) 调度器(Linux 2.6 引入):效率更高,但对实时性支持有限。
- 完全公平调度器(CFS)(Linux 2.6.23 引入):当前默认调度器,强调公平性和灵活性。
linux调度策略
Linux 内核为不同类型的任务设计了多种调度策略,分为实时调度策略和普通调度策略。
实时调度策略
SCHED_FIFO
(先入先出)- 适用于高优先级、对时延敏感的任务。
- 任务按照优先级依次调度,高优先级任务运行时不会被抢占,除非更高优先级任务出现。
SCHED_RR
(轮转调度)- 在
SCHED_FIFO
基础上添加时间片机制,同一优先级的任务按时间片轮转。 - 避免高优先级任务长期独占 CPU。
- 在
普通调度策略
SCHED_NORMAL
(完全公平调度,CFS)- 默认调度策略,适用于大多数用户进程。
- 核心是模拟“理想处理器”,为每个任务公平分配 CPU 时间。
SCHED_BATCH
- 针对批处理任务设计,减少交互性以提高 CPU 利用率。
SCHED_IDLE
- 用于优先级最低的任务,仅在系统空闲时运行。
CFS 的核心机制(现行调度器)
CFS 的公平性由以下几个核心机制保证:
虚拟运行时间(vruntime)
-
vruntime 是 CFS 的关键指标,用于表示一个任务已经消耗的“虚拟 CPU 时间”。
-
任务的 Nice 值
决定 vruntime 的增长速度:
- Nice 值低(优先级高):vruntime 增长慢,任务获得更多调度机会。
- Nice 值高(优先级低):vruntime 增长快,任务获得较少调度机会。
计算公式:
\text{vruntime\_delta} = \text{实际运行时间} \times \text{权重因子} \
CFS 使用 红黑树 作为数据结构管理所有可运行的任务:
- 红黑树的节点以任务的 vruntime 作为键值。
- 树顶节点(vruntime 最小的任务)优先获得调度。
- 任务完成一次时间片后,CFS 将更新该任务的 vruntime 并重新排序。
调度周期
CFS 按固定的时间间隔进行任务调度,每次调度会:
- 选择 vruntime 最小的任务运行。
- 更新任务的 vruntime。
- 将任务重新插入红黑树。
time 作为键值。
- 树顶节点(vruntime 最小的任务)优先获得调度。
- 任务完成一次时间片后,CFS 将更新该任务的 vruntime 并重新排序。
调度周期
CFS 按固定的时间间隔进行任务调度,每次调度会:
- 选择 vruntime 最小的任务运行。
- 更新任务的 vruntime。
- 将任务重新插入红黑树。