Linux 进程调度管理

一、进程调度基础认知

1. 调度器核心作用

Linux 通过进程调度器分配 CPU 时间,实现 "多进程并发",核心平衡两个关键:

  • 按时间片轮转(默认 10-20ms / 片),保证进程公平使用 CPU
  • 按优先级分级,让重要进程获得更多 CPU 资源

2. 调度器分类与策略

实时调度器(高优先级进程专用)
  • 适用场景:系统关键进程,需快速响应
  • 支持策略:
    • SCHED_RR:同优先级进程轮流占用 CPU,默认时间片 0.1 秒
    • SCHED_FIFO:进程一旦运行,直到 IO 阻塞或被高优先级抢占
  • 优先级范围:1-99(数值越大优先级越高)
非实时调度器(普通进程专用)
  • 适用场景:大部分日常进程(如 Shell、应用程序)
  • 支持策略:
    • SCHED_NORMAL(SCHED_OTHER):标准时间共享调度
    • SCHED_BATCH:批量处理进程,减少调度竞争
    • SCHED_IDLE:最低优先级,仅 CPU 空闲时运行
  • 优先级控制:通过nice值调整,范围 - 20(最高)到 19(最低)

3. 关键优先级规则

  • 实时进程优先级 > 非实时进程优先级(即使最低实时进程也比最高 nice 值的非实时进程优先)
  • 无 CPU 竞争时,低优先级进程也能占用全部 CPU 资源

二、核心命令语法教学(含实战示例)

1. nice 命令:启动进程时设置 nice 值

语法格式

bash

复制代码
nice [OPTION] [COMMAND [ARG]...]
关键参数
  • -n, --adjustment=N:指定 nice 值调整量(默认 + 10)
  • 无 COMMAND 时:打印当前 Shell 的 nice 值
权限限制
  • 普通用户:仅能设置非负 nice 值(优先级降低)
  • root 用户:可设置 - 20 到 19 的任意 nice 值
实战示例

bash

复制代码
# 1. 默认调整(+10)启动进程
nice md5sum /dev/zero &  # 新进程nice值=0+10=10

# 2. 普通用户设置+2优先级
nice -n 2 md5sum /dev/zero &  # 新进程nice值=2

# 3. root用户设置-2高优先级(普通用户执行会报错)
sudo nice -n -2 md5sum /dev/zero &  # 新进程nice值=-2

2. renice 命令:调整已运行进程的 nice 值

语法格式

bash

复制代码
renice [-n] <priority> [-p <pid> | -g <pgid> | -u <user>]
关键参数
  • -n <priority>:目标 nice 值(必填)
  • -p <pid>:指定进程 ID(默认选项)
  • -g <pgid>:按进程组 ID 调整
  • -u <user>:按用户名 / 用户 ID 批量调整
权限限制
  • 普通用户:仅能升高 nice 值(降低优先级)
  • root 用户:可任意调整 nice 值(升高 / 降低)
实战示例

bash

复制代码
# 1. 调整单个进程(PID=55782)的nice值为2
renice -n 2 55782

# 2. 调整用户laoma所有进程的nice值为5
sudo renice -n 5 -u laoma

# 3. 普通用户尝试降低优先级(报错示例)
renice -n -2 55782  # 输出:Permission denied

3. chrt 命令:配置实时调度策略与优先级

语法格式

bash

复制代码
# 1. 启动进程时设置实时调度属性
chrt [选项] <优先级> <命令> [参数...]

# 2. 调整已运行进程的调度属性
chrt [选项] --pid <优先级> <pid>

# 3. 查看进程调度属性
chrt -p <pid>
关键参数
  • 调度策略选项:
    • -r, --rr:设置为 SCHED_RR(默认实时策略)
    • -f, --fifo:设置为 SCHED_FIFO
    • -o, --other:切换为非实时 SCHED_NORMAL 策略
    • -m, --max:查看各策略的优先级范围
  • 操作选项:
    • --pid <pid>:针对已运行进程操作
    • -v, --verbose:显示详细执行结果
权限限制
  • 仅 root 用户可设置实时调度策略
实战示例

bash

复制代码
# 1. 查看各调度策略的优先级范围
chrt -m

# 2. 以SCHED_RR策略(优先级5)启动进程
sudo chrt -r 5 md5sum /dev/zero &

# 3. 将已运行进程(PID=56225)改为SCHED_FIFO策略(优先级10)
sudo chrt -f --pid 10 56225

# 4. 查看进程调度属性
chrt -p 56225

# 5. 将实时进程切换为非实时策略
sudo chrt -o --pid 0 56225

4. 监控命令:查看进程优先级

(1)top 命令:实时监控
  • 启动命令:top
  • 关键字段解读:
    • PR:进程优先级(实时进程显示 "rt",非实时进程对应 nice 值映射)
    • NI:nice 值(-20 到 19)
  • 交互操作:在 top 界面按r,输入 PID 可直接修改 nice 值
(2)ps 命令:精准查询

bash

复制代码
# 查看进程的nice值和命令
ps -o pid,nice,command <pid>

# 查看实时进程的调度策略和优先级
ps -o pid,cls,rtprio,command <pid>
# 字段说明:cls=调度类型(RR/FF=实时,TS=非实时),rtprio=实时优先级

三、实时调度器系统参数配置

核心 sysctl 参数(控制实时进程 CPU 占用)

  • kernel.sched_rt_runtime_us:1 秒周期内实时进程可占用的 CPU 时间(默认 950000us=0.95 秒)

    • 设为 0:实时进程无法获取 CPU 时间
  • kernel.sched_rt_period_us:CPU 分配周期(默认 1000000us=1 秒)

  • 配置方法(临时生效): bash

    复制代码
    sudo sysctl -w kernel.sched_rt_runtime_us=800000
相关推荐
不脱发的程序猿2 小时前
嵌入式Linux:线程同步(读写锁)
linux·嵌入式
yangzhi_emo2 小时前
配置dns主从服务
linux·运维·服务器
SongYuLong的博客3 小时前
Linux开源代码汇总
linux·运维·服务器
JiMoKuangXiangQu3 小时前
Linux 内存管理 (5):buddy 内存分配简要流程
linux·内存管理·buddy 分配器
铭哥的编程日记3 小时前
【Linux网络】应用层协议HTTP
linux·运维·http
SakitamaX3 小时前
nginx
运维·nginx
yolo_guo4 小时前
opencv 学习: 07 使用迭代器 (iterator) 遍历像素
linux·c++·opencv
万象.4 小时前
GNU汇编语法和Cortex-A7常用汇编指令
服务器·汇编·gnu
子牙老师4 小时前
硬盘第一关:MBR VS GPT
linux·操作系统·文件系统