【Linux】—— 浅谈进程优先级

简介: 【Linux】—— 浅谈进程优先级

本期,我们将来聊聊的是关于进程优先级的相关知识!!!


序言

首先,大家对于优先级的概念肯定不会陌生的。在日常生活中,我们可以看到许多不同形式的优先级。

以下是一些常见的优先级案例:

  1. 交通信号灯:交通信号灯通过红、黄、绿等颜色的灯光来表示不同车辆的优先级。例如,红灯表示停止,绿灯表示可以通行,黄灯表示警告或准备停车。
  2. 高速公路上的车道:在高速公路上,不同的车道可能具有不同的优先级。例如,快车道(左侧车道)通常用于超车和高速行驶,而慢车道(右侧车道)用于低速行驶或者准备下道。
  3. 食堂打饭队伍:在食堂中,人们通常会排队等待打饭。按照先后顺序,先来到的人有较高的优先级,可以先打饭。
  4. 紧急救援车辆:紧急救援车辆(如救护车、消防车、警车)在道路上享有较高的优先级。其他车辆需要给予它们让路的权益,以确保它们能够尽快赶到目的地。
  5. 工作任务优先级:在工作场所,任务通常具有不同的优先级。根据任务的重要性和紧急程度,决定哪些任务应该首先完成。

这些都是日常生活中一些常见的优先级案例。通过确定优先级,可以有效地管理和安排任务、资源或行动。

虽然大家都知道有优先级这样的概念,但是大家难道不好奇为什么会有优先级吗?

在生活和工作中,存在优先级是为了帮助我们更有效地管理时间、资源和任务。我们以上诉“食堂打饭” 这个例子给大家举例:

  1. 假如你现在读的学校里面有 1万人,每学期的收费为 100万 ,学校为了让各位同学有更好的体验呢为每个同学都配置私人的做饭阿姨,当你想吃饭时直接去找对应的私厨即可(此时你不用排队,直接去了就可以吃);
  2. 但是事实是这样的吗?事实不是这样的。第一点因为我们没有交那么多的钱,导致没有相应的资源进行同等的支撑,导致资源不够(这就等同于食堂的窗口或者私厨不可能是对应的每个学生一个);
  3. 这就导致最终是在有限的食堂阿姨的忙碌下做好饭菜,从而让我们到有限个的窗口是进行打饭操作。

因此类比上述,我们同样可以知道在计算机系统中,由于 CPU的资源有限,多量进程来竞争少量的资源就会导致多进程竞争问题。因此优先级的概念是为了管理和调度各种任务、进程或线程的执行顺序。


(一)基本概念

上述我们叙述了什么叫做优先级以及为什么要有优先级这样的概念。接下来,我们放在Linux环境下来具体认识。

首先结合Linux下认识其基本概念:

  1. cpu资源分配的先后顺序,就是指进程的优先权(priority)。
  2. 优先权高的进程有优先执行权利。配置进程优先权对多任务环境的linux很有用,可以改善系统性能。
  3. 还可以把进程运行到指定的CPU上,这样一来,把不重要的进程安排到某个CPU,可以大大改善系统整 体性能。

(二)查看系统进程

在linux或者unix系统中,用ps –l命令则会类似输出以下几个内容:

我们很容易注意到其中的几个重要信息,有下:

  • UID : 代表执行者的身份
  • PID : 代表这个进程的代号
  • PPID :代表这个进程是由哪个进程发展衍生而来的,亦即父进程的代号
  • C:表示进程的CPU占用率
  • PRI :代表这个进程可被执行的优先级,其值越小越早被执行
  • NI :nice值 ,代表这个进程优先级的修正数据
  • ADDR:进程的内存地址空间状态
  • SZ:进程的内存大小(以页面为单位)
  • WCHAN:进程当前位于的内核函数或事件
  • TTY:进程所关联的终端设备
  • TIME:进程已经运行的CPU时间
  • CMD:进程的命令名称

使用【ps –l】命令可以获取比普通ps命令更详细的进程信息,例如进程的用户、父进程、CPU占用率、内存使用情况、优先级等。这有助于更全面地了解系统中运行的进程,并用于调试、性能监控和问题排查等操作。

1、PRI and NI

在Linux中,PRI(Priority)和NI(Nice value)是与进程调度和优先级相关的概念。

接下来,我们具体聊聊这两组概念:

PRI(Priority)

  • PRI也还是比较好理解的,即进程的优先级,或者通俗点说就是程序被CPU执行的先后顺序,它是一个整数值;
  • 较小的PRI值表示较高的优先级。PRI决定了进程在竞争CPU时间时的调度顺序。
  • PRI值越小越快被执行,当加入nice值后,将会使得PRI变为:PRI(new)=PRI(old)+nice

NI(Nice value)

  • 就是我们所要说的nice值了,其表示进程可被执行的优先级的修正数值,它允许用户将进程的优先级在一定范围内进行调整;
  • NI的范围也从【-20,19】,其中-20表示最高优先级,19表示最低优先级。较小的NI值表示较高的优先级。
  • 所以,调整进程优先级,在Linux下,就是调整进程nice

在Linux中,每个进程都有一个PRI值和NI值。当多个进程同时需要竞争CPU资源时,调度器会根据进程的PRI和NI值来决定哪个进程获得处理器时间。通常情况下,对于普通用户创建的进程,其PRI值默认为0,而NI值默认为0。

使用NI可以调整进程的优先级,当设置一个较高的NI值时,进程将拥有较低的优先级,使其在竞争CPU时间上处于相对较低的地位。相反,当设置一个较低的NI值时,进程将拥有较高的优先级,有更高的机会获得CPU执行时间。

💨 top命令更改已存在进程的nice:

  • top
  • 进入top后按“r”–>输入进程PID–>输入nice值

接下来,我们以代码的视角带大家去认识:

演示如下:

【注意】

  • 用户通常只能调整自己创建的进程的NI值。修改进程的PRI和NI值可能需要root权限或相应的特权。

2、PRI vs NI

  1. 需要强调一点的是,进程的nice值不是进程的优先级,他们不是一个概念,但是进程nice值会影响到进 程的优先级变化。
  2. 可以理解nice值是进程优先级的修正修正数据

(三)设置优先级

除了上述使用【top】指令之外,还有很多种方式可以对其进行设置。

例如:

在Linux中,可以使用nicerenice命令来调整进程的优先级:

  1. nice命令:将新的进程启动时的优先级设置为指定值。
  • 语法:nice-n <优先级> <命令>
  • 示例:nice-n 10 ./my_program 将以较低优先级(较高的nice值)运行my_program
  • 注意:默认情况下,nice命令将进程的优先级增加到父进程的优先级。
  1. renice命令:修改正在运行的进程的优先级。
  • 语法:renice<优先级> -p <进程ID>
  • 示例:renice-5 -p 1234 将进程ID为1234的进程优先级调整为较高的优先级(较小的优先级值)。
  • 注意:只有具有足够权限的用户才能修改其他用户的进程优先级。

💨 此外,系统还设置一些接口可以帮助我们去对其进行设置:

  • 在Linux中,可以使用 【getpriority】接口函数来获取指定进程或进程组的优先级

以下是【getpriority】函数的详细说明:

【分析】

【which】参数是一个常量,用于指定获取优先级的对象类型。常见的取值包括:

  • PRIO_PROCESS:表示根据进程ID获取优先级。
  • PRIO_PGRP:表示根据进程组ID获取优先级。
  • PRIO_USER:表示根据用户ID获取优先级。

who】参数是与【which】相关的ID,用于指定要获取优先级的具体对象。例如,如果【which】PRIO_PROCESS,则who应为要查询的进程的ID。

函数返回值为进程的当前优先级。返回值越小表示较高的优先级,而大于0的返回值表示出现错误。

以下是一个示例,演示如何使用【getpriority】函数获取指定进程的优先级:

#include <stdio.h>
#include <sys/time.h>
#include <sys/resource.h>
int main() {
    int priority = getpriority(PRIO_PROCESS, 895); // 获取进程ID为895的进程的优先级
    if (priority == -1) {
        perror("getpriority");
        return 1;
    }
    printf("Priority of process 895: %d\n", priority);
    return 0;
}

【注意】

只有具有足够权限的用户才能获取其他用户进程的优先级信息。否则将返回错误并设置errnoEPERM(没有操作权限)。因此,在使用【getpriority】函数时,请确保以合适的用户权限运行程序。

💨 对于更多的进程介绍,大家可以参考:进程基本介绍


总结

以上便是关于进程优先级的全部知识了。感谢大家的观看与支持!!!

相关文章
|
3天前
|
存储 Linux Shell
Linux:进程等待 & 进程替换
Linux:进程等待 & 进程替换
29 9
|
3天前
|
存储 Linux C语言
Linux:进程创建 & 进程终止
Linux:进程创建 & 进程终止
24 6
|
1天前
|
Linux 数据库
linux守护进程介绍 | Linux的热拔插UDEV机制
linux守护进程介绍 | Linux的热拔插UDEV机制
linux守护进程介绍 | Linux的热拔插UDEV机制
|
1天前
|
Unix Linux 调度
linux线程与进程的区别及线程的优势
linux线程与进程的区别及线程的优势
|
1天前
|
Linux 调度 C语言
|
2天前
|
存储 安全 Linux
【Linux】详解进程通信中信号量的本质&&同步和互斥的概念&&临界资源和临界区的概念
【Linux】详解进程通信中信号量的本质&&同步和互斥的概念&&临界资源和临界区的概念
|
2天前
|
消息中间件 算法 Linux
【Linux】详解如何利用共享内存实现进程间通信
【Linux】详解如何利用共享内存实现进程间通信
|
2天前
|
Linux
【Linux】命名管道的创建方法&&基于命名管道的两个进程通信的实现
【Linux】命名管道的创建方法&&基于命名管道的两个进程通信的实现
|
2天前
|
Linux
【Linux】匿名管道实现简单进程池
【Linux】匿名管道实现简单进程池