【Linux】进程切换环境变量

目录

一.进程切换

1.进程特性

2.进程切换

 1.进程切换的现象

2.如何实现

 3.现实例子

2.环境变量

一.基本概念

二.常见环境变量

三.查询常见环境变量的方法

四.和环境变量相关的命令 

 五.环境变量表的组织方式

六.使用系统调用接口方式查询环境变量

1.getenv

 

 2.反思

七.通过代码的方式获取环境变量

 1.通过命令行参数

2.通过getenv函数

3.通过第三变量environ获取

八.环境变量通常具有全局属性

总结


 

进程属于Linux操作系统非常重要的一部分,建议大家在熟练掌握Linux进程相关概念的基础上,再观看本篇博客 

一.进程切换

1.进程特性

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

2.进程切换

 1.进程切换的现象

大家在使用电脑时,可能会几个软件同时运行。日常使用的电脑大部分都是单核的,即同一时间仅执行一个进程。那为什么在电脑上可以同时打开多个软件呢?这就跟进程切换有关了。

2.如何实现

(1) 一个CPU里面存在一套硬件寄存器,寄存器分为用户可见的寄存器,用户不可见的寄存器。

(2) 计算机调度某个进程时,CPU 会把这个进程的 PCB 地址加载到某个寄存器,也就是说,CPU内有寄存器可以只找到进程的PCB地址。

(3) CPU里有一个 eip 寄存器(PC指针),指向当前执行指令的下一条指令的地址。

(4) 当进程在运行的时候,一定会产生非常多的临时数据,这些临时数据只属于当前进程,虽然CPU内部只有一套寄存器硬件,但是寄存器里面保存的数据是属于当前进程的,寄存器硬件和寄存器内的数据是两码事。

(5) 进程在调度的时候占有CPU,但是却不是一直占有到进程结束,进程都有自己的时间片!因为时间片的存在,进程会出现没有被执行完就被拿下去的情况。

(6) 在进程重新被CPU调度的时候,CPU必须知道上一次这个进程运行到哪,当进程被换下去的时候,进程的运行信息会被存在操作系统里面,以便下次CPU重新调度时进程能够正常运行,这叫做进程的上下文保护。当进程被CPU重新调度上来时,首先要做的第一件事情就是读取操作系统中进程运行的相关数据,这叫做进程的上下文恢复。

 3.现实例子

有一名同学大一下学期,相应国家号召,决定去当兵。然后他找到自己的辅导员老师,和老师讲了自己的决定,然后老师就找到了他的关于他的档案和学期末的考试情况,然后打印成了两份,一份留到学校,另一份然这位同学拿走。等到当兵结束后,这位同学拿着自己的档案回到了学校,学校通过比对是这两份档案,证实这位同学就是这些学校的学生,然后这位同学回到校园,继续他的大学生活。

这位同学当兵走的时候,拿走的档案就是自己的属性等信息。拿走食材为了能够更好的回来。学校就相当于CPU,档案就相当于寄存器内的数据。

2.环境变量

一.基本概念

1.环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数。如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们所连接的动静态链接库的位置在哪,但是招样可以链接成功,生成可执行程序,原因就是相关环境变量帮助我们的编译器进行查找。

2.环境变量还有其他的特殊用处,还有在操作系统中通常具有全局特性。

 环境变量的存在,是为了满足操作系统在不同应用场景下的需求,在操作系统中创建的一部分全局变量。

二.常见环境变量

1.PATH:指定命令搜索路径。

2.HOME:指定用户的主工作目录(即用户登录到Linux系统时,默认的目录)。

3.SHELL:当前的shell,通常/bin/bash。

三.查询常见环境变量的方法

 创建一个hello.c

#include<stdio.h>
int main()
{
    printf("hello world\n");
}

大家有没有想过:为什么我运行自己生成的可执行程序都要使用 ./来说明是在当前路径下查找这个可自行程序;但是,我们用系统命令,如ls,就不用指是当前路径呢? 

 这是因为在系统中有一个名为PATH的环境变量,这个环境的作用就是保存命令搜索的路径。我们自己定义的环境变量由于没有PATH里的路径内,如果不手动添加路径,bash就会因为没有找到这个可执行程序而报错。

但是,这种对环境变量修改是一次性的。退出,然后再次登录时,系统会再次加载环境变量。

 

四.和环境变量相关的命令 

1.echo $+变量名:查询某个环境变量,如:echo $PATH查询PATH环境的内容。

2.env:显示操作系统内所有的环境变量。

2.export:设置一个新的环境变量。

4.unset:清除环境变量。

5.set:显示本地定义的shell变量和环境变量。

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

2.环境变量具有全局性,被所有进程所共享,如果不想让其他进程看到,可以设置本地环境变量:

3.如果设置的本地环境变量不想使用了,可以用unset清理掉。

 

4. export+某个环境变量,可以把这个环境变量导入环境变量集,退出重新登录,这个环境变量依旧存在。

 

 五.环境变量表的组织方式

环境变量表是以指针数组的形式存储的。

六.使用系统调用接口方式查询环境变量

1.getenv

函数原型:

char *getenv(const char *name);

name参数是要获取值的环境变量的名称。

该函数包含在#include<stdlib.h>里。

函数作用 :

getenv函数的作用是在当前进程的环境变量中查找指定名称的环境变量,并返回其值的指针。如果找到了对应的环境变量,则返回指向其值的指针;如果未找到,则返回NULL

使用实例 

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
    char*user=getenv("USER");
    printf("%s\n",user);
}

所以,我们还可以根据这个函数做一些权限认证的工作。 

 

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
	const char* user = getenv("USER");
	const char* name = "root";
	if (strcmp(name, user) == 0)
	{
		printf("hello world");
		printf("hello world");
		printf("hello world");
		printf("hello world");
		printf("hello world");
		printf("hello world");
		printf("hello world");


	}
	else
	{
		printf("权限不足");
	}
}

上面这段代码,只有用root的身份才能去执行,否则,就会权限不足。 

 2.反思

我们都知道root是超级管理员,当我们做某些操作没有权限时,我们通常会用sudo命令提高一下权限,那么,sudo的本质是什么呢?

学到现在,我认为sudo的本质就是让USER内的用户名称变为root用户。只有这样,在做认证工作时,就会得到通过,操作就会的到处执行。 

七.通过代码的方式获取环境变量

 1.通过命令行参数

请大家先看这篇文章:关于main函数参数那点事

所以我们可以通过命令行参数的形式获取环境变量:

代码如下:

#include<stdio.h>
#include<stdlib.h>
int main(int argc,char *argv[],char *env[])
{
	int i = 0;
	while (env[i] != nullptr)
	{
		printf("%d:%s", i, env[i]);

	}
}

2.通过getenv函数

#include<stdio.h>
#include<stdlib.h>
int main()
{ 
    printf("%s",getenv("USER");
}

3.通过第三变量environ获取

首先:这个变量是系统给我们准备好的,无论我们是否使用,这个变量都是存在的。

代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
    extern char **environ;
    int i = 0;
    while (*(environ + i))
    {
        printf("%d:%s\n", i, *(environ + i));
        i++;
    }
}

八.环境变量通常具有全局属性

环境变量通常具有全局属性,可以被子进程所继承。如果我们想定义一些不会被子进程所继承的变量,建议定义本地变量。

来看上面这段命令:当前路径下存在一个名为my.out的可执行程序。对其用ls命令。ls作为系统命令,是有默认搜索路径的,存放在PATH变量中。但是,系统为什么知道在那个路径下找my.out这个文件呢?

其实,在系统中,有一个PWD环境变量,这个环境变量存放当前所在路径的位置,然后在这个路径下查找这个指定的文件。

总结

进程切换

  • 系统中存在很多的进程,这些进程都是按照时间片来回切换的,只是切换的时间非常短,造成了一个进程一直在运行的假象。

环境变量

  • 环境变量是系统用来面对各种情况而建立的一些全局变量,我们创建的进程会继承父进程bash的环境变量,来完成身份认证,路径选择工作。
  • 查询环境变量可以通过参数列表、函数getenv、第三方变量environ获得
  • 除了系统给我们定义的环境变量外,我们也可以定义一些本地变量,有必要的话,也可以将本地变量export成环境变量。

写在最后:

因作者水平有限,难免会出现错误,阅读过程中,请大家指正!!

 

 

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

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

相关文章

高校运维赛 2024 pyssrf

没有环境,简单过一遍思路吧 考点: pickle反序列化urllib库注入redis缓存 from flask import Flask,request from redis import Redis import hashlib import pickle import base64 import urllib app Flask(__name__) redis Redis(host127.0.0.1, port6379)def get_result(u…

超越预期:Containerd 如何成为 Kubernetes 的首选容器运行时

> 作者&#xff1a;尹珉&#xff0c;KubeSphere Ambassado&#xff0c;rKubeSphere Contributor&#xff0c;KubeSphere 社区用户委员会杭州站站长。 踏上 Containerd 技术之旅 容器技术已经成为现代软件开发和部署的核心工具。通过容器&#xff0c;开发者可以创建轻量级…

【研发日记】Matlab/Simulink软件优化(二)——通信负载柔性均衡算法

文章目录 前言 背景介绍 初始代码 优化代码 分析和应用 总结 前言 见《【研发日记】Matlab/Simulink软件优化(一)——动态内存负荷压缩》 背景介绍 在一个嵌入式软件开发项目中&#xff0c;需要设计一个ECU节点的CAN网路数据发送&#xff0c;需求是在500k的通信波特率上&a…

Python logging 模块详解

Python 的 logging 模块提供了一个强大而灵活的日志系统。它是 Python 标准库的一部分&#xff0c;因此可以在任何 Python 程序中使用。logging 模块提供了许多有用的功能&#xff0c;包括日志消息的级别设置、日志消息的格式设置、将日志消息输出到不同的目标&#xff0c;以及…

Mysql8安装教程与配置(超详细图文)

MySQL 8.0 是 MySQL 数据库的一个重大更新版本&#xff0c;它引入了许多新特性和改进&#xff0c;旨在提高性能、安全性和易用性。 1.下载MySQL 安装包 注&#xff1a;本文使用的是压缩版进行安装。 &#xff08;1&#xff09;从网盘下载安装文件 点击此处直接下载 &#…

Android 开机动画的启动过程BootAnimation(基于Android10.0.0-r41)

文章目录 Android 开机动画的启动过程BootAnimation(基于Android10.0.0-r41)1.开机动画的启动过程概述2.为什么设置了属性之后就会播放&#xff1f; Android 开机动画的启动过程BootAnimation(基于Android10.0.0-r41) 1.开机动画的启动过程概述 下面就是BootAnimation的重要部…

KIBANA的安装教程(超详细)

前言 Kibana 是一个开源的基于浏览器的可视化工具&#xff0c;主要用于分析和展示存储在 Elasticsearch 索引中的数据。它允许用户通过各种图表、地图和其他可视化形式来探索和理解大量数据。Kibana 与 Elasticsearch 和 Logstash 紧密集成&#xff0c;共同构成了所谓的 ELK 堆…

【论文阅读】SELF-RAG,让模型决策和反思检索

关于LLM何时使用RAG的问题&#xff0c;原本是阅读了关于ADAPT-LLM模型的那篇论文&#xff0c;被问到与SELF-RAG有何区别。所以&#xff0c;大概看了一下SELF-RAG这篇论文&#xff0c;确实很像&#xff0c;这些基于LLM针对下游任务的模型架构和方法&#xff0c;本来就很像。不过…

[AVL数四种旋转详细图解]

文章目录 一.右单旋二. 左单旋三. 右左双旋四. 左右双旋 一.右单旋 新节点插入较高左子树的左侧—左左&#xff1a;右单旋 由于在较高左子树的左侧插入一个节点后&#xff0c;左边插入导致30的平衡因子更新为-1&#xff0c;而60平衡因子更新为-2&#xff0c;此时不平衡&…

oracle数据库通过impdp导入数据时提示,ORA-31684:对象类型用户xxx已存在,和ORA-39151:表xxx存在的解决办法

前提条件&#xff1a;首先备份原数据库中此用户对应的schemas 比如名为cams_wf的schemas 以便出了问题后还可以恢复原数据。 解决办法一、 通过命令或者数据库管理工具删除掉此schemas下的所有表&#xff0c;然后在impdp中加入ignorey 来忽略ORA-31684&#xff1a;对象类型用…

Signac|成年小鼠大脑 单细胞ATAC分析(1)

引言 在本教程中&#xff0c;我们将探讨由10x Genomics公司提供的成年小鼠大脑细胞的单细胞ATAC-seq数据集。本教程中使用的所有相关文件均可在10x Genomics官方网站上获取。 本教程复现了之前在人类外周血单核细胞&#xff08;PBMC&#xff09;的Signac入门教程中执行的命令。…

Spring运维之boot项目bean属性的绑定读取与校验

第三方bean属性的绑定 先写一个实体类 我们在配置yml文件里写了属性值 能一一对应 我们用注解让其对应 我们在启动类里面测试 我们首先拿到容器对象 再拿到bean 打印bean 发现我们的容器获取到的bean bean的属性与配置里面的属性一一对应 这时候提出一个问题 这是我们自定义…

C++设计模式-外观模式,游戏引擎管理多个子系统,反汇编

运行在VS2022&#xff0c;x86&#xff0c;Debug下。 30. 外观模式 为子系统定义一组统一的接口&#xff0c;这个高级接口会让子系统更容易被使用。应用&#xff1a;如在游戏开发中&#xff0c;游戏引擎包含多个子系统&#xff0c;如物理、渲染、粒子、UI、音频等。可以使用外观…

组态软件远程监控

在信息化、智能化的浪潮下&#xff0c;远程监控技术已经渗透到工业生产的各个领域。HiWoo Cloud平台凭借其卓越的组态软件远程监控功能&#xff0c;为企业提供了高效、智能的监控解决方案&#xff0c;推动了工业生产的数字化转型。本文将详细介绍HiWoo Cloud平台在组态软件远程…

【机器学习】GLM4-9B-Chat大模型/GLM-4V-9B多模态大模型概述、原理及推理实战

​​​​​​​ 目录 一、引言 二、模型简介 2.1 GLM4-9B 模型概述 2.2 GLM4-9B 模型架构 三、模型推理 3.1 GLM4-9B-Chat 语言模型 3.1.1 model.generate 3.1.2 model.chat 3.2 GLM-4V-9B 多模态模型 3.2.1 多模态模型概述 3.2.2 多模态模型实践 四、总结 一、引言…

cocos入门4:项目目录结构

Cocos Creator 项目结构教程 Cocos Creator 是一个功能强大的游戏开发工具&#xff0c;它为开发者提供了直观易用的界面和强大的功能来快速创建游戏。在使用 Cocos Creator 开发游戏时&#xff0c;合理地组织项目结构对于项目的可维护性和扩展性至关重要。以下是一个关于如何设…

49.线程池的关闭方法

shutdown方法 1.线程池状态变为shutdown 2.不会接收新任务 3.已提交的任务会执行完 4.此方法不会阻塞调用线程执行 ExecutorService executorService = Executors.newFixedThreadPool(2);executorService.submit(() -> {log.debug("task1 running");try {TimeUnit…

可视化数据科学平台在信贷领域应用系列五:零代码可视化建模

信贷风控模型是金融机构风险管理的核心工具&#xff0c;在信贷风险管理工作中扮演着至关重要的角色。随着信贷市场的环境不断变化&#xff0c;信贷业务的风险日趋复杂化和隐蔽化&#xff0c;开发和应用准确高效的信贷风控模型显得尤为重要。信贷风险控制面临着越来越大的挑战和…

Go实战 | 使用Go-Fiber采用分层架构搭建一个简单的Web服务

前言 &#x1f4e2;博客主页&#xff1a;程序源⠀-CSDN博客 &#x1f4e2;欢迎点赞&#x1f44d;收藏⭐留言&#x1f4dd;如有错误敬请指正&#xff01; 一、环境准备、示例介绍 Go语言安装&#xff0c;GoLand编辑器 这个示例实现了一个简单的待办事项&#xff08;todo&#xf…

【Linux网络】传输层协议 - UDP

文章目录 一、传输层&#xff08;运输层&#xff09;运输层的特点复用和分用再谈端口号端口号范围划分认识知名端口号&#xff08;Well-Know Port Number&#xff09;两个问题① 一个进程是否可以绑定多个端口号&#xff1f;② 一个端口号是否可以被多个进程绑定&#xff1f; n…