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

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


目录

序言

(一)基本概念

(二)查看系统进程

1、PRI and NI

2、PRI vs NI

(三)设置优先级


序言

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

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

  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命令将进程的优先级增加到父进程的优先级。
  2. 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】函数时,请确保以合适的用户权限运行程序。

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


总结

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

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

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

相关文章

使用docker安装Nacos,远程连接nacos报错,please check server x.x.x.x ,port 9848 is available

报错: please check server 127.0.0.1 ,port 9848 is available 原因: 当nacos客户端升级为2.x版本后&#xff0c;新增了gRPC的通信方式&#xff0c;新增了两个端口。这两个端口在nacos原先的端口上(默认8848)&#xff0c;进行一定偏移量自动生成.。 当客户端升级成2.x版本时&…

传统图像处理之图像美化——图像金字塔

代码实战&#xff1a;图像融合 我将肯巴.沃克和约翰.沃尔融合在了一起。 具体见注释。 import numpy as np import cv2 import scipy.ndimage as ndimageimg cv2.imread("1.png")img1 cv2.imread("2.png")imgcv2.resize(img,(192,192)) img1cv2.resiz…

BERT 论文精读与理解

1.论文题目 BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding 2.论文摘要 本文引入了一种名为 BERT 的新语言表示模型&#xff0c;它代表 Transformers 的双向编码器表示。与最近的语言表示模型&#xff08;Peters et al., 2018a&#xf…

DRF+Vue.JS前后端分离项目实例(上):使用 Django-Rest-Framework快速实现 RESTful API 接口编程

1. RESTFul API 接口需求及设计 本文以学生信息查询功能为例&#xff0c;采用前后端分离架构&#xff0c;要求后端提供RESTFul 接口。 1.1 本例要求提供如下查询功能&#xff1a; 列表查询、单条查询添加学生信息更改学生信息删除学生信息 1.2 数据库student表结构如下&…

本地部署 ChatPPT

本地部署 ChatPPT 1. 什么是 ChatPPT2. Github 地址3. 安装 Miniconda34. 创建虚拟环境5. 安装 ChatPPT6. 运行 ChatPPT 1. 什么是 ChatPPT ChatPPT由chatgpt提供支持&#xff0c;它可以帮助您生成PPT/幻灯片。支持中英文输出。 2. Github 地址 https://github.com/huimi24/…

开发中易犯错的事务问题

1.不指定rollbackFor 使用spring的声明式事务&#xff08;即Transactional注解&#xff09;时&#xff0c;如果不指定rollbackFor&#xff0c;那么当程序发生Error时&#xff0c;事务将不会回滚&#xff01;&#xff01;&#xff01;显然这将导致数据不一致&#xff01; 如下述…

动态规划--Fibonacci数列 III

描述 众所周知&#xff0c;Fibonacci数列是一个著名数列。它的定义是&#xff1a; 本题要求采用第三种方法&#xff1a;简单的动态规划。 用数组把求出来的 Fibonacci 数列保存下来&#xff0c;以免后面要的时候再算一次。 输入描述 每行一个整数 i &#xff0c;表示 Fibona…

Linux C程序开发,多线程编程、网络编程

目录 多线程编程 网络编程 Linux C程序开发是指在Linux操作系统下使用C语言进行开发的过程。Linux是一种开源的操作系统&#xff0c;具有稳定性、安全性和灵活性等优点&#xff0c;因此在很多领域都得到了广泛的应用。 多线程编程 多线程编程是指在一个程序中同时运行多个线…

Neo4J 特性CQL语句,函数,Springboot集成

Neo4J Neo4J Neo4J一、Neo4J相关介绍1.为什么需要图数据库方案1&#xff1a;Google方案2&#xff1a;Facebook 2.特性和优势3.什么是Neo4j4.Neo4j数据模型图论基础属性图模型Neo4j的构建元素 5.软件安装 二、CQL语句1.CQL简介2.CREATE 命令3.MATCH 命令4.RETURN 子句5.MATCH和R…

Spark—通过Java、Scala API实现WordCount案例的基本操作

实验原理 Spark的核心就是RDD&#xff0c;所有在RDD上的操作会被运行在Cluster上&#xff0c;Driver程序启动很多Workers&#xff0c;Workers在&#xff08;分布式&#xff09;文件系统中读取数据后转化为RDD&#xff08;弹性分布式数据集&#xff09;&#xff0c;然后对RDD在…

FreeRTOS ~(七)互斥量 ~ (1/3)互斥量解决互斥缺陷

前情提要 FreeRTOS ~&#xff08;四&#xff09;同步互斥与通信 ~ &#xff08;2/3&#xff09;互斥的缺陷 FreeRTOS ~&#xff08;五&#xff09;队列的常规使用 ~ &#xff08;2/5&#xff09;队列解决互斥缺陷 FreeRTOS ~&#xff08;六&#xff09;信号量 ~ &#xff08;2/…

文字磨练课程:提高编辑和校对效率的方法

提高编辑和校对效率&#xff0c;可以使你更有效地完成写作任务&#xff0c;提升文章质量。以下是一些方法&#xff0c;可以帮助你在编辑和校对过程中提高效率。 1.设定目标和计划 在开始编辑和校对前&#xff0c;设定明确的目标和计划。这可以帮助你集中注意力&#xff0c;提…