当前位置: 首页 > news >正文

Linux进程调度与Nice值完全指南:从新手到精通

目录

前言:

什么是进程调度?

现代计算机的并行处理能力

时间片技术:制造"同时运行"的假象(传统调度器)

进程优先级:谁更重要?

调度策略分类

完全公平调度器(CFS):Linux的"公平分配系统"

深入理解Nice值和二叉树

什么是Nice值?

二叉树如何存储进程?

二叉树的结构特点:

Nice值如何影响位置?

为什么使用二叉树?

Nice值的权限管理

权限规则表

查看Nice值和优先级

理解显示格式

Nice值与优先级映射表:

实际命令演示

使用top命令查看:

使用ps命令查看:

实际操作:设置和修改Nice值

启动时设置Nice值

1. 默认方式启动(继承父进程Nice值)

2. 使用nice命令启动(增加10个Nice值)

3. 指定具体Nice值启动

修改运行中进程的Nice值

方法1:使用renice命令

方法2:使用top交互命令

实际应用场景

什么时候需要调整Nice值?

✅ 需要提高优先级的情况:

✅ 需要降低优先级的情况:

实用技巧

编译大型项目时不影响工作:

紧急处理重要任务:

总结

核心要点回顾


前言:

你是否曾经好奇,当你的电脑同时运行几十个程序时,CPU是如何决定先处理哪个任务的?本文将带你深入理解Linux进程调度的奥秘,特别是那个神秘的"nice值"。


什么是进程调度?

现代计算机的并行处理能力

想象一下,现在的CPU就像一个有多个收银台的超市:

  • 单核CPU = 1个收银台,一次只能服务1个顾客

  • 多核CPU = 多个收银台,可以同时服务多个顾客

  • 超大型服务器 = 像大型购物中心,有数百个收银台

但问题来了:即使有这么多"收银台",顾客(进程)数量可能还是远远超过收银台数量。这时候就需要进程调度来管理了。

时间片技术:制造"同时运行"的假象(传统调度器)

Linux使用时间片多任务技术,就像餐厅厨师在多个订单间快速切换:

  • 厨师先做菜A几秒钟,然后切换到菜B,再切换到菜C...

  • 切换速度极快,让顾客感觉所有菜都在同时制作

  • 实际上每个时刻只有一个进程在使用CPU


进程优先级:谁更重要?

调度策略分类

Linux把进程分为不同的"VIP等级":

调度策略相当于适用场景
SCHED_NORMAL (普通)经济舱乘客大多数普通程序
SCHED_OTHER (普通)经济舱乘客大多数普通程序
实时策略头等舱乘客音视频处理、工业控制

完全公平调度器(CFS):Linux的"公平分配系统"

CFS的设计理念是:让每个进程都觉得自己独占了CPU。它使用一种特殊的数据结构——二进制搜索树(具体是红黑树)。

CFS:Linux完全公平调度器(CFS)揭秘:权重因子与虚拟时间的精妙设计-CSDN博客


深入理解Nice值和二叉树

什么是Nice值?

Nice值就像给进程贴上的"礼貌标签":

  • 范围:-20 到 19

  • 默认值:0(不偏不倚)

  • -20:最"不友好",总是插队(最高优先级)

  • 19:最"友好",总是让行(最低优先级)

二叉树如何存储进程?

想象一个超市排队系统,但不是简单的队列,而是一个智能排序系统

二叉树的结构特点:
        [进程A: 已运行10ms]/              \
[进程B: 已运行5ms]   [进程C: 已运行15ms]

排序规则

  1. 主要依据:进程已经使用的CPU时间(vruntime)

  2. 调整因素:Nice值影响时间计算权重

Nice值如何影响位置?

关键机制

  • 低Nice值(-20到-1):进程的"虚拟运行时间"增长更慢

  • 高Nice值(1到19):进程的"虚拟运行时间"增长更快

举例说明

# 假设两个进程同时开始运行
进程X: nice=0, 实际运行1秒 → 虚拟时间=1秒
进程Y: nice=-10, 实际运行1秒 → 虚拟时间≈0.6秒# 在二叉树中的位置:
# 左边(下一个运行): 进程Y (虚拟时间0.6秒)
# 右边            : 进程X (虚拟时间1.0秒)

注:

  • 直接调度依据:选择vruntime最小的进程

  • 间接影响因素:Nice值通过权重因子影响vruntime的增长速度

为什么使用二叉树?

优势

  • 快速查找:总是能快速找到运行时间最少的进程(树的最左节点)

  • 动态平衡:插入删除操作高效,保持树平衡

  • 公平性:确保每个进程都能获得CPU时间


Nice值的权限管理

权限规则表

用户类型能否提高优先级能否降低优先级能否修改他人进程
root用户✅ 可以✅ 可以✅ 可以
普通用户❌ 不可以✅ 可以❌ 不可以

通俗理解

  • 你可以自愿"礼让"(降低自己进程的优先级)

  • 但不能"插队"(提高自己进程的优先级)

  • 管理员可以调整任何人的位置


查看Nice值和优先级

理解显示格式

topps命令中,优先级显示有些复杂:

Nice值与优先级映射表:
优先级类型值范围说明
Real-time优先级1-99数值越大优先级越高
Nice值(NI)-20到19我们在操作时使用的值
top中的PR值rt, -99到39显示给用户看的综合优先级
  1. 实时进程:优先级最高。用于对时间有极端要求的任务,比如音视频播放、工业控制机器人。它们必须“立即”得到CPU响应。PR值范围:1-99

  2. 普通进程:我们日常运行的程序绝大多数都是普通进程,比如浏览器、文本编辑器。它们可以“耐心”等待CPU。PR值范围:100-139

关键点: nice 值只影响普通进程,对实时进程无效。

重点!!!:Nice值:不是优先级本身,而是一个“谦让度/友好度”参数。它通过影响进程的“竞争意愿”来间接调整优先级。

对应关系举例

Nice值 -20  →  PR值 0   → 最高普通优先级
Nice值 0   →  PR值 20  → 默认优先级  
Nice值 19  →  PR值 39  → 最低普通优先级

实际命令演示

使用top命令查看:
$ top
Tasks: 192 total,  1 running, 191 sleeping,  0 stopped,  0 zombie
%Cpu(s): 0.0 us,  1.6 sy,  0.0 ni, 96.9 id,  0.0 wa,  0.0 hi,  1.6 si,  0.0 stPID USER      PR  NI  VIRT  RES  SHR  %CPU %MEM TIME+ COMMAND1 root      20   0 172180 16232 10328 0.0  0.3 0:01.49 systemd

各列含义

  • PR:进程优先级(显示值)

  • NI:Nice值(我们设置的值)

  • %CPU:CPU使用率

  • TIME+:累计CPU时间

使用ps命令查看:
# 按Nice值排序查看所有进程
$ ps axo pid,comm,nice,cls --sort=-nice
PID COMMAND         NI CLS33 khugepaged     19 TS32 ksmd            5 TS814 rtkit-daemon    1 TS1 systemd         0 TS2 kthreadd        0 TS

调度类(CLS)说明

  • TS:时间共享(普通进程)

  • FF:先进先出(实时进程)

  • RR:循环调度(实时进程)


实际操作:设置和修改Nice值

启动时设置Nice值

1. 默认方式启动(继承父进程Nice值)
$ sleep 60 &
[1] 2667
$ ps -o pid,comm,nice 2667
PID COMMAND    NI
2667 sleep      0  # 默认Nice值为0
2. 使用nice命令启动(增加10个Nice值)
$ nice sleep 60 &
[1] 2736
$ ps -o pid,comm,nice 2736
PID COMMAND    NI
2736 sleep     10  # Nice值变为10
3. 指定具体Nice值启动

修改运行中进程的Nice值

方法1:使用renice命令
# 将进程2740的Nice值从15改为19
$ renice -n 19 2740
2740 (process ID) old priority 15, new priority 19
方法2:使用top交互命令
$ top
# 然后按'r'键,输入进程PID,再输入新的Nice值

实际应用场景

什么时候需要调整Nice值?

✅ 需要提高优先级的情况
  • 紧急任务处理:系统备份、关键业务处理

  • 交互式应用:需要快速响应的图形界面程序

  • 实时数据处理:音视频处理、数据采集

✅ 需要降低优先级的情况
  • 后台任务:软件更新、数据备份、编译大型项目

  • 批处理作业:数据分析、科学计算

  • 测试任务:压力测试、性能测试

实用技巧

编译大型项目时不影响工作:
# 以低优先级编译,不影响其他工作
$ nice -n 19 make -j8
紧急处理重要任务:
# 以高优先级运行紧急脚本(需要root权限)
$ sudo nice -n -20 ./emergency_script.sh

总结

核心要点回顾

  1. 进程调度:Linux通过时间片技术让多个进程"看起来"同时运行

  2. CFS调度器:使用红黑树来公平分配CPU时间

  3. Nice值:-20到19,影响进程在调度树中的位置

  4. 权限控制:普通用户只能降低优先级,root可以调整任何进程

Linux设计者采用这种间接方式的核心原因之一。不让你直接操作PR值,而是通过设置nice值来间接影响,确实主要是为了安全性、稳定性和易用性

http://www.dtcms.com/a/573768.html

相关文章:

  • Hadess零基础学习,如何管理Go制品
  • 贷中风控策略:分群、支用、调额、调价、预警...
  • STM32单片机 IIC 通信协议
  • 旅游平台网站合作建设方案微信h5的制作方法
  • Spring Boot3零基础教程,响应式编程,前景提要,笔记108
  • 北京优化网站推广成都app
  • 李宏毅深度强化学习课程笔记
  • vue怎么拿到url上的参数
  • WiFi1到WiFi7的发展史:它们之间的区别有什么
  • 6-5〔O҉S҉C҉P҉ ◈ 研记〕❘ 客户端攻击▸利用Windows库文件进行攻击-1
  • 用Python和Telegram API构建一个消息机器人
  • 的建站公司绵阳吉工建设
  • 个人网站设计摘要给公司做一个网站流程
  • serde
  • 用品牌重塑秩序:短信LOGO认证打造沟通信任链
  • 网站板块策划南昌做网站和微信小程序的公司
  • 全网普盖网站建设河南asp
  • 解决 GitLab Token 轮换后 SourceTree 认证失败问题
  • SpringBoot项目实现国际化
  • Jupyter Notebook 完整安装指南
  • XPath进阶:复杂嵌套结构与条件查询的终极指南
  • Oracle AWR案例分析: 诊断‘enq: TX - row lock contention‘等待事件
  • 【云运维】Zabbix 6.0 基于 LNMP 架构部署指南
  • 企业做网站要注意些什么问题大宗交易平台查询
  • 网站安全的必要性做电影网站违法吗
  • EtherCAT、PROFINET、EtherNet/IP和Modbus TCP主要区别
  • 电脑误格式化误删除如何通过数据恢复软件免费版搭建数据恢复中心
  • 如何平衡 ToB 产品中不同客户的需求
  • 基础数据结构之数组的前缀和技巧:和为K的子数组(LeetCode 560 中等题)
  • 【基础排序】CF - 最优排列Permutator