深入篇【Linux】学习必备:进程环境变量/进程切换

深入篇【Linux】学习必备:进程环境变量/进程切换

  • Ⅰ.环境变量
  • Ⅱ.深层意义
  • Ⅲ.全局属性
  • Ⅳ.进程切换

Ⅰ.环境变量

1.环境变量是什么?:环境变量是系统提供的一组name/value形式的变量,不同的环境变量有不同的用户。
一般是用来指定操作系统运行环境的一些参数。
2.比如我们在写C/C++时,在链接时,我们并不知道所链接的动静态库在哪里,但是照样可以链接成功。这就是由于相关环境变量帮助编译器进行查找。
3.环境变量是具有全局属性的。

常见的环境变量有PATH,HOME,SHELL等。

PATH:linux下系统的指令的默认搜索路径
HOME:记录当前用户的家目录
USER:记录当前用户是谁。

通过学习环境变量,我们可以解决下面这个问题:
【问题】为什么系统的指令,可以直接执行呢?而我们写的程序,需要加上当前程序的路径才可以执行呢?
因为已经将系统的指令的所有路径都添加到环境变量PATH里了,而程序执行会默认到默认路径里先查找一遍。找到了就直接执行,找不到就报错。

如何获取到环境变量,或者修改环境变量呢?

1.env:显示所有环境变量
2.echo:用来显示某个环境变量值
3.export:用来创建一个环境变量。
4.set:显示本地顶部关于的shell变量和环境变量。

Ⅱ.深层意义

每一个程序其实都需要环境变量,那么环境变量在哪存着呢?
环境变量存储在一张表里,叫环境表,环境表是一个指针数组,数组里的每个指针指向一个环境变量。

在这里插入图片描述

其实我们的main函数是具有参数的,那么这些参数代表着什么意思呢?

#include <stdio.h>
int main(int argc, char *argv[], char *env[])
{int i = 0;for(; env[i]; i++){printf("%s\n", env[i]);}return 0;
}

首先我们可以想一想这个问题:
【问题】指令为什么后面可以加上选项呢?
我们的main函数其实一旦执行就是一个程序了。所以main函数也就对应一个程序进程。而平常的指令我们说也是一个进程,也就是说指令的实现从底层来说也是用main函数实现的。
而正常我们的main函数是不用带参数也可以执行,那么后面的参数代表着什么意思呢?
由指令后面可以带选项我们可以推断出,main函数后面的参数就是用来命令选项的。
1.其中第一个参数argc 是命令的名称。
2.第二个参数char* argv[]是命令的参数。
3.第三个参数char* env[]就是进程的环境变量了。

其实我们写的程序都是子进程,bash才是父进程。而我们在输入指令时,bash会将命令行分散成一个个字符,会将这个字符给指针数组初始化。这样就可以给指令,工具软件等提供命令行选项支持。

而我们写的程序在执行之前,bash也会给main函数里的指针数组初始化。其实main也是一个函数,它也被调用的,至于是谁调用的,这个我们可以认为是操作系统调用的,当调用main函数时,会将自己的环境变量,命令参数什么的给main函数进行初始化。
所以一个程序必须要有两个核心向量表:

1.命令行参数表
2.环境变量表。

我们运行的程序都是子进程,bash才是父进程,bash本身在启动时会从操作系统的配置文件中读取环境变量信息,子进程会继承父进程的环境变量。
这两张表是由操作系统维护的,在程序启动时是操作系统自动初始化的,

所以我们要理解:main函数也是一个被调用的函数,操作系统会将两个表传给main函数的参数进行初始化。

我们可以通过系统调用来获取到环境变量:getenv获取指定的变量。

Ⅲ.全局属性

为什么说环境变量具有全局属性呢?
因为环境变量是可以被子进程继承下去的。父进程的环境变量可以直接拷贝一份给子进程,也就是子进程继承了父进程的环境变量。所以对应环境变量来说,通常是要具有全局属性。而对于一些普通变量是可以不需要有全局属性的。

Ⅳ.进程切换

我们要知道操作系统里有很多进程,而CPU只有一个,这就说明多个进程使用一个CPU。那这个是如何实现的呢?
这个操作需要两大核心:

1.进程切换
2.时间片

也就是操作系统采用基于进程切换基于时间片轮转的调度算法来使用CPU。
在理解进程切换之前,我们需要理解以下问题:
【问题1】函数的返回值是如何在外部拿到的呢?

函数的返回值通常是局部变量,函数销毁就没有了,操作系统通常会将这个返回值放入一个CPU寄存器中存着。

【问题2】系统是如何得知我们进程当前执行到哪一行代码呢?

进程中有一个叫程序计数器pc,可以记录当前进程正在执行指令的下一行指令的地址。

【问题3】CPU中存在很多寄存器,这些寄存器扮演着说明角色呢?

1.可以提高效率。
①将进程高频数据放入寄存器中。
②CPU寄存器中保存的是进程相关的数据,这样进程就可以随时随地被CPU快速访问修改了。
2.所以CPU寄存器里保存的是进程的临时数据。而这些临时数据被称为当前进程运行时的上下文。

当时间片结束时,进程从CPU上离开时,要将直接的上下文数据保存好甚至带走(为什么呢?因为该进程可能还没有执行完整,因为时间片的原因而结束,等下次再到这个进程运行时就要从刚刚结束的地方开始运行)而保存数据的目的就是为了下次进程回来切换时,进程原来的数据可以恢复。

所以进程在切换时有两大核心:

一是保存当前进程的上下文,保存在进程的PCB中。
二是恢复将要切换的进程的数据,从进程的PCB中获取。

并发的本质就是很多进程在CPU上以时间片的方式进行来回切换,人整段代码在一定时间内,都得以推进,切换的速度很快CPU执行也很快,时间片一到,首先将当前进程的上下文保存,然后让该进程去等待队列里排队,等将活跃队列运行完,再将轮转队列放上来,这样CPU就可以周而复始的轮转调度了。

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

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

相关文章

YOLOV8目标检测——最全最完整模型训练过程记录

文章目录 前言1 下载yolov8&#xff08;[网址](https://github.com/ultralytics/ultralytics)&#xff09;2 配置conda环境3 用pycharm打开文件3 训练自己的YOLOV8数据集4 run下运行完了之后没有best.pt文件5 导出为onnx文件6 yolov8应用完整案例&#xff08;免费且包含源代码、…

springboot 程序设计优雅退出

一 springboot优雅退出 1.1 概述 在springboot2.3版本后&#xff0c;实现了优雅退出功能。当server.shutdowngraceful启用时&#xff0c;在 web 容器关闭时&#xff0c;web 服务器将不再接收新请求&#xff0c;并将剩余活动执行完成给设置一个缓冲期。缓冲期 timeout-per-shu…

基础MySQL的语法练习

基础MySQL的语法练习 create table DEPT(DEPTNO int(2) not null,DNAME VARCHAR(14),LOC VARCHAR(13) );alter table DEPTadd constraint PK_DEPT primary key (DEPTNO);create table EMP (EMPNO int(4) primary key,ENAME VARCHAR(10),JOB VARCHAR(9),MGR …

100 # mongoose 的使用

mongoose elegant mongodb object modeling for node.js https://mongoosejs.com/ 安装 mongoose npm i mongoose基本示例 const mongoose require("mongoose");// 1、连接 mongodb let conn mongoose.createConnection("mongodb://kaimo313:kaimo313loc…

城市正视图(Urban Elevations, ACM/ICPC World Finals 1992, UVa221)rust解法

如图5-4所示&#xff0c;有n&#xff08;n≤100&#xff09;个建筑物。左侧是俯视图&#xff08;左上角为建筑物编号&#xff0c;右下角为高度&#xff09;&#xff0c;右侧是从南向北看的正视图。 输入每个建筑物左下角坐标&#xff08;即x、y坐标的最小值&#xff09;、宽度…

Linux基础命令1——Linux的命令格式与命令分类

目录 Linux命令格式 Linux命令分类 如何判断命令的类型——Type命令 内置命令 外部命令 alias命令 命令的执行效率与过程 Linux命令格式 命令格式 完整的命令格式分为三部分&#xff1a;命令、参数、对象 其中命令与参数、参数与参数、参数与对象之间最少要有一个空格做…

有哪些比较好用的协同办公软件

在疫情期间&#xff0c;协同办公大放异彩&#xff0c;解决了很多公司线上办公的问题&#xff0c;所以在后疫情时代&#xff0c;协同办公软件成为了提高工作效率和团队协作的重要工具。 随着科技的不断进步&#xff0c;越来越多的协同办公软件涌现出来。在本文中&#xff0c;我们…

NFTScan | 10.16~10.22 NFT 市场热点汇总

欢迎来到由 NFT 基础设施 NFTScan 出品的 NFT 生态热点事件每周汇总。 周期&#xff1a;2023.10.16~ 2023.10.22 NFT Hot News 01/y00ts&#xff1a;迁移回以太坊的跨链桥已上线&#xff0c;将承担第一天所有 Gas 费 10 月 16 日&#xff0c;y00ts 发推称&#xff0c;将 y00…

k8s-----10、Controller-Deployment

Controller-Deployment 1、什么是controller2、 pod和controller关系3、Deployment控制器应用场景3.1 部署时yaml文件书写3.2 实际部署应用3.3 升级回滚3.3.1 升级3.3.2 回滚 3.4 弹性伸缩 1、什么是controller 在集群上管理和运行容器的对象 2、 pod和controller关系 pod是…

黑豹程序员-架构师学习路线图-百科:SpringBoot

文章目录 1、什么是SpringBoot&#xff1f;2、SpringBoot发展史3、为什么我们要使用SpringBoot 1、什么是SpringBoot&#xff1f; Spring Boot是一个用于创建独立的、基于Spring框架的Java应用程序的开源框架。 Spring Boot简化了Spring应用程序的开发和部署&#xff0c;使开发…

gulp打包vue3+jsx+less插件

最终转换结果如下 在根目录下添加gulpfile.js文件&#xff0c;package.json添加命令npm run gulp var gulp require(gulp) var babel require(gulp-babel) var less require(gulp-less) var del require(del); var spawn require(child_process).spawn;const outDir &…

VS Code C# 开发工具包正式发布

前言 微软于本月正式发布Visual Studio Code C#开发工具包&#xff0c;此前该开发套件已经以预览版的形式在6月份问世。经过4个月的测试和调整&#xff0c;微软修复了350多个问题&#xff0c;其中大部分是用户反馈导致的问题。此外&#xff0c;微软还对产品进行了300多项有针对…