进程(3)——进程优先级与环境变量【Linux】

news2024/10/6 8:34:09

进程(3)——进程优先级与环境变量【Linux】

  • 一. 进程如何在cpu中如何执行
    • 1.1进程在CPU中的特性
    • 1.2 寄存器
      • 1.2.1 进程的上下文
  • 二. 进程优先级
    • 2.1 如何查看进程优先级
    • 2.2 修改进程的优先级
      • 2.2.1 NI值
      • 2.2.2 修改方法
  • 三. 环境变量
    • 3.1 什么是环境变量:
    • 3.2 PATH环境变量(随便挑个来认识)
      • 3.2.1 功能认识
    • 3.3 环境变量的操作:
      • 3.3.1 查看环境变量
        • i. 命令行查看环境变量
        • ii. 程序中得到环境变量
      • 3.3.2 添加环境变量
        • i. 添加全新环境变量
        • ii. 在老环境变量上进行添加
          • 覆盖:
          • 添加:
      • 3.3.2 删除环境变量
  • 四.命令行参数
      • 4.1 main函数的env参数
  • 五. 本地变量
    • 5.2添加本地变量
    • 5.1 查看本地变量
    • 5.3取消本地变量
    • 六. bash中的两种命令:
      • 6.1 常规命令
      • 6.2 内建命令

一. 进程如何在cpu中如何执行

之前我们提到了什么是进程,还有进程的状态。
我们知道了进程的数据存储在内存中,但是我们还不知道CPU是如何执行进程的。

有些人就知道了,cpu执行进程,不就是读取代码吗,确实是这样。

所以我们这里要讲的是一些关于cpu与进程的一些细节。

1.1进程在CPU中的特性

进程在CPU中运行时有以下性质:

竞争性:系统进程数目众多,而CPU的资源只有少量,所以进程之间是要进行竞争的,这就有了下面要讲的优先级

独立性:多进程运行时,互不干扰
并行:多个进程在CPU下分别同时运行叫做并行
并发:通俗点讲,就是cpu采用进程切换的方式来使多个进程同时推进

因为进程切换的速度实在是太快了,测试进程切换的速度都是要用仪器专门去测试的。
所以用进程切换的方式来达成实现给人感觉多个进程多个进行的感觉也是很容易的

而进程切换如此快就不得不提到寄存器了。

1.2 寄存器

寄存器可以说是一个在CPU中的非常小的高速存储器

还记得以前以前在函数栈帧中的一个现象。

为什么函数返回值会被外部拿到
我们用return,来返回值,return后,函数销毁,将返回值返回给调用函数的上级函数。
return a->mov eax10 会放到cpu的寄存器内
至于存在哪个寄存器取决于编译器

这里补充下
返回对象时,会调用对象的赋值重载或者构造函数
而不是将整个对象返进行返回,因为当对象太大,而寄存器太小

所以这里回忆了一下寄存器后,我们通俗的讲寄存器的作用是:
寄存器是将对应的进程高频数据放入寄存器中,提高效率。

1.2.1 进程的上下文

而寄存器中存储的进程的高频临时数据,被称为进程的上下文。

当进程运行时:
寄存器中保存了许多进程的上下文。

当进程要进行切换时:
进程在从cpu上离开的时候,要将上下文数据保存好带走

而保存的目的都是为了未来恢复

所以在进程被切换的时候,寄存器要进行两个步骤:
1.保存当前进程的上下文
2.回复之前进程上下文

所以能实现进程的快速切换,寄存器可以说是功不可没

二. 进程优先级

这里我们上面提到过:CPU资源有限,进程是多个,所以进程之间是竞争关系。

而如果一个进程长时间得不到cpu资源
该进程的代码长时间无法得到推进的问题就是:进程的饥饿问题

2.1 如何查看进程优先级

我们要了解进程的优先级,首先要会查看进程的优先级

用这个指令就可以查看带有优先级的属性

ps -al

在这里插入图片描述

这里的PRI就是priority
进程的优先级

在这里插入图片描述
这里随便用一个一直持续的代码进行查看一下
在这里插入图片描述
这里我们来查看一下这个进程的优先级

ps -al | head -1 && ps -al | grep 5623

在这里插入图片描述
这里我们能发现他的PRI是80

2.2 修改进程的优先级

这里我们知道了如何查看进程的优先级后

我们应该知道如何修改进程的优先级

提到修改进程的优先级,就不得不提NI值(nice)

2.2.1 NI值

在这里插入图片描述
在上面这个优先级的图中,我们能发现PRI旁边就有NI值

为啥修改进程的优先级需要提到NI值

因为进程的优先度的修改是:
pri(new)=pri(old)+ni(nice)

所以可以说:
ni值是用来专门改变优先度值

而系统为了防止用户乱调,所以ni有限度【-20,19】
所以一个优先级是80的进程:调整范围是【60~99】

2.2.2 修改方法

改变进程优先级:
1.输入top
在这里插入图片描述
2.按下小写r
在这里插入图片描述

3.输入进程pid
在这里插入图片描述
4.输入想要改变到的优先度值

在这里插入图片描述

这里我们再查看一下PRI
在这里插入图片描述

这里我们能发现PRI变成了99
正好符合我们上面的通过NI的范围,得到的优先级范围。

三. 环境变量

我们在windows系统中,也见过很多环境变量

配置java或各类语言的环境变量中,也需要配置环境变量

但什么是环境变量:

3.1 什么是环境变量:

环境变量是一般是指:在操作系统中为了指定操作系统运行的一些参数。

环境变量提供的一组name=value形式的变量

不同的用户有不同的环境变量(这个是指不同用户的有的环境变量的值不同)

通常具有全局属性
这是因为:
我们运行的进程都是子进程,bash本身在启动的时候,会从操作系统的配置文件中读取环境变量信息
所以环境变量信息通常是全局的,子进程会继承父进程的环境变量

但是子进程改变环境变量的时候不会改变父进程的环境变量

3.2 PATH环境变量(随便挑个来认识)

3.2.1 功能认识

比如在Linux中,我们输入指令,操作系统可以直接执行指令

这个时候就用到了我们的PATH环境变量
PATH环境变量就是:Linux中的指令搜索路径

我们讲过指令的本质就是文件。

但是操作系统可以找到我们输入的指令的对应文件。

在这里插入图片描述
这里我们能用which搜索pwd位置。

然后我们打印一下PATH环境
在这里插入图片描述
能发现PATH中有pwd所在的路径:
/usr/bin

3.3 环境变量的操作:

想到环境变量的操作无非就三个:
添加和查看还有删除

3.3.1 查看环境变量

这里的查看环境变量也有两种方法:

i. 命令行查看环境变量

查看所有环境变量的:

env

直接在命令行输入即可
在这里插入图片描述
这里能看到弹出了所有的环境变量。

查看指定环境变量:

echo $环境名

在这里插入图片描述

ii. 程序中得到环境变量

我们知道操作系统内核使用C语言写的
所以C语言也肯定有显示环境变量的接口:

C语言中包含头文件stdlib.h
getenv()函数

在这里插入图片描述
这里用getenc接口,直接查找到了PATH环境变量的

在这里插入图片描述

3.3.2 添加环境变量

知道如何查看环境变量后,紧接着就是添加环境变量了

这里添加环境变量也有两种方式:

i. 添加全新环境变量

添加全新的环境变量,就是自己命名自己定义自己添加的环境变量

export 变量名=对应值

这里我们进行添加了一个TEST进行测试

这里我们再用env进行查看,能看到环境变量被添加上去了。

在这里插入图片描述

ii. 在老环境变量上进行添加
覆盖:

平常的环境变量都是NAME=NUM

一般环境变量直接等于一个值的,要修改的话一般都是直接覆盖。

直接

变量名=

直接修改即可

添加:

我们之前在上面见过,PATH环境变量存储着的是大量的指令搜索路径:

所以相比于进行覆盖,更需要的是在原路径的基础上进行添加新路径

PATH=$PATH:/自己文件路径

这里的$PATH代表的意思就是原PATH的路径
在这里插入图片描述

在这里插入图片描述
这里能发现path中新添加了我们的文件路径

但这里我们要注意,我们添加的所有的环境变量都是内存级的环境变量。
我们把shell重新启动后,环境变量就会消失。

3.3.2 删除环境变量

这里我们先随便添加一个环境变量

在这里插入图片描述

unset 变量名

即可删除变量
在这里插入图片描述

四.命令行参数

平常在一些书中可能会见过main函数可以传这种形式的参数:

int main(int argc,char* argv[])
{}

我们平常在编译器中写代码可能并不能见到。

但是我们开始在Linux中用命令行进行编写时,就可以好好来了解一下了。

这里我们先随便使用一下:
在这里插入图片描述
argv是一个指针数组其中存储了各个字符串。

那让我们遍历一下,打印argv中各个元素,进行查看。

在这里插入图片描述

发现这里argv存储的是命令行参数的分段。

这里就能来解释一下这个命令行参数的形式了

在我们平常在命令行输入参数时

./parm_test -a -b -c

在编译器眼中,你就是输入了一大段字符串
"./parm_test -a -b -c"

之后编译器会将参数进行分组(存进argv中):

在这里插入图片描述

argv是指针数组,将各个字符串进行存储。

这里我们能看到后面的元素是空
所以我们遍历的方式还可以优化一下:

for(;argv[i];i++)

因为遇到NULL的时候,就相当于整数0,自动会停止。

4.1 main函数的env参数

在这里插入图片描述
这里如图里面说的 argv,env 都叫做核心向量表。

我们平常在一些教材里面,可能前两个比较常见,但是第三个确实是比较少见。

我们能看到这个env不就是我们前面的环境变量吗

但是这个env是指针数组的属性。
所以这里能看出,其实环境变量也是大段的字符串

所以之前env看到的环境变量实际上都是字符串

五. 本地变量

上面提了环境变量

这里就提一下本地变量

上面我们提过
环境变量有一个非常重要的特征:全局性

因为子进程会对父进程进行继承。

但是这里我们要提的本地变量则是不会进行继承的效果。

5.2添加本地变量

这里直接添加一个本地变量看看:

变量名=变量值

这个和环境变量的区别就是多加了一个export

在这里插入图片描述
这里我们添加上了一个变量

5.1 查看本地变量

添加上后,就要了解如何进行查看
当然不可能用env进行查看。

因为env是用来查看环境变量
环境变量需要被子进程继承的,而本地变量不被继承
所以不会放在环境变量中。

这里要查看环境变量就要用

set

在这里插入图片描述

这里能看到这个set不光有本地变量还有环境变量。

这里我们用grep进行查找我们添加的环境变量。
在这里插入图片描述

5.3取消本地变量

这里我们找到添加的本地变量后。

就可以进行取消环境变量了

unset 变量名

这个还是和环境变量一样的删除方法

在这里插入图片描述
这里能发现删除成功了

六. bash中的两种命令:

这里为什么突然扯出bash行的命令:

因为:
在这里插入图片描述
这里我们直接能用echo来打印出本地变量。

我们之前明明提过,本地变量无法被子进程继承。

按道理来说,echo是一个指令,指令本质就是文件,而文件运行就是一个进程,bash创建进程运行时,需要创建echo的这个子进程。

所以按道理echo无法使用bash父进程的这个本地变量。

这里就要纠正一个误区了:
命令行启动的指令不一定要创建子进程。

这里就要将命令分成两类了。

6.1 常规命令

一种是:有些命令操作系统无法直接执行,需要调用文件,所以需要创建子进程
将功能交给子进程自己去执行。

这就叫做:常规命令——通过创建子进程完成的。

6.2 内建命令

还有一种是:系统执行起来特别有把握,可以说是拿手老活
这种就叫:内建命令——bash不创建子进程,而是自己亲自执行类似bash调用自己的写的,或者系统提供的函数

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

二十、泛型(4)

本章概要 补偿擦除 创建类型的实例泛型数组 补偿擦除 因为擦除&#xff0c;我们将失去执行泛型代码中某些操作的能力。无法在运行时知道确切类型&#xff1a; //无法编译 public class Erased<T> {private final int SIZE 100;public void f(Object arg) {// error…

手机玻璃盖板为什么需要透光率检测

手机盖板&#xff0c;也称为手机壳或保护套&#xff0c;是一种用于保护手机外观和延长使用寿命的装置。它们通常由塑料、硅胶、玻璃或金属等材料制成&#xff0c;并固定在手机外壳上,其中任何一个工序出现差错&#xff0c;都有可能导致手机盖板产生缺陷&#xff0c;例如漏油、透…

维控PLC——LX1S :编程口通讯协议

文章目录 说明通讯帧通讯命令字通讯数据地址维控 LX1S通讯协议举例 说明 该协议适用于维控LX1S系列PLC&#xff0c;关于维控LX2N的协议将在后面描述。 通讯帧 通讯采用ASCII码&#xff0c;校验方式采用和校验。 请求帧格式:报文开始命令字地址&#xff08;有些无&#xff09…

热门的免费报表软件,建议收藏!

目前&#xff0c;随着企业对数据越来越重视&#xff0c;报表软件的应用越来越广泛。企业报表的需求越来越多变&#xff0c;就需要好用的免费报表软件&#xff0c;报表软件必须具备简捷、专业、灵活的特点&#xff0c;这里就给大家测评几款免费报表软件&#xff0c;供大家做参考…

机器学习模板代码(期末考试复习)自用存档

机器学习复习代码 利用sklearn实现knn import numpy as np import pandas as pd from sklearn.neighbors import KNeighborsClassifier from sklearn.model_selection import GridSearchCVdef model_selection(x_train, y_train):## 第一个是网格搜索## p是选择查找方式:1是欧…

JVM之jps虚拟机进程状态工具

jps虚拟机进程状态工具 1、jps jps&#xff1a;(JVM Process Status Tool)&#xff0c;虚拟机进程状态工具&#xff0c;可以列出正在运行的虚拟机进程&#xff0c;并显示虚拟机执 行主类&#xff08;Main Class&#xff0c;main()函数所在的类&#xff09;的名称&#xff0c…

公司来了个00后,起薪就是18K,不愧是卷王。。。

前言 都在传00后躺平、整顿职场&#xff0c;但该说不说&#xff0c;是真的卷&#xff0c;感觉我都要被卷废了... 前段时间&#xff0c;公司招了一个年轻人&#xff0c;其中有一个是00后&#xff0c;工作才一年多&#xff0c;直接跳槽到我们公司&#xff0c;薪资据说有18K&…

Java自学第6课:电商项目(1)

从本课开始&#xff0c;我们跟着项目一起来敲代码。通过项目来学习Java和Java web 1 开始 首先了解要做什么项目&#xff0c;这里选择B2C电商。 需求分析很重要&#xff0c;所以要了解甲方业务流程。 之后配置开发环境&#xff0c;选择开发工具。 然后就是搭建开发环境&…

【16】c++11新特性 —>弱引用智能指针weak_ptr(1)

定义 std::weak_ptr&#xff1a;弱引用的智能指针&#xff0c;它不共享指针&#xff0c;不能操作资源&#xff0c;是用来监视 shared_ptr 中管理的资源是否存在。 use_count #include <iostream> #include <memory> using namespace std;int main() {shared_ptr…

最终前端后端小程序还有nginx配置

前端 前端 build 代码及其 放置位置 后端 nginx.conf 配置 user root;worker_processes auto; error_log /var/log/nginx/error.log notice; pid /var/run/nginx.pid;events {worker_connections 1024; }http {include /etc/nginx/mime.types;default_type a…

SysML理论知识

概述 由来 长期以来系统工程师使用的建模语言、工具和技术种类很多&#xff0c;如行为图、IDEF0、N2图等&#xff0c;这些建模方法使用的符号和语义不同&#xff0c;彼此之间不能互操作和重用。系统工程正是由于缺乏一种强壮的标准的建模语言&#xff0c;从而限制系统工程师和…

电商API接口多平台全面分类|接入方式|提供测试

l 角色分类 对应角色主要包括&#xff1a; 依次表示公开查询应用、买家应用、卖家应用、商家应用、高级应用、专业应用被授权访问API的角色级别。其中公开查询应用为最低权限集合级别、专业 应用为最高权限集合级别。查、买、卖接口无需审批&#xff0c;仅受默认流量规则限制…

Windows上免费可用的 7 款外置硬盘数据恢复软件

这篇文章全面测试和比较了不同的外部硬盘恢复软件&#xff0c;并选出了其中最好的七个。您将看到有关 7 种数据恢复软件的详细报告&#xff0c;包括价格、支持的平台、目标用户、优缺点、易用性、恢复性能、扫描方法、扫描速度以及许多其他会影响用户体验的标准。第一个软件是最…

α-SRHLA

作者未提供代码

uniapp中picker 获取时间组件如何把年月日改成年月日默认时分秒为00:00:00

如图所示&#xff0c;uniapp中picker组件的日期格式为&#xff1a; 但后端要 2023-11-08 00:00:00格式 如何从2023-11-08转化为 2023-11-08 00:00:00&#xff1a;&#x1f447; const date new Date(e.detail.value);//"2023-11-17" date.setHours(0, 0, 0); // 2…

一文1700字使用Postman搞定各种接口token实战(建议收藏)

现在许多项目都使用jwt来实现用户登录和数据权限&#xff0c;校验过用户的用户名和密码后&#xff0c;会向用户响应一段经过加密的token&#xff0c;在这段token中可能储存了数据权限等&#xff0c;在后期的访问中&#xff0c;需要携带这段token&#xff0c;后台解析这段token才…

微服务中配置文件(YAML文件)和项目依赖(POM文件)的区别与联系

实际上涉及到了微服务架构中的两个重要概念&#xff1a;服务间通信和项目依赖管理。在微服务架构中&#xff0c;一个项目可以通过两种方式与另一个项目建立依赖关系&#xff1a;通过配置文件&#xff08;如YAML文件&#xff09;和通过项目依赖&#xff08;如POM文件&#xff09…

学完这套jmeter结果数据写入到指定文件,涨薪3k没问题

背景&#xff1a; 在日常的功能测试或者性能测试的时候&#xff0c;需要把结果中指定的数据保存到指定的文件&#xff0c;进行使用&#xff0c;发现 jmeter 自带的文件写入&#xff0c;没有自己需要的&#xff0c;默认只支持 XML 的结果保存&#xff0c;那么接下来我们围绕 bea…

【吞噬星空】地球怪兽沦为濒危物种,罗峰出发虬龙星,新剧情开始

Hello,小伙伴们&#xff0c;我是小郑继续为大家深度解析国漫资讯。 深度爆料&#xff0c;《吞噬星空》国漫第92话最新剧情解析&#xff0c;在银河系的边际&#xff0c;一艘宇宙飞船悄然启程&#xff0c;目的地是远离家乡的虬龙星。罗峰&#xff0c;这位年轻的旅者&#xff0c;…

【算法-链表1】移除链表元素 和 设计链表

今天&#xff0c;带来链表相关算法的讲解。文中不足错漏之处望请斧正&#xff01; 理论基础点这里 移除链表元素 1. 思路 链表的删除和插入&#xff0c;都是改变链接关系。 如图&#xff1a;要删除值为2的结点&#xff0c;要找到其上一个节点&#xff0c;让上一个节点指向值…