前言

        在Linux系统中,进程优先级决定了CPU资源的分配顺序,直接影响系统性能和关键任务的响应速度。无论是优化服务器负载、确保实时任务稳定运行,还是避免低优先级进程拖慢系统,合理调整进程优先级都是系统管理和性能调优的重要技能。

目录

一、进程优先级概述

1、基本概念

2、存在原因

二、查看进程优先级信息

1、PRI与NI的关系

2、PRI 与 NI 的区别

三、竞争、独立、并行、并发

1、进程相关核心概念

2、概念对比图

3、补充说明

四、通过top命令更改进程的nice值

步骤 1:启动 top

步骤 2:找到目标进程

步骤 3:进入 Nice 值修改模式

步骤 4:验证修改

五、两种不同的优先级系统

六、Nice优先级系统

1、Nice值范围

2、相关命令

nice 命令

renice 命令

七、验证NI和PRI的范围

1. 验证 NI(nice 值)的范围

实验方法

结论

2. 验证 PRI(进程优先级)的范围

实验方法

结论

3. 为什么范围是 -20 到 19?

4. 总结

八、实时优先级系统(了解即可,不掌握)

1、实时优先级范围

2、调度策略

3、相关命令

九、内核视角的优先级

十、调整优先级的注意事项

十一、实际应用示例(了解即可,不掌握)

示例1:启动一个低优先级的压缩任务

示例2:将正在运行的进程改为高优先级

示例3:设置实时音频处理进程


一、进程优先级概述

1、基本概念

        优先级是指获取资源的先后顺序。进程优先级则特指进程获得CPU资源分配的优先顺序,即进程的优先权(priority)。优先权较高的进程享有优先执行的权利。

2、存在原因

        优先级的产生源于资源的有限性。对于进程优先级而言,其存在的根本原因是CPU资源的稀缺性。由于单个CPU同一时间只能运行一个进程,而系统中往往存在多个并发进程,因此需要通过优先级机制来确定各进程获取CPU资源的先后顺序。


二、查看进程优先级信息

在Linux或Unix系统中,执行ps -l命令通常会显示如下信息:

ps -l <PID>

关键信息如下:

  • UID:执行者的身份标识,用于系统识别和权限管理

  • PID:进程的唯一标识符
  • PPID:父进程的标识符(即创建该进程的进程ID)
  • PRI:进程优先级,数值越小优先级越高
  • NI:进程的nice值

小知识:

  • 在Linux系统中,操作系统通过UID(用户标识符)来识别进程访问文件时的权限身份。
  • 每个进程都代表特定用户运行,系统会根据进程所属用户的UID来判断其访问权限,包括文件所有者、所属组或其他用户的权限类别。

1、PRI与NI的关系

  • PRI表示进程的CPU执行优先级,数值越小越优先执行
  • NI是进程优先级的修正值,影响最终的PRI值
  • 计算公式:PRI(new) = PRI(old) + NI
    • 当NI为负值时,PRI降低(优先级提高)
    • 在Linux系统中,PRI(old)默认值为80,即PRI = 80 + NI
  • NI的取值范围:-20到19(共40个级别)
  • 调整进程优先级实际上就是修改其nice值(NI)

2、PRI 与 NI 的区别

  • 需要明确的是,进程的 nice 值(NI)并不等同于进程优先级(PRI),它们是两个不同的概念。但 nice 值会影响进程优先级的调整。
  • 简单来说,nice 值是用于修正进程优先级的一个数值参数。

三、竞争、独立、并行、并发

1、进程相关核心概念

  1. 竞争性 (Competitive)

    • 定义:系统进程数量众多,而CPU资源有限(如单核CPU),因此进程之间需要竞争获取计算资源。

    • 延伸:为了优化资源分配,操作系统通过优先级调度算法管理竞争,确保关键任务优先执行。

    • 示例:高优先级进程(如系统服务)可抢占低优先级进程(如后台应用)的CPU时间。

  2. 独立性 (Independent)

    • 定义:每个进程拥有独立的虚拟地址空间和系统资源(如文件描述符、内存),多进程运行时互不干扰。

    • 延伸:独立性由操作系统通过内存隔离和资源保护机制实现,确保进程崩溃不会影响其他进程。

    • 例外:进程间通信(IPC)机制可打破独立性,如共享内存、管道等。

  3. 并行 (Parallelism)

    • 定义:多个进程在多核CPU/多处理器同时执行,每个进程独占一个计算核心。

    • 条件:要求硬件支持(CPU核心数≥进程数)。

    • 示例:4个进程在4核CPU上同时运行,每个核心处理一个进程。

  4. 并发 (Concurrency)

    • 定义:多个进程在单核CPU上通过时间片轮转、上下文切换等机制交替执行,宏观上表现为“同时推进”。

    • 关键:操作系统通过调度器(Scheduler)快速切换进程,用户感知为多任务并行(实际是伪并行)。

    • 对比:并发是逻辑上的“同时”,并行是物理上的同时。

2、概念对比图

特性竞争性独立性并行并发
核心资源争用隔离保护多核物理同时执行单核逻辑交替执行
依赖资源稀缺操作系统机制多CPU/多核硬件调度算法
表现优先级调度进程互不干扰真正同步快速切换的异步

3、补充说明

  • 并发与并行的关系:并发是更广义的概念,并行是并发的子集(硬件允许多任务真正同步时)。

  • 现代系统:通常并发与并行共存(如多核CPU上每个核心并发调度多个线程)。


四、通过top命令更改进程的nice值

步骤 1:启动 top

在终端输入:

top

你会看到一个动态刷新的进程列表,包含 PIDUSERNIPRI 等信息:

步骤 2:找到目标进程

  1. 在 top 界面中,可以使用按 Shift + P(按 CPU 使用率排序)或 Shift + M(按内存使用率排序)的方式,找到你要修改的进程。

  2. 记录进程的 PID(第一列)。

步骤 3:进入 Nice 值修改模式

  1. 在 top 运行时,按 r(代表 "renice")。

  2. 输入要调整的 PID,按回车。

    PID to renice [default: 0]: 1234  # 替换为目标 PID

  3. 输入新的 Nice 值(范围:-20 到 19),按回车。

    • 负值(如 -5):提高优先级(需 root 权限)。

    • 正值(如 10):降低优先级(普通用户可设置)。

    Renice PID 1234 to value: 5  # 示例:设置为 5

步骤 4:验证修改

  1. 修改后,在 top 界面中检查该进程的 NI 列是否已更新。

  2. 按 q 退出 top

        输入nice值后按“q”即可退出,如果我们这里输入的nice值为5,那么此时我们再用ps命令查看进程的优先级信息,即可发现进程的NI变成了5,PRI变成了85(80+NI):

注意: 若是想将NI值调为负值,也就是将进程的优先级调高,需要使用sudo top提升权限。


五、两种不同的优先级系统

        在Linux操作系统中,进程优先级决定了进程获取CPU资源的顺序和频率。优先级高的进程会获得更多的CPU时间,从而更快地执行。Linux使用两种不同的优先级系统:

  1. Nice值(NI):用户空间优先级,范围从-20(最高优先级)到19(最低优先级)

  2. 实时优先级:用于实时进程,范围从1(最低)到99(最高)


六、Nice优先级系统

1、Nice值范围

        采用时间片机制的分时操作系统需兼顾公平性,允许优先级动态调整,但必须严格控制优先级的变化幅度:

  • 默认值:0

  • 可调整范围:-20(最高优先级)到19(最低优先级)

  • 普通用户限制:只能调低优先级(增大nice值,0→19)

  • root用户:可以调高或调低优先级(-20→19)

2、相关命令

查看进程优先级信息:

ps -eo pid,ni,comm

或者我们也可以使用:

top # 然后按'r'键调整优先级

注意: 在Linux操作系统中,初始进程一般优先级PRI默认为80,NI默认为0。 

启动时设置优先级:

nice 命令

  • 用于以指定的优先级启动一个进程

  • 语法:nice -n [优先级值] [命令]

  • 优先级范围通常为 -20 (最高优先级) 到 19 (最低优先级)

  • 普通用户只能降低优先级(设为正值),只有root可以提升优先级(设为负值)

nice -n 10 ./test
启动程序,并设置 NI=10(较低优先级),然后验证优先级:

调整运行中进程的优先级:

renice 命令

  • 用于修改已运行进程的优先级

  • 语法:renice [优先级值] -p [进程ID]

  • 同样遵循-20到19的范围限制

renice 5 -p PID

注意: 若是想使用renice命令将NI值调为负值,也需要使用sudo renice命令提升权限。


七、验证NI和PRI的范围

        在 Linux 系统中,进程的优先级(PRI)和 nice 值(NI)的范围是 -20 到 19NI),而 PRI 的范围通常是 0 到 139(但用户可见的 PRI 范围是 60 到 99)。我们可以通过简单的实验来验证这些范围:

1. 验证 NI(nice 值)的范围

        Linux 允许的 nice 值范围是 -20(最高优先级)到 19(最低优先级)。普通用户只能降低优先级(NI ≥ 0),而 root 可以提升优先级(NI < 0)。

实验方法

  • 尝试用 nice 或 renice 设置超出范围的 NI 值:

    nice -n -21 [可执行程序]# 尝试设置 NI = -21(超出范围)
    nice -n 20 [可执行程序]# 尝试设置 NI = 20(超出范围)
  • 系统会返回错误:

结论
  • NI 的范围确实是 -20 到 19,超出范围会被拒绝。

2. 验证 PRI(进程优先级)的范围

        Linux 的 PRI 值由内核动态调整,但用户可见的 PRI 范围是 60(最高优先级)到 99(最低优先级)NI 会影响 PRI 的计算:

PRI=80+NIPRI=80+NI(80 是默认基准优先级)

实验方法

  • 查看默认进程的 PRI 和 NI

    ps -l

    输出示例:PRI = 80NI = 0(默认情况)。

  • 用 nice 启动一个低优先级进程

    nice -n 19 [可执行文件]# 设置 NI = 19(最低优先级)
    ps -l PID

    输出:

    • PRI = 9980 + 19 = 99)。

  • 用 renice 提高优先级(需要 root

    sudo renice -n -20 -p PID  # 设置 NI = -20(最高优先级)
    ps -l

    输出bad value,这里观察不了,其实上面对NI观察已经可以证明结论了。

结论
  • PRI 的计算公式是 PRI = 80 + NI,所以:

    • 当 NI = -20 时,PRI = 60(最高优先级)。

    • 当 NI = 19 时,PRI = 99(最低优先级)。

  • PRI 的可调整范围是 60–99(由 NI 决定)。

3. 为什么范围是 -20 到 19?

  • 这是 Linux 内核的默认设计:

    • NI 的范围 -20 到 19 提供了 40 个优先级级别(足够精细调整)。

    • PRI 的范围 60–99 是用户可见的优先级,而内核实际使用 0–139(其中 0–59 用于实时进程,60–99 用于普通进程)。

4. 总结

参数范围计算方式实验验证方法
NI-20 到 19直接设置nice -n -20 / nice -n 19
PRI60 到 99PRI = 80 + NIps -l 观察 NI 对 PRI 的影响

通过实验可以确认:

  1. NI 的范围是 -20 到 19,超出会报错。

  2. PRI 的范围是 60 到 99,由 PRI = 80 + NI 决定。


八、实时优先级系统(了解即可,不掌握)

实时优先级用于需要严格调度控制的进程,如音频处理、工业控制系统等。

1、实时优先级范围

  • SCHED_FIFOSCHED_RR策略:1(最低)到99(最高)

  • SCHED_OTHER(标准分时调度):不使用实时优先级

2、调度策略

策略描述
SCHED_OTHER标准分时调度(默认),使用nice值
SCHED_FIFO先进先出实时调度,高优先级进程会一直运行直到阻塞或退出
SCHED_RR轮转实时调度,同优先级进程按时间片轮转
SCHED_BATCH针对批处理作业的调度
SCHED_IDLE极低优先级,系统空闲时才运行

3、相关命令

查看进程调度策略和优先级:

chrt -p PID

设置实时优先级:

chrt -f -p 90 PID # 设置FIFO调度,优先级90
chrt -r -p 80 PID # 设置RR调度,优先级80

九、内核视角的优先级

在内核中,优先级通过以下方式表示:

  1. 静态优先级:由用户设置的nice值转换而来

  2. 动态优先级:内核根据进程行为调整的优先级

  3. 实时优先级:用于实时进程的特殊优先级

内核维护一个运行队列,将进程按优先级组织,调度器总是选择最高优先级的可运行进程。


十、调整优先级的注意事项

  1. 谨慎提高优先级:过高优先级可能导致系统资源被独占

  2. 实时进程风险:错误的实时进程可能导致系统无响应

  3. 权限限制:普通用户只能降低自身进程的优先级

  4. 系统监控:使用tophtop监控优先级调整效果


十一、实际应用示例(了解即可,不掌握)

示例1:启动一个低优先级的压缩任务

nice -n 19 tar -czf backup.tar.gz /data

示例2:将正在运行的进程改为高优先级

sudo renice -10 -p 1234

示例3:设置实时音频处理进程

chrt -f -p 99 $(pidof pulseaudio)

        理解Linux进程优先级对于系统性能调优和资源管理至关重要,特别是在多任务环境或资源受限的系统中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/88786.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/88786.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/88786.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入浅出Kafka Broker源码解析(下篇):副本机制与控制器

一、副本机制深度解析 1.1 ISR机制实现 1.1.1 ISR管理核心逻辑 ISR&#xff08;In-Sync Replicas&#xff09;是Kafka保证数据一致性的核心机制&#xff0c;其实现主要分布在ReplicaManager和Partition类中&#xff1a; public class ReplicaManager {// ISR变更集合&#xff0…

Fluent许可文件安装和配置

在使用Fluent软件进行流体动力学模拟之前&#xff0c;正确安装和配置Fluent许可文件是至关重要的一步。本文将为您提供详细的Fluent许可文件安装和配置指南&#xff0c;帮助您轻松完成许可文件的安装和配置&#xff0c;确保Fluent软件能够顺利运行。 一、Fluent许可文件安装步骤…

Python----大模型( RAG的文本分割,文本分割方法 )

一、RAG文本分割RAG&#xff08;Retrieval-Augmented Generation&#xff0c;检索增强生成&#xff09;模型是一种结合了检索 和生成能力的自然语言处理模型。 它通过检索相关的文档片段&#xff0c;并将这些信息作为生成过程的上下文&#xff0c;以提高生成质量 和准确性。在R…

vue笔记3 VueRouter VueX详细讲解

vueRouter & vueX 看到这里的朋友如果没有看过前几期&#xff0c;可以通过文章的链接跳转到第一期&#xff0c;从第一期的 vue2 语法开始学习&#xff0c;如果是复习的朋友&#xff0c;也可以看本期只学习 vueRouter & VueX 项目初始化 经过上期&#xff0c;我们学习…

从当下需求聊聊Apifox 与 Apipost 的差异

作为一名长期投身于复杂项目开发的工程师&#xff0c;我深切体会到一款适配的接口管理工具对提升开发效率的关键意义。当团队在进行工具选型时&#xff0c;我对 Apifox 和 Apipost 展开了全面且系统的对比分析&#xff0c;其中的诸多发现&#xff0c;值得与大家深入探讨。 一、…

蓝牙协议栈高危漏洞曝光,攻击可入侵奔驰、大众和斯柯达车载娱乐系统

OpenSynergy BlueSDK关键漏洞&#xff0c;可远程执行代码入侵数百万车辆系统PCA网络安全公司的研究人员在OpenSynergy BlueSDK蓝牙协议栈中发现了一组被统称为"完美蓝"&#xff08;PerfektBlue&#xff09;的关键漏洞。利用这些漏洞可能对数百万辆汽车实施远程代码执…

Android 性能优化:启动优化全解析

前言 Android应用的启动性能是用户体验的重要组成部分。一个启动缓慢的应用不仅会让用户感到烦躁&#xff0c;还可能导致用户放弃使用。 本文将深入探讨Android应用启动优化的各个方面&#xff0c;包括启动流程分析、优化方法、高级技巧和具体实现。 一、Android应用启动流程深…

前沿重器[69] | 源码拆解:deepSearcher动态子查询+循环搜索优化RAG流程

前沿重器栏目主要给大家分享各种大厂、顶会的论文和分享&#xff0c;从中抽取关键精华的部分和大家分享&#xff0c;和大家一起把握前沿技术。具体介绍&#xff1a;仓颉专项&#xff1a;飞机大炮我都会&#xff0c;利器心法我还有。&#xff08;算起来&#xff0c;专项启动已经…

Vue+axios

1. axios简介axios 是一个基于 Promise 的 HTTP 客户端&#xff0c;主要用于浏览器和 Node.js 环境中发送 HTTP 请求。它是目前前端开发中最流行的网络请求库之一&#xff0c;被广泛应用于各种 JavaScript 项目&#xff08;如 React、Vue、Angular 等框架或原生 JS 项目&#x…

通过Tcl脚本命令:set_param labtools.auto_update_hardware 0

1.通过Tcl脚本命令&#xff1a;set_param labtools.auto_update_hardware 0 禁用JTAG上电检测&#xff0c;因为2016.1 及更高版本 Vivado 硬件管理器中&#xff0c;当 FPGA正连接编程电缆时 重新上电&#xff0c;可能会出现FPGA无法自动加载程序的故障。 2.还可以通过 hw_serv…

Spring Boot 安全登录系统:前后端分离实现

关键词&#xff1a;Spring Boot、安全登录、JWT、Shiro / Spring Security、前后端分离、Vue、MySQL 详细代码请参考这篇文章&#xff1a;完整 Spring Boot Vue 登录 ✅ 摘要 在现代 Web 应用中&#xff0c;用户登录与权限控制是系统安全性的基础环节。本文将手把手带你实现…

Docker高级管理--Dockerfile 镜像制作

目录 一&#xff1a;Docker 镜像管理 1:Docker 镜像结构 &#xff08;1&#xff09; 镜像分层核心概念 &#xff08;2&#xff09;镜像层特性 &#xff08;3&#xff09;关键操作命令 &#xff08;4&#xff09;优化建议 2&#xff1a;Dockerfile介绍 &#xff08;1&…

Leetcode力扣解题记录--第42题 接雨水(动规和分治法)

题目链接&#xff1a;42. 接雨水 - 力扣&#xff08;LeetCode&#xff09; 这里我们可以用两种方法去解决巧妙地解决这个题。首先来看一下题目 题目描述 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。…

宝塔配置pgsql可以远程访问

本地navicat premium 17.0 可以远程访问pgsql v16.1宝塔的软件商店里&#xff0c;找到pgsql管理器&#xff1b;在pgsql管理器里找到客户端认证&#xff1a;第二步&#xff1a;配置修改&#xff0c;CtrlF 查找listen_addresses关键字&#xff1b;第三步&#xff1a;在navicat里配…

小架构step系列12:单元测试

1 概述 测试的种类很多&#xff1a;单元测试、集成测试、系统测试等&#xff0c;程序员写代码进行测试的可以称为白盒测试&#xff0c;单元测试和集成测试都可以进行白盒测试&#xff0c;可以理解为单元测试是对某个类的某个方法进行测试&#xff0c;集成测试则是测试一连串的…

SpringBoot3-Flowable7初体验

目录简介准备JDKMySQLflowable-ui创建流程图要注意的地方编码依赖和配置控制器实体Flowable任务处理类验证启动程序调用接口本文源码参考简介 Flowable是一个轻量的Java业务流程引擎&#xff0c;用于实现业务流程的管理和自动化。相较于老牌的Activiti做了一些改进和扩展&…

phpMyAdmin:一款经典的MySQL在线管理工具又回来了

phpMyAdmin 是一个免费开源、基于 Web 的 MySQL/MariaDB 数据库管理和开发工具。它提供了一个直观的图形用户界面&#xff0c;使得我们无需精通复杂的 SQL 命令也能执行大多数数据库管理任务。 phpMyAdmin 项目曾经暂停将近两年&#xff0c;不过 2025 年又开始发布新版本了。 …

存储服务一NFS文件存储概述

前言&#xff1a; 网络文件系统&#xff08;Network File System&#xff0c;NFS&#xff09;诞生于1984年&#xff0c;由Sun Microsystems首创&#xff0c;旨在解决异构系统间的文件共享需求。作为一种基于客户端-服务器架构的分布式文件协议&#xff0c;NFS允许远程主机通过T…

libimagequant 在 mac 平台编译双架构

在 macOS 上编译 libimagequant 的双架构&#xff08;aarch64 x86_64&#xff09;通用二进制库&#xff0c;以下是完整步骤&#xff1a;​​1. 准备 Rust 工具链​​ # 安装两个目标平台 rustup target add aarch64-apple-darwin x86_64-apple-darwin# 确认安装成功 rustup ta…

暑期自学嵌入式——Day01(C语言阶段)

点关注不迷路哟。你的点赞、收藏&#xff0c;一键三连&#xff0c;是我持续更新的动力哟&#xff01;&#xff01;&#xff01; 主页&#xff1a; 一位搞嵌入式的 genius-CSDN博客https://blog.csdn.net/m0_73589512?spm1011.2682.3001.5343感悟&#xff1a; 今天我认为最重…