《Linux系统编程之进程基础》【进程优先级】

【进程优先级】目录

  • 前言:
  • ---------------进程优先级---------------
    • [1. 什么是进程的优先级?](#1. 什么是进程的优先级?)
    • [2. 如何查看进程的优先级?](#2. 如何查看进程的优先级?)
    • [3. 进程的UID是什么?](#3. 进程的UID是什么?)
    • [4. 如何理解 PRI 和 NI?](#4. 如何理解 PRI 和 NI?)
      • [一、PRI(优先级)---> 动态优先级](#一、PRI(优先级)---> 动态优先级)
      • [二、NI(nice 值)---> 静态优先级](#二、NI(nice 值)---> 静态优先级)
    • [5. 如何更改进程的优先级?](#5. 如何更改进程的优先级?)
      • [戏耍于股掌之间 ①](#戏耍于股掌之间 ①)
      • [戏耍于股掌之间 ②](#戏耍于股掌之间 ②)
    • [6. 优先级取值范围里的秘密?](#6. 优先级取值范围里的秘密?)
    • [7. 进程的竞争、独立、并行、并发都是什么鬼?](#7. 进程的竞争、独立、并行、并发都是什么鬼?)

往期《Linux系统编程》回顾:

/------------ 入门基础 ------------/
【Linux的前世今生】
【Linux的环境搭建】
【Linux基础 理论+命令】(上)
【Linux基础 理论+命令】(下)
【权限管理】

/------------ 开发工具 ------------/
【软件包管理器 + 代码编辑器】
【编译器 + 自动化构建器】
【版本控制器 + 调试器】
【实战:倒计时 + 进度条】

/------------ 系统导论 ------------/
【冯诺依曼体系结构 + 操作系统基本概述】

/------------ 进程基础 ------------/
【进程入门】
【进程状态】

前言:

hi ~ 小伙伴们大家好啊!!(ノ≧∀≦)ノ

今天阴历九月的最后一天, 好了没啥事,就是来跟大家打个招呼,哈哈 ( ̄▽ ̄)*!

---------- 2025 年 11 月 20 日(十月初一)周四,小雪前两天

今天我们接着学习进程相关的知识------【进程优先级】 (´∀`)♡、( ̄▽ ̄) 、*

那么我们先剧透一下今天要学习的内容:

  • 进程优先级:就是操作系统给进程分配 CPU 资源的 "先后顺序",准备好被戏耍了吗😏👻

---------------进程优先级---------------

1. 什么是进程的优先级?

进程的优先级:是操作系统用于 CPU 资源分配时的重要依据,它决定了进程获取 CPU 时间片的概率。

  • 操作系统中通常大量大量进程同时运行,但 CPU 核心数量有限,需要必要时甚至需要几十个成百千进程 "共享" 一个 CPU 核心
  • 优先级的存在,就是为了让系统能区分进程的重要程度
    • 比如,系统关键服务(如:内存管理、进程调度)需要优先运行
    • 然而,普通应用程序(如:文本编辑器)可以适当延后,从而保证系统整体的高效和稳定

疑问:优先级与权限的区别是什么?

  • 优先级解决的是 :"得到资源的先后" 的问题,也就是在都有资格获取资源的前提下,谁先谁后获得资源
  • 权限解决的是 :"是否能得到某种资源" 的问题,即一个进程有没有权利去获取某类资源,有相应权限才能去竞争该资源的使用,没有权限的话连竞争的资格都没有

2. 如何查看进程的优先级?

在 Linux 系统里,使用 ps -l 命令,会输出类似如下的内容:

我们很容易从中注意到几个关键信息,具体如下:

  • UID代表进程执行者的用户身份标识,通过 UID 能明确是哪个用户启动了该进程

  • PID是进程的唯一代号,系统通过 PID 来区分和管理不同的进程
  • PPID表示该进程的父进程代号,即这个进程是由哪个进程创建衍生而来的

  • PRI代表进程可被 CPU 执行的优先级,数值越小,意味着进程越先被 CPU 调度执行
  • NI代表进程的 nice 值,它会影响进程的优先级(PRI
    • nice 值的范围通常是 -20 到 19
    • nice 值越小,进程优先级相对越高(不过普通用户只能调大 nice 值来降低进程优先级,root 用户可自由调整)

3. 进程的UID是什么?

UID(User Identifier,用户标识符):是一个用于唯一标识系统中用户的数值,每个进程都会关联一个 UID,用于表示该进程的 "所有者身份"。

UID 的核心作用

  • 权限控制:系统通过进程的 UID 判断其拥有的操作权限
    • 只有 UID 为 0 的进程(root 用户)能执行修改系统配置、访问敏感文件等特权操作
    • 普通用户的进程(UID 通常大于 1000)则受限于其权限范围
  • 资源归属:进程创建的文件、目录等资源,其所有者属性会继承进程的 UID,确保资源归属清晰
  • 审计追踪:通过进程的 UID,管理员可以追溯某个操作是由哪个用户发起的,便于系统审计和故障排查

在 Linux 系统中,用户身份的识别并非依赖我们直观看到的用户名,而是通过UID(用户 ID) 这个数字标识来实现的 ------ 每个进程都会绑定一个 UID,它就像进程的 "身份凭证"。

其实不止进程,我们创建的文件(包括可执行程序)也同样关联着 UID:

  • 当文件创建时,系统会自动将创建者的 UID 写入文件属性中,用于标记 "这个文件是谁的"
  • 而进程启动时,也会继承启动者的 UID,明确 "这个进程是谁发起的"

平时我们用ls查看文件、touch创建文件、cat读取文件等操作,本质上都是通过进程来与文件交互的。


疑问:那进程如何判断自己对某个文件拥有 "所有者(owner)""所属组(group)" 还是 "其他用户(other)" 的权限呢?

关键就在于进程的 UID 与文件的 UID(及 GID,组 ID)的比对逻辑:

  1. 进程会先拿自己的 UID 与文件的所有者 UID 对比,若相等,则匹配 "所有者" 权限
  2. 若不相等,再拿自己的 GID(组 ID)与文件的所属组 GID 对比,若相等,则匹配 "所属组" 权限
  3. 若前两者都不匹配,就默认按 "其他用户" 的权限来处理

简单说

  • 进程就像 "执行者",而它的 UID 则代表了 "背后的老大"(也就是启动它的用户)
  • 操作系统判断权限时,本质上是在核对 "执行者(进程)" 与 "资源(文件)" 之间的权限关系,而非直接识别用户本身

我们用户与系统的所有交互,最终都会转化为进程的操作 ------ 无论是点击图标、输入命令还是运行程序,都会触发进程的创建。

  • 这些进程带着我们的 UID "代表" 我们与系统打交道,而操作系统通过校验进程与资源的权限关系,确保每个操作都符合安全规则
  • 这就是 Linux 权限管理的核心逻辑:以进程为中介,通过 UID/GID 实现用户与资源的权限绑定

4. 如何理解 PRI 和 NI?

在 Linux 系统中,PRI(Priority,优先级)NI(nice 值)都是与进程调度相关的重要概念,它们共同影响着进程获取 CPU 资源的先后顺序,以下是详细介绍:

一、PRI(优先级)---> 动态优先级

PRI(优先级)(动态优先级)

  • 基本含义:PRI 是进程的动态优先级,它直接决定了进程被 CPU 调度执行的先后顺序
    • 它的取值范围一般是 0 - 139,默认值为 80,数值越小,进程的优先级越高
    • 系统的调度器会优先选择 PRI 值较低的进程投入运行,因为这意味着该进程的优先级更高,应该得到优先处理
  • 计算方式:PRI 的值是由内核根据进程的 nice 值(NI)等多种因素动态计算得出的,不同的内核版本在具体计算方式上可能会存在一些差异
    • 一般来说,nice 值是影响 PRI 的一个重要因素,但不是唯一因素,系统还会综合考虑进程的运行情况、资源占用等其他信息来确定最终的 PRI 值
  • 核心作用:通过 PRI,Linux 系统能够高效地管理 CPU 资源的分配,确保重要的进程(如:系统服务进程)能够优先获得 CPU 时间片,从而保障系统的稳定和高效运行
    • 比如,系统中负责内存管理的进程,通常会被赋予较低的 PRI 值,以便它能够及时处理内存相关的事务,避免因内存管理不及时而导致系统性能下降

二、NI(nice 值)---> 静态优先级

NI(nice 值)(静态优先级)

  • 基本含义:NI 即 nice 值,是进程的静态优先级,nice 值体现了进程对 CPU 资源的 "谦让" 程度
    • 它的取值范围是 -20(最高优先级)到 19(最低优先级),默认值为 0
    • nice 值越小,进程就越 "不谦让",也就是优先级越高,会更容易获得 CPU 资源
    • nice 值越大,进程就越 "谦让",优先级也就越低,获得 CPU 资源的机会相对较少
  • 调整方式:普通用户只能将进程的 nice 值调大(即:降低进程的优先级),而 root 用户拥有更高的权限,可以随意调整进程的 nice 值,既可以调大也可以调小
    • 调整 nice 值的命令主要有nice(在启动进程时指定 nice 值)和renice(在进程运行过程中修改 nice 值)
    • 例如:使用nice -n 5 ./myprogram命令可以以 nice 值为 5 的优先级启动myprogram程序;使用renice 10 -p 1234命令可以将进程 ID 为 1234 的进程的 nice 值修改为 10
  • 与 PRI 的关系:nice 值是影响 PRI 值的一个关键因素
    • 通常情况下,nice 值越低,计算得出的 PRI 值也会越低,进程的优先级也就越高
    • 但需要注意的是,PRI 还会受到其他因素的影响,所以 nice 值和 PRI 并不是简单的线性对应关系

两者关系总结:

  • nice 值是用户可以直接操作和调整的参数,它为用户提供了一种控制进程优先级的手段
  • 而 PRI 是系统最终用于进程调度的优先级数值,是根据 nice 值以及系统内部的其他计算逻辑动态确定的

通过合理设置 nice 值,用户可以在一定程度上影响进程的 PRI 值,进而改变进程在系统中的调度顺序,达到优化系统资源分配和进程执行效率的目的。

5. 如何更改进程的优先级?

一个进程真实的优先级 = PRI的默认值(即:80) + NI

戏耍于股掌之间 ①

鼠鼠现在来考考大家:当前code.exe对应的进程优先级是多少呢?

可能有小伙伴会直接回答:这很简单,不就是PRI + NI嘛!PRI显示 90、NI是 10,90+10=100,所以优先级是 100

  • 哈哈鼠鼠就猜有些小伙伴可能已经忘了上面计算进程优先级的公式是什么了。公式种说的可不是PRI哦,是PRI的默认值80呀
  • 所以当NI为 10 时,实际的进程优先级计算方式是 "PRI默认基准值 + NI",也就是 80+10=90

所以当前进程的优先级就是 90,也就是PRI显示的数值

戏耍于股掌之间 ②

可能有小伙伴会疑惑:明明这个进程的 NI 值已经被改成 -10 了,但 PRI 为什么是 70 呢?按道理,不是应该是 90 - 10,得到 80 吗?怎么结果成了 70?

哈哈,这位可爱的小伙伴你是不是又忘记了怎么计算进程的优先级的了:进程的优先级 = PRI 的默认值(也就是 80) + NI 值,所以这个进程的优先级:80 + (-10) = 70 哦(⊙o⊙),而不是80


现在可能会有一些小伙伴们已经被鼠鼠给激怒了,你这是算是什么嘛,并质问鼠鼠:进程优先级为什么要采用这样的定义方式呢?

但其实这种优先级的设定是非常合理的。

  • 因为要是每次调整优先级都得基于上一次的优先级来进行,那我们是不是还得去查看上一次的优先级是多少?
  • 而采用现在这种通过 "PRI 默认值(80) + NI 值" 来计算优先级的方式,我们就不用去关心这个进程之前的优先级历史了,直接根据 NI 值进行调整就可以啦,这样操作起来是不是更方便、更高效呢。

6. 优先级取值范围里的秘密?

在 Linux 系统中,我们可修改的进程优先级范围通常被限制在一定区间,比如 60 到 99 ,这背后主要是出于进程调度公平性的考量。

  • 进程优先级是可以进行调整的,但调整的幅度不能过大
  • 这是因为如果优先级的设定不合理,就会出现这样一种情况:优先级低的进程可能会长时间无法获取 CPU 资源

打个比方,CPU 资源就像是大家都需要的公共设施,而进程就像是等待使用公共设施的人。

  • 要是某个人(高优先级进程)一直霸占着设施,其他人(低优先级进程)就没办法使用了
  • 在计算机里,这种情况被称为 "进程饥饿", 也就是低优先级进程因为长时间得不到 CPU 资源,就如同人长时间饥饿一样,无法正常执行任务,进而影响整个系统的运行效率和稳定性

所以:对进程优先级修改范围进行限制,能有效保障系统中各个进程都能相对公平地获取 CPU 资源,维持系统的有序运行。

7. 进程的竞争、独立、并行、并发都是什么鬼?

在操作系统中,进程的 竞争独立并行并发是描述进程不同特性和运行状态的重要概念,以下是对它们的简述:

  • 进程的竞争:在计算机系统中,CPU、内存、磁盘 I/O 等系统资源是有限的 ,当多个进程同时需要使用这些资源时,就会产生竞争
    • 比如多个进程都需要占用 CPU 时间片来执行任务,或者都想访问有限的内存空间
    • 为了协调这种竞争关系,操作系统会通过进程调度算法来决定哪个进程优先获得资源
    • 还会利用锁机制等方法避免资源冲突,保证系统稳定运行

  • 进程的独立:每个进程都有自己独立的地址空间、运行环境和资源
    • 一个进程的运行不会干扰其他进程的运行,一个进程崩溃一般也不会影响其他进程的正常执行
    • 比如在电脑上同时打开浏览器和音乐播放器两个进程,浏览器进程出现异常关闭,音乐播放器进程仍能继续播放音乐
    • 进程的独立性使得系统可以同时处理多个任务,提高了系统的可靠性和稳定性

  • 进程的并行:指多个进程在同一时刻,分别在不同的 CPU 核心上同时执行
    • 这需要计算机具备多核 CPU,例如在一个 4 核 CPU 的计算机中,可以同时有 4 个进程分别在 4 个核心上并行运行
    • 并行能充分利用多核 CPU 的性能,极大地提高系统的处理能力和效率,加快任务的执行速度

  • 进程的并发指在一段时间内,多个进程都处于运行状态,但在同一时刻,只有一个进程在 CPU 上执行
    • 操作系统通过快速地在多个进程之间 进行切换,使得每个进程都能在一定时间内获得 CPU 资源并向前推进,从用户的角度来看,这些进程就好像是同时在运行一样
    • 比如在单核 CPU 的计算机上,同时运行文本编辑、网页浏览等多个进程,CPU 会在这些进程之间快速切换,实现看似并发的效果

总的来说:

进程的 竞争体现了 资源分配的需求独立保证了 进程运行的稳定性并行并发则从不同角度 提高了系统的处理能力和效率,满足用户对多任务处理的需求

小知识:鼠鼠教大家怎么判断自己的Linux有几个CPU?

相关推荐
草莓熊Lotso1 小时前
C++ STL map 系列全方位解析:从基础使用到实战进阶
java·开发语言·c++·人工智能·经验分享·网络协议·everything
_F_y1 小时前
C++IO流
c++
草莓熊Lotso1 小时前
《算法闯关指南:优选算法--模拟》--41.Z 字形变换,42.外观数列
开发语言·c++·算法
加勒比之杰克1 小时前
【操作系统原理】Linux 进程控制
linux·运维·服务器·进程控制
XH-hui3 小时前
【打靶日记】TheHackerLabs 之 THLPWN
linux·网络安全·thehackerlabs·thl
河铃旅鹿4 小时前
Android开发-java版:Framgent
android·java·笔记·学习
我是小超人-雨石花7 小时前
Jenkins&Robot Framework持续集成
运维·jenkins·ci
AA陈超7 小时前
ASC学习笔记0020:用于定义角色或Actor的默认属性值
c++·笔记·学习·ue5·虚幻引擎
coderxiaohan8 小时前
【C++】仿函数 + 模板进阶
开发语言·c++