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

进程(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调用自己的写的,或者系统提供的函数

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

华为ICT——第六章:深度学习和卷积神经网络/详篇

目录 1:深度学习卷积的重要概念: 2:CNN核心思想——局部感知: CNN核心思想——参数共享: 3:卷积层的功能: 4:不同深度的卷积层提取的特征: 5:卷积效果——…

【公益案例展】火山引擎公益电子票据服务——连接善意,共创美好

‍ 火山引擎公益案例 本项目案例由火山引擎投递并参与数据猿与上海大数据联盟联合推出的 #榜样的力量# 《2023中国数据智能产业最具社会责任感企业》榜单/奖项”评选。 大数据产业创新服务媒体 ——聚焦数据 改变商业 捐赠票据是慈善组织接受捐赠后给捐赠方开具的重要凭证&…

saleae逻辑分析仪在win10上的安装: 驱动安装失败的解决办法

1. 安装 安装64位的:Logic Setup 1.1.16 (64-bit).exe 选择安装目录: 安装其间,如果弹出驱动安装对话框,要选择信任并安装驱动。 安装结束,打开软件,是未连接的状态。 此时打开电脑的设备管理器&#xff…

程序员男盆友给自己做了一款增进感情的小程序

前言 又是无聊的一天,逛GitHub的时候发现一个给女朋友做了一个互动微信小程序,据说女朋友更爱自己了,所以当晚。。。。给自己做了丰盛的晚餐,我当即点开立马开发粘贴复制起来,想到做的小程序可以和未来的女朋友增进感…

基于React开发的chatgpt网页版(仿chatgpt)

在浏览github的时候发现了一个好玩的项目本项目,是github大神Yidadaa开发的chatgpt网页版,该开源项目是跨平台的,Web / PWA / Linux / Win / MacOS都可以访问。非常有意思,本人就部署了一套,喜欢的同学可以体验一番。 …

快速教程|如何在 AWS EC2上使用 Walrus 部署 GitLab

Walrus 是一款基于平台工程理念的开源应用管理平台,致力于解决应用交付领域的深切痛点。借助 Walrus 将云原生的能力和最佳实践扩展到非容器化环境,并支持任意应用形态统一编排部署,降低使用基础设施的复杂度,为研发和运维团队提供…

干货 | 接口自动化测试分层设计与实践总结

接口测试三要素: 参数构造 发起请求,获取响应 校验结果 一、原始状态 当我们的用例没有进行分层设计的时候,只能算是一个“苗条式”的脚本。以一个后台创建商品活动的场景为例,大概流程是这样的(默认已经是登录状态下)&#…

FMCW雷达论文速览 | TRS 2023, 基于FMCW雷达的多天线高精度测距算法及性能分析

注1:本文系“最新论文速览”系列之一,致力于简洁清晰地介绍、解读最新的顶会/顶刊论文 TRS 2023 | High Accuracy Multi-antenna Ranging Algorithm and Performance Analysis for FMCW Radar 论文原文:https://ieeexplore.ieee.org/document/10309162 Z. Xu, S. Qi and P. Zh…

webgoat-(A1)SQL Injection

SQL Injection (intro) SQL 命令主要分为三类: 数据操作语言 (DML)DML 语句可用于请求记录 (SELECT)、添加记录 (INSERT)、删除记录 (DELETE) 和修改现有记录 &#xff…

springboot本地启动多个模块报错:Address already in use: JVM_Bind

目录 背景解决方法 背景 环境: jdk1.8 idea 2019.2.4idea本地启动多个模块联调时,提示报错: 错误: 代理抛出异常错误: java.rmi.server.ExportException: Port already in use: 9090; nested exception is: java.net.BindException: Addre…

SpringBoot系列之集成Redission入门与实践教程

Redisson是一款基于java开发的开源项目,提供了很多企业级实践,比如分布式锁、消息队列、异步执行等功能。本文基于Springboot2版本集成redisson-spring-boot-starter实现redisson的基本应用 软件环境: JDK 1.8 SpringBoot 2.2.1 Maven 3.2…

【算法-链表2】反转链表 和 两两交换链表节点

今天,带来链表相关算法的讲解。文中不足错漏之处望请斧正! 理论基础点这里 反转链表 1. 思路 链表操作的本质是修改连接关系,本题我们需要反转链表,也就是每次都让当前节点的next指向自己的上一个。而题目给的是单链表&#xf…

【React-Native开发3D应用】React Native加载GLB格式3D模型并打包至Android手机端

【React-Native开发3D应用】React Native加载GLB格式3D模型并打包至Android手机端 【加载3D模型】**React Native上如何加载glb格式的模型**第零步,选择相关模型第一步,导入相关模型加载库第二步,自定义GLB模型加载钩子第三步,借助…

Modbus通讯模拟仿真环境的搭建

文章目录 一、概要二、所需工具介绍三、搭建虚拟仿真环境1.Modbus RTU虚拟仿真环境搭建1.1.虚拟串口工具(VSPD)使用1.2.虚拟从站工具(ModSim32)使用1.3.虚拟主站工具(Modscan32)使用1.4.更改虚拟从站工具&a…

【算法】第二代遗传算法NSGA-II优化SVR超参数模型

NSGA-II介绍 NSGA-II(Non-dominated Sorting Genetic Algorithm II)是一种多目标优化算法,用于解决具有多个冲突目标的优化问题。它通过模拟进化过程中的自然选择和遗传操作,逐步改进种群中的解,以找到一组尽可能好的解…

Halcon的 Filter (过滤)目录之add_Image算子

Halcon两个图像相加可以应用在图像融合的场景中。通过将两幅图像的亮度信息相加,可以生成一幅新的图像,使得图像的细节更加清晰,提高目标检测和识别的准确率。例如,在红外图像和可见光图像融合中,加法运算可以将两幅图…

Linux程序设计shell程序学习

目录 1、编写shell脚本,通过循环的形式在终端上打印出等腰梯形 2、编写一个bash脚本程序,用for循环实现将当前目录下的所有.c文件移到指定的目录下,最后在显示器上显示指定目录下的文件和目录。 3、自行编写 shell 脚本,实现从…

【JAVA学习笔记】66 - 本章作业(IO流)

项目代码 https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter19/src/com/yinhai/homework 1.使用File类和FileWriter类 (1)在判断e盘下是否有文件夹mytemp,如果没有就创建mytemp public class Homework01 {public static void main(String…

小程序游戏对接广告收益微信小游戏抖音游戏软件

小程序游戏对接广告是一种常见的游戏开发模式,开发者可以通过在游戏中嵌入广告来获取收益。以下是一些与小程序游戏对接广告收益相关的关键信息: 小程序游戏广告平台选择: 选择适合你的小程序游戏的广告平台非常重要。不同的平台提供不同类型…

塔望食研院|骆驼奶市场规模庞大,百亿体量,品牌升级!

自2022年12月塔望咨询开设塔望食品大健康行业与消费研究院(简称塔望食研院)栏目以来,塔望食研院以“为食品行业品牌高质量发展赋能”为理念,不断发布食品大健康行业研究、消费研究报告。塔望食研院致力于结合消费调研数据、企业数…