【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成环境变量。

写在最后:

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

 

 

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

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

相关文章

【简单讲解下TalkingData】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

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

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

【Python报错】已解决ModuleNotFoundError: No Module Named ‘openyxl’

成功解决“ModuleNotFoundError: No Module Named ‘openyxl’”错误的全面指南 在Python编程中&#xff0c;遇到ModuleNotFoundError: No Module Named openyxl这样的错误通常意味着Python解释器无法找到名为openyxl的模块。然而&#xff0c;这里存在一个常见的拼写错误&#…

大语言模型 (LLM) 窥探未来

随着2023年的岁月渐渐走向尾声&#xff0c;我们站在人工智能的前沿&#xff0c;回望大语言模型&#xff08;Large Language Models, LLM&#xff09;所走过的道路&#xff0c;同时也不禁展望未来。从初步尝试到成为人工智能领域的万千宠爱&#xff0c;一种又一种的技术突破&…

搜维尔科技:「案例」Faceware电影中面部动画的演变历程

面部动画是电影中角色表演的一个重要方面&#xff0c;尤其是在严重依赖电子动画、化妆效果和动作捕捉系统的奇幻电影中。在《龙与地下城&#xff1a;盗贼荣誉》电影中&#xff0c;龙裔角色的面部动画是一个复杂的系统&#xff0c;使该生物在大屏幕上栩栩如生。该系统依赖于一种…

超速解读多模态InternVL-Chat1.5 ,如何做到开源SOTA——非官方首发核心技巧版(待修订)

解读InternVL-chat1.5系列 最近并行是事情太杂乱了&#xff0c;静下心来看一看优秀的开源项目,但是AI技术迭代这么快&#xff0c;现在基本是同时看五、六个方向的技术架构和代码&#xff0c;哪个我都不想放&#xff0c;都想知道原理和代码细节&#xff0c;还要自己训练起来&am…

Linux驱动开发笔记(四)设备树进阶及GPIO、Pinctrl子系统

文章目录 前言一、设备树的进阶知识1. 追加/修改节点内容2.chosen子节点3. 获取设备树节点信息3.1 of_find_node_by_path( )函数3.2 of_find_node_by_name( )函数3.3 of_find_node_by_type( )函数3.4 of_find_compatible_node( )函数3.5 of_find_matching_node_and_match( )函数…

Day30 登录界面设计

​ 本章节,实现了登录界面窗口设计 一.准备登录界面图片素材(透明背景图片) 把准备好的图片放在 Images 文件夹下面,格式分别是 .png和 .icoico 图片,右键属性,生成操作选 内容 png 图片,右键属性,生成操作选 资源 选中 login.png图片鼠标右键,选择属性。生成的操作选…

多目标应用:MOHHO多目标哈里斯鹰优化算法求解无人机三维路径规划(MATLAB代码)

详细介绍 多目标应用&#xff1a;MOHHO多目标哈里斯鹰优化算法求解无人机三维路径规划&#xff08;MATLAB代码&#xff09;-CSDN博客 一次运行结果 完整MATLAB代码

CentOS6系统因目录有隐含i权限属性致下属文件无法删除的故障一例

CentOS6服务器在升级openssh时因系统目录权限异常&#xff08;有隐含i权限属性&#xff09;&#xff0c;下属文件无法删除&#xff0c;导致系统问题的故障一例。 一、问题现象 CentOS6在升级openssh时&#xff0c;提示如下问题&#xff1a; warning: /etc/ssh/sshd_config c…

springboot vue 开源 会员收银系统 (6) 收银台的搭建

前言 完整版演示 前面我们对会员系统 分类和商品的开发 完成了收银所需的基础信息 下面我们开始完成收银台的开发 简单画了一个收银的流程图大家参考下 从这张图我们可以分析一下几点 可以选择会员或散客收银选择会员使用相应的会员价结算使用会员卡则在价格基础根据卡折扣…

node.js漏洞——

一.什么是node.js 简单的说 Node.js 就是运行在服务端的 JavaScript。 Node.js 是一个基于 Chrome JavaScript 运行时建立的一个平台。 Node.js 是一个事件驱动 I/O 服务端 JavaScript 环境&#xff0c;基于 Google 的 V8 引擎&#xff0c;V8 引擎执行 Javascript 的速度非常…

神经网络搭建(1)----nn.Sequential

神经网络模型构建 采用CIFAR10中的数据&#xff0c;并对其进行简单的分类。以下图为例 输入&#xff1a;3通道&#xff0c;3232 ( 经过一个55的卷积) → 变成32通道&#xff0c;3232的图像 (经过22的最大池化) → 变成32通道&#xff0c;1616的图像 ( 经过一个55的卷积) → 变…

linux虚拟机免密登录配置

1、假设A服务器要免密登录B服务器 2、在A服务器上执行命令&#xff1a; cd /root/.ssh/ ssh-keygen -t rsa #这里会生成两个文件 一个是id_rsa私钥和公钥rsa.pub2、我们把公钥的内容复制粘贴到B服务器的/root/.ssh/authorized_keys文件下 #在A服务器上执行命令记录内容 cat …

ArkTs-TaskPool和Worker的使用

TaskPool和Worker的区别 实现TaskPoolWorker内存模型线程间隔离&#xff0c;内存不共享。线程间隔离&#xff0c;内存不共享。参数传递机制 采用标准的结构化克隆算法&#xff08;Structured Clone&#xff09;进行序列化、反序列化&#xff0c;完成参数传递。 支持ArrayBuffe…

python调用excel的demo

在本地安装Pycharm之后&#xff0c;新建工程&#xff0c;在main.py中键入如下代码,即可实现Python调用excel&#xff1a; import pandas as pd sheet pd.read_excel(test.xlsx) data sheet.loc[0].values print("读取指定行的数据:\n{0}".format(data)) 第一次编…

IT学习笔记--Flink

概况&#xff1a; Flink 是 Apache 基金会旗下的一个开源大数据处理框架。目前&#xff0c;Flink 已经成为各大公司大数据实时处理的发力重点&#xff0c;特别是国内以阿里为代表的一众互联网大厂都在全力投入&#xff0c;为 Flink 社区贡献了大量源码。 Apache Flink 是一个…

Vscode发生鼠标悬停正在加载、无法跳转和提示词的问题

Vscode发生鼠标悬停正在加载、无法跳转和提示词的问题 查看python语言服务器的日志&#xff0c;确定问题。 我的问题是加载的vscode 目录下存在一个很大的数据集目录&#xff0c;导致无法正常工作。 解决办法&#xff1a; 在vscode的pylance设置中&#xff0c;排除对应的目…

使用 PlayCanvas 创建带有后处理效果的 3D 场景

本文由ScriptEcho平台提供技术支持 项目地址&#xff1a;传送门 使用 PlayCanvas 创建带有后处理效果的 3D 场景 应用场景介绍 本代码演示了如何使用 PlayCanvas 创建一个带有后处理效果的 3D 场景。用户可以在场景中查看一个棋盘模型&#xff0c;并使用后处理效果为场景添…

达梦 执行查询语句时报[-544]:Out of sort buf space

达梦数据库有时执行SQL中有时报[-544]:Out of sort buf space, try to adjust SORT_BUF_GLOBAL_SIZE, SORT_BUF_SIZE, SORT_BLK_SIZE. 第一反应是这条语句占用排序区太大。但真实原因是前面执行的语句耗光了全局排序区&#xff0c;后面SQL任何小的排序操作都会报这个错误从而执…