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

【Hello Linux】进程优先级和环境变量

作者:@小萌新
专栏:@Linux
作者简介:大二学生 希望能和大家一起进步!
本篇博客简介:简单介绍下进程的优先级 环境变量

进程优先级环境变量

  • 进程的优先级
    • 基本概念
    • 如何查看优先级
    • PRI与NI
    • NI值的设置范围
    • NI值如何修改
      • 修改方式一 : 通过top指令修改优先级
      • 修改方式二 : 通过renice指令修改优先级
    • 进程优先级思维导图
    • 进程的四个重要概念
  • 环境变量
    • 引出
    • 基本概念
    • 常见的环境变量
    • 查看环境变量
    • 三种环境变量的作用(不建议修改)
      • PATH
        • 方式一: 将我们的可执行文件放到PATH路径中
        • 方式二: 将我们当前的路径加入到PATH路径当中
      • HOME
      • SHELL
    • 环境变量相关指令
    • 环境变量的组织方式
    • main函数的参数
    • 通过系统函数来获取环境变量
    • 思维导图总结

进程的优先级

基本概念

  1. 什么是进程优先级?

cpu资源分配的先后顺序 就是指进程的优先权(priority)

  1. 优先级存在的原因?

优先级存在的原因本质上是因为资源的不足 在系统中表现为有多个进程却只有一个cpu

如何查看优先级

我们可以使用ps -l指令来查看进程

在这里插入图片描述
其中有五个进程是比较重要的 我们这里拿出来单独解释下

  • UID 代表执行者的身份
  • PID 代表进程的代号
  • PPID 代表父进程的代号
  • PRI 代表进程的优先级
  • NI 代表这个进程的nice值 用来修正进程的优先级

PRI与NI

  • PRI是进程的优先级 通俗点说就是程序被CPU执行的先后顺序 此值越小进程的优先级别越高
  • NI值就是我们所要说的nice值了 其表示进程可被执行的优先级的修正数值
  • PRI和NI值的关系符合下面的公式 PRI(new) = PRI (old)+ NI
  • 当NI值为负值的时候 那么该程序将会优先级值将变小 优先级会变高
  • 调整进程优先级 就是调整进程的nice值
  • nice的取值范围是-20~19 一共四十个值

在Linux系统中 PRI(old)值默认为80 所以说Linux中的优先级为 PRI(new) = 80 + NI

NI值的设置范围

NI的设置范围是固定的 必须是-20~19 如果超出这个值 则设定的nice值会变为最接近这个区间的值

比如说我们设定NI值为-100 则它的值会被设置为-20

如果我们设定NI值为100 则它的值会被设置为19

为什么NI值的范围被设置成这样子

因为操作系统要尽量的保证每个进程的公平运行 如果我们可以随意将进程的优先级设置的很低那么操作系统就会倾向于执行这个进程 从而导致其他进程不能被很好的被cpu执行 所以说PRI值最好是在一个范围中

NI值如何修改

修改NI值实际上就是进程的优先级

对于NI值的修改 我们有两种方式

修改方式一 : 通过top指令修改优先级

top命令就相当于Windows操作系统中的任务管理器

我们调用top命令之后会出来这样子的界面
在这里插入图片描述

接下来我们按住 r 键 就可以它就会要求你输入需要调整NI值的进程PID

在这里插入图片描述
接下来我们输入PID之后回车 它就会让我们输入NI值
在这里插入图片描述
我们这里输入修改的NI值为15之后回车 按住q键 退出top

之后我们再次使用ps指令查看9188进程的优先级

在这里插入图片描述
我们可以看到 9188号进程的优先级确实变为75了 但是为什么进程号为 20236的优先级也变为95了呢?

这是因为20236是9188的子进程 会继承父进程的代码和数据

修改方式二 : 通过renice指令修改优先级

具体指令为renice + NI值 + 进程号

在这里插入图片描述

最后我们通过ps指令可以发现nice值被修改为了-20 最终的PRI值为60

此外需要注意的是 普通用户如果想要renice需要使用sudo指令 临时提升权限

进程优先级思维导图

在这里插入图片描述

进程的四个重要概念

  • 竞争性: 系统进程数目众多 而CPU资源只有少量 甚至1个 所以进程之间是具有竞争属性的 为了高效完成任务 更合理竞争相关资源 便具有了优先级
  • 独立性: 多进程运行 需要独享各种资源 多进程运行期间互不干扰
  • 并行: 多个进程在多个CPU下分别 同时进行运行 这称之为并行
  • 并发: 多个进程在一个CPU下采用进程切换的方式 在一段时间之内 让多个进程都得以推进 称之为并发

环境变量

引出

下面我们会有两段命令的执行来验证环境变量的存在

我们首先写出了ls命令 系统给我们列出来当前目录下的所有文件
在这里插入图片描述
我们在这里发现了一个可执行文件test

我们如果想要执行这个可执行文件的话必须要使用这样子的指令

在这里插入图片描述
现在的我们很容易理解 . 是代表当前目录的意思 / 是目录分隔符

所以说./代表的就是当前目录下 实际上就是给出了一个相对路径

让在这个相对路径中寻找一个名叫test的可执行文件

也就是说如果我们直接输入test命令 系统会不知道我们要干什么

在这里插入图片描述
通过前面的学习我们知道了指令实际上也是一个可执行文件

那为什么我们直接输入文件名就可以执行该文件呢?

这就是因为环境变量的存在

基本概念

环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数

由于它是在操作系统中的 所以一般是全局变量

常见的环境变量

  • PATH: 指定命令的搜索路径
  • HOME: 指定用户的主工作目录(即用户登录到Linux系统中的默认所处目录)
  • SHELL: 当前Shell,它的值通常是/bin/bash

查看环境变量

我们在linux中可以使用echo命令来查看环境变量

在这里插入图片描述
我们可以查看到这里环境变量的地址有这五个

三种环境变量的作用(不建议修改)

PATH

我们前面引入环境变量的时候 抛出过一个问题 为什么我们系统的可执行文件我们就可以直接执行 而我们自己编译的可执行文件却不可以呢?

这个就是因为环境变量PATH的存在

我们首先查看下PATH的路径

在这里插入图片描述
我们发现PATH由于多条路径组成 两个路径之间使用冒号分隔

之后我们再查看下ls指令的所在位置

在这里插入图片描述
我们发现ls指令的可执行文件就放在PATH路径中

而我们的可执行文件之所以要指定位置的就是因为它们不再PATH路径中

那么如果想要让我们自己编译可执行文件直接运行不指定路径应该怎么办呢?

很显然我们这里有两种解决方式

方式一: 将我们的可执行文件放到PATH路径中

在这里插入图片描述

我们可以发现 将proc放到PATH路径之后就可以直接执行前面不加路径了

注意 这里的可执行文件名不能为test 否则就算加入了也什么都不会发生

方式二: 将我们当前的路径加入到PATH路径当中

在这里插入图片描述
这样子我们便把当前路径加入到PATH路径当中去了

我们可以使用如下代码验证

在这里插入图片描述
在这里插入图片描述
其中我们配置PATH是临时配置

而我们添加可执行文件到目录下确实永久配置的

所以试验完毕之后记得删除PATH中的可执行文件

HOME

任何一个用户在运行系统登录时都有自己的主工作目录(家目录) 环境变量HOME当中即保存的该用户的主工作目录

我们查看HOME目录使用如下命令

在这里插入图片描述

SHELL

我们在Linux操作系统当中所敲的各种命令 实际上需要由命令行解释器进行解释 而在Linux当中有许多种命令行解释器(例如bash、sh) 我们可以通过查看环境变量SHELL来知道自己当前所用的命令行解释器的种类

我们查看SHELL使用如下命令

在这里插入图片描述

环境变量相关指令

  1. echo 作用: 显示某个环境变量的值

例如我们可以通过这个指令查看PATH
在这里插入图片描述

  1. export 作用: 设置一个新的环境变量

例如我们可以多设置一个路径的环境变量
在这里插入图片描述

  1. env 作用: 显示所有环境变量

在这里插入图片描述

  1. set 作用: 显示本地定义的shell变量和环境变量

在这里插入图片描述

  1. unset 作用:清除环境变量

在这里插入图片描述
我们可以看到环境变量中有个myval

如果我们想要清除这个环境变量我们可以使用unset

在这里插入图片描述
清除了之后我们就找不到这个环境变量了

环境变量的组织方式

在linux中 环境变量是通过一张表组织起来的 如果我们使用c语言的知识去理解的话其实就是环境变量表就是一个二级指针

它指向一个一级指针数组 这里面放置着各种环境变量 最后的环境变量是NULL

在这里插入图片描述

main函数的参数

其实我们所调用的main函数是有参数的

它一共有三个参数 分别是 argc argv envp

其中argv是一个指针 它指向一个数组 里面储存的是char*类型的数据
argc是一个整数 它标识着argv中有效元素的个数

我们可以写下下面的代码来验证

在这里插入图片描述

我们首先来验证下argc的个数

假如我们main函数后面不带选项 那么此时argc的个数是多少呢?

在这里插入图片描述
我们发现它走了第一个条件

其实这也很好理解 因为在什么条件都没有的时候argv的数组中有一个本程序的地址

当我们对于argc 和 argv有了更深一步的认知之后我们就可以在我们编写的程序中加入选项做一些事

比如说我们可以写下下面的代码

如果我们后面所携带的参数不同 那么这个程序就会做不同的事情
在这里插入图片描述

下面是演示效果

在这里插入图片描述

大概的argv数组图如下所示

在这里插入图片描述

我们再来看看它的第三个参数 envp

我们前面说过了 它其实就是一个二级指针 指向一个数组 里面全部是char*类型的数据 也就是环境变量 数组中的最后一个数据为空

那么我们可以直接遍历之来获取环境变量

在这里插入图片描述

此外 我们还可以直接用二级指针 environ来获取环境变量

注意 libc中定义的全局变量environ指向环境变量表 environ没有包含在任何头文件中 所以在使用时要用extern进行声明

代码标识如下

在这里插入图片描述

运行结果如下

我们可以发现二者并没有很多差别
在这里插入图片描述

通过系统函数来获取环境变量

除了我们上面所说的方法之外我们还可以使用getenv系统函数来查看环境变量

具体使用代码如下所示

在这里插入图片描述
效果如下

在这里插入图片描述

思维导图总结

在这里插入图片描述

相关文章:

【Hello Linux】进程优先级和环境变量

作者:小萌新 专栏:Linux 作者简介:大二学生 希望能和大家一起进步! 本篇博客简介:简单介绍下进程的优先级 环境变量 进程优先级环境变量进程的优先级基本概念如何查看优先级PRI与NINI值的设置范围NI值如何修改修改方式…...

日期:Date,SimpleDateFormat常见API以及包装类

一.Date类 package com.gch.d1_date;import java.util.Date;/**目标:学会使用Date类处理时间,获取时间的信息*/ public class DateDemo1 {public static void main(String[] args) {// 1.创建一个Date类的对象:代表系统此刻日期时间对象Date d new Date();System.out.println(…...

嵌入式之ubuntu终端操作与shell常用命令详解

目录 文件和目录列表 基本列表功能 显示列表长度 过滤输出列表 浏览文件系统 Linux 文件系统 遍历目录 处理文件 创建文件 复制文件 制表键自动补全 重命名文件 删除文件 处理目录 创建目录 删除目录 ​编辑其他常用命令与操作 Uname命令 clear命令 返回上一级命令 显…...

【Shell学习笔记】6.Shell 流程控制

前言 本章介绍Shell的流程控制。 Shell 流程控制 和 Java、PHP 等语言不一样&#xff0c;sh 的流程控制不可为空&#xff0c;如(以下为 PHP 流程控制写法)&#xff1a; 实例 <?php if (isset($_GET["q"])) {search(q); } else {// 不做任何事情 }在 sh/bash…...

27k入职阿里测开岗那天,我哭了,这5个月付出的一切总算没有白费~

先说一下自己的个人情况&#xff0c;计算机专业&#xff0c;16年普通二本学校毕业&#xff0c;经历过一些失败的工作经历后&#xff0c;经推荐就进入了华为的测试岗&#xff0c;进去才知道是接了个外包项目&#xff0c;不太稳定的样子&#xff0c;可是刚毕业谁知道什么外包不外…...

服务端开发之Java备战秋招面试篇5

努力了那么多年,回头一望,几乎全是漫长的挫折和煎熬。对于大多数人的一生来说,顺风顺水只是偶尔,挫折、不堪、焦虑和迷茫才是主旋律。我们登上并非我们所选择的舞台,演出并非我们所选择的剧本。继续加油吧&#xff01; 目录 1.ArrayList与LinkedList区别&#xff0c; 应用场景…...

有趣的 Kotlin 0x11: joinToString,你真的了解嘛?

前言 之前使用 joinToString 函数也就是用逗号连接集合元素形成字符串&#xff0c;也没有细看它的参数&#xff0c;但是今天和 ChatGPT 聊天时&#xff0c;发现它给我输出了诸多内容。 joinToString joinToString()是Kotlin中一个非常有用的函数&#xff0c;它可以将集合的元…...

代码随想录算法训练营day46 | 动态规划之背包问题 139.单词拆分

day46139.单词拆分1.确定dp数组以及下标的含义2.确定递推公式3.dp数组如何初始化4.确定遍历顺序5.举例推导dp[i]139.单词拆分 题目链接 解题思路&#xff1a;单词就是物品&#xff0c;字符串s就是背包&#xff0c;单词能否组成字符串s&#xff0c;就是问物品能不能把背包装满。…...

DPDK中的无锁共享数据结构

目录背景解决方法共享内存无锁操作新/老共享数据结构rte_ringrefcnt延迟释放方法1&#xff1a;读的线程来释放方法2&#xff1a;释放线程等到读线程轮询一轮参考背景 dpvs多线程&#xff0c;如何做到节约内存、高性能之间的均衡。 解决方法 共享内存 多线程共享内存&#x…...

【使用两个栈实现队列】

文章目录一、栈和队列的基本特点二、基本接口函数的实现1.栈的接口2.创建队列骨架3.入队操作4.取出队列元素5.返回队首元素6.判断队列是否为空7.销毁队列总结一、栈和队列的基本特点 栈的特点是后进先出&#xff0c;而队列的特点是先进先出。 使用两个栈实现队列&#xff0c;必…...

web,h5海康视频接入监控视频流记录一

项目需求&#xff0c;web端实现海康监控视频对接接入&#xff0c;需实现实时预览&#xff0c;云台功能&#xff0c;回放功能。 web端要播放视频&#xff0c;有三种方式&#xff0c;一种是装浏览器装插件&#xff0c;一种是装客户端exe&#xff0c;还有就是无插件了。浏览器装插…...

做毕业设计,前端部分你需要掌握的6个核心技能

其实前端新手如果想要自己实现一套毕业设计项目并非简单的事&#xff0c;因为之前很多人一直还停留在知识点的阶段&#xff0c;而且管理系统和C端网站都需要开发&#xff0c;但现在需要点连成线了。所以在启动项目开发之前呢&#xff0c;针对前端部分&#xff0c;我列举一些非常…...

Read book Netty in action(Chapter VIII)--EventLoop and thread model

前言 简单地说&#xff0c;线程模型指定了操作系统、编程语言、框架或者应用程序的上下文中的线程管理的关键方面。显而易见地&#xff0c;如何以及何时创建线程将对应用程序代码的执行产生显著的影响&#xff0c;因此开发人员需要理解与不同模型相关的权衡。无论是他们自己选…...

番外11:使用ADS对射频功率放大器进行非线性测试3(使用带宽5MHz的WCDMA信号进行ACLR测试)

番外11&#xff1a;使用ADS对射频功率放大器进行非线性测试3&#xff08;使用带宽5MHz的WCDMA信号进行ACLR测试&#xff09; 其他测试&#xff1a; 番外9&#xff1a;使用ADS对射频功率放大器进行非线性测试1&#xff08;以IMD3测试为例&#xff09; 番外10&#xff1a;使用AD…...

Linux libpqxx 库安装及使用

记录一下linux安装 libpqxx遇到的一些问题 1.准备安装包&#xff1a; 1.准备安装包&#xff0c;以libpqxx-4.0.1.tar.gz为例子 链接如下&#xff1a;https://launchpad.net/libpqxx/milestone/4.0.1 2.上传并安装 上传到安装目录并安装&#xff0c;我是放到/use/local下面 c…...

如何使用COM-Hunter检测持久化COM劫持漏洞

关于COM-Hunter COM- Hunter是一款针对持久化COM劫持漏洞的安全检测工具&#xff0c;该工具基于C#语言开发&#xff0c;可以帮助广大研究人员通过持久化COM劫持技术来检测目标应用程序的安全性。 关于COM劫持 微软在Windows 3.11中引入了(Component Object Model, COM)&…...

Cartesi 举办的2023 黑客马拉松

Cartesi 是具有 Linux 运行时的特定于应用程序的Rollups执行层。Cartesi 的特定应用程序 Optimistic Rollup 框架使区块链堆栈足够强大&#xff0c;开发人员可以构建计算密集型和以前不可能的去中心化实例。Cartesi 的 RISC-V 虚拟机支持 Linux 运行时环境&#xff0c;允许像你…...

架构篇--代码质量手册

目前团队缺少SA&#xff08;研发经理&#xff09;的角色&#xff0c;大家代码写的有点随意&#xff0c;老板让我写一份开发手册。嗯&#xff01;&#xff01;&#xff01;当时我稍微纠结了一下&#xff0c;感觉这个似乎不是我的工作范畴&#xff0c;但是本着"我就是块砖&a…...

那些年用过的IDEA插件

今天和大家分享一下经常使用的IDEA的插件&#xff0c;希望有所帮助。一、IDEA插件CodeGlance2显示代码缩略图插件&#xff0c;方便查看代码。Lombok用于编译期间自动生成getter、setter、构造、toString等方法&#xff0c;简化代码。Mybatis Builder或MybatisXMapper接口和xml双…...

python+requests实现接口自动化测试

这两天一直在找直接用python做接口自动化的方法&#xff0c;在网上也搜了一些博客参考&#xff0c;今天自己动手试了一下。 一、整体结构 上图是项目的目录结构&#xff0c;下面主要介绍下每个目录的作用。 Common:公共方法:主要放置公共的操作的类&#xff0c;比如数据库sqlhe…...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank&#xff1f;由于时间太久&#xff0c;我真忘记了。搜搜发现&#xff0c;还真有人和我一样。见下面的链接&#xff1a;https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

多模态大语言模型arxiv论文略读(108)

CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题&#xff1a;CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者&#xff1a;Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文&#xff5c;DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色&#xff0c;华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型&#xff0c;能助力我们轻松驾驭 DeepSeek-V3/R1&#xff0c;本文中将分享如何…...

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲&#xff1a;队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

Spring是如何解决Bean的循环依赖:三级缓存机制

1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间‌互相持有对方引用‌,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...

AI病理诊断七剑下天山,医疗未来触手可及

一、病理诊断困局&#xff1a;刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断"&#xff0c;医生需通过显微镜观察组织切片&#xff0c;在细胞迷宫中捕捉癌变信号。某省病理质控报告显示&#xff0c;基层医院误诊率达12%-15%&#xff0c;专家会诊…...