进程——环境变量及程序地址空间

news2025/7/28 16:00:04

目录

环境变量

概念

补充:命令行参数

引入

其它环境变量

理解

程序地址空间

引入

理解

虚拟地址存在意义


 

 

环境变量

概念

    环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数。打个比方,就像你布置房间,这些参数就类似房间里的布置规则,决定了东西怎么摆放、怎么用,能让操作系统在合适的“环境”下正常运转 。

 

补充:命令行参数

    命令行参数是在运行命令行程序时,跟随在程序名称之后输入的额外参数。这些参数用于控制程序的行为等。大家可能认为main是没有参数,实则不然实际上它是有参数的。

    上面的argv表示命令行参数的数组,argc表示数组里内容的个数。下面是它的运行结果:

    其实通过上面的我们可以发现我们在命令行输入的指令,其实是字符串。

    在执行该可执行文件时,bash会创建一个子进程用来执行该程序。命令行参数会被bash解析和切分,然后bash会通过内部的机制来处理和传递这些参数信息给要执行的程序,由程序自身来存储和处理命令行参数。

    上面是运行结果是不是感觉很熟悉,其实我们平时使用的指令,它里的选项就是这样实现的,通过上面就可以实现在一个函数里有不同的子功能。

 

引入

    不知道大家有没有想过,为什么在执行系统程序时不同写路径,而我们自己写的程序就要写路径?

    因为存在环境变量——PATH,它的作用是告诉系统去哪里查找。env:查看所有环境变量,echo $环境变量名:查看指定环境变量。环境变量默认是放在~/.bash_profile里。

    我们可以添加路径:PATH=$PATH:新路径。不要PATH=新路径否则会替换原有路径!

    其大概过程是,如果没有指定路径bash会先查看是不是内建命令,如果不是它就会去PATH里所有路径下找,如果找到了就执行该文件,没找到就会显示错误信息。补充:内建命令是在bash里面的,它是bash自己解释处理的,不需要创建子进程。

    环境变量一般是从配置文件里来的,每次从新登陆就会从配置文件里读取一次。

其它环境变量

下面我介绍几个常用的环境变量:

  • HOME:当前用户所对应的家目录(~),这就解释了为什么cd ~就会回到家目录。

  • SHELL:shell所在路径,一般指的是bash所在路径

  • USER:当前用户是谁,以便进行权限管理、个性化设置等操作

  • LOGNAME:登录是谁,他与上面的USER在大多数情况下是一样的

  • HISTSIZE:bash会记录HISTSIZE个历史命令

  • HOSTNAME:登录主机名

    这里我不知道为什么我没有。

  • PWD:当前工作目录

  • OLDPWD:上次工作目录(-)

    这里我不知道为什么我没有。

理解

    其实通过getenv(name)也可以具体查看某环境变量,还有environ它是访问环境变量的全局变量。

    在bash里有一张环境变量表,它是可以被子进程继承的,并且子进程的修改不影响父进程。所以环境变量具有全局性和独立性。在main函数里还有一个参数它是用来存储环境变量表(main函数里最多三个参数)。

    通过export可以自己导入环境变量,unset取消自己导入的环境变量。

    我上面所说的都是bash里的环境变量。但大家有没有想过export它是一个子进程啊,我用export导了一个环境变量那不是应该在子进程里吗?怎么会到bash里呢?其实export它是内建命令,它是bash亲自执行的。

    命令行是可以定义变量的(命令行定义),这种变量被称为本地变量(支持该操作有一点原因是要支持脚本),它不会被继承,只能在当前的进程里使用。用set可以显示环境变量和本地变量,用unset也可以取消本地变量。

    注意不要有空格,否则就是命令了。本地变量是可以变成环境变量的。

 

程序地址空间

引入

    大家先看下面的代码:

    是不是感觉不可思议,一块地址上竟然有两个值!实际上我们看到的地址是虚拟地址并不是物理地址,真正的物理地址用户是看不到的。

理解

    一个进程有一个虚拟地址空间,一套页表。页表是虚拟地址到物理地址映射。所以上面的代码就可以这么理解。

    首先是一个父进程

(上面写错了是命令参数环境变量)然后fork一个子进程,子进程会复制父进程的PCB和页表,并自己做出一些修改

    当子进程对val修改后

    虚拟地址空间的大小在32位机器上是4G,一般是用户用3G,内核用1G。进程会以为自己占据了整个内存。它里面的区域划分包括如代码段、数据段、堆、栈等。系统里的每个进程都会有自己的进程地址空间。

    补充:可以简单认为进程地址空间和虚拟地址空间是一回事。但严格来说,虚拟地址空间是机制,进程地址空间是实例。也就是说进程地址空间是虚拟地址空间在单个进程中的具体实现。

    操作系统会对进程地址空间进行管理,那怎么管理呢?依然是先描述在组织,所以PCB里有mm_struct,它是对进程地址空间的描述。

    mm_struct是Linux内核中用于描述进程内存空间的数据结构。它包含了进程虚拟地址空间的各种信息。它里面主要是记录区域的开始位置和结束位置。当想调整某区域时,只需要改变起始位置和结束位置即可。

    堆是不连续的,我们需要记录每一个堆的开始和结束位置。但是在mm_struct里只有一对用于记录堆的开始和结束位置,那如果我又用malloc开辟了一段空间,那该怎么办呢?其实在mm_struct里有vm_area_struct它表示一个独立的虚拟内存区域。所以不管开辟多少空间只需要用vm_area_struct连接起来即可。其实不仅是堆,其它的区域也会用vm_area_struct表示区域范围。vm_area_struct通过双链表和红黑树管理起来。

    mm_struct是对进程整个虚拟地址空间进行宏观的,整体的描述和管理。 vm_area_struct是更细致地表示虚拟地址空间中的每一个具体的、独立的虚拟内存区域,它描述了每个区域的具体属性。

    int有4个字节,它占据了4个虚拟地址。在取它地址时为什么只返回一个地址?其实系统会返回地址最小的那个值,剩下的可以通过偏移量来计算出来,所以才会有类型这一说。

虚拟地址存在意义

  • 程序的各个部分(如代码段、数据段等)在物理内存上的存储位置可能是不连续、无序的,但我们通过虚拟地址来看就是有序的。
  • 在地址的转化过程中,会对你的地址和操作进行合法性判断,从而保护物理内存。

比如:

    当你拿野指针去查页表,页表里面并没有该地址,程序就会崩溃(也不是说一定会崩溃,可能你的野指针正好在页表里,这其实比崩溃还可怕)。

    当执行char* str = "hello"; *str = 'H'; 时,查页表时会发现str只有只读权限没有修改权限,程序就会崩溃。

  • 让进程管理和内存管理进行一定程度的解耦和。

    有了虚拟地址之后我们就不用把所有的代码和数据给一次性都给加载到物理内存里,而是分批次加载,甚至可以不加载,让进程只有PCB和页表,这时去查页表时如果物理地址为空就会发生缺页中断,进程会停下来等页表补充完后再次执行。

 

 

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

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

相关文章

VR视频制作有哪些流程?

VR视频制作流程知识 VR视频制作,作为融合了创意与技术的复杂制作过程,涵盖从初步策划到最终呈现的多个环节。在这个过程中,我们可以结合众趣科技的产品,解析每一环节的实现与优化,揭示背后的奥秘。 VR视频制作有哪些…

Ubuntu 系统部署 MySQL 入门篇

一、安装 MySQL 1.1 更新软件包 在终端中执行以下命令,更新系统软件包列表,确保安装的是最新版本的软件: sudo apt update 1.2 安装 MySQL 执行以下命令安装 MySQL 服务端: sudo apt install mysql-server 在安装过程中&…

【MATLAB代码】制导——平行接近法,三维,目标是运动的,订阅专栏后可直接查看MATLAB源代码

文章目录 运行结果简介代码功能概述运行结果核心模块解析代码特性与优势MATLAB例程代码调整说明相关公式视线角速率约束相对运动学方程导引律加速度指令运动学更新方程拦截条件判定运行结果 运行演示视频: 三维平行接近法导引运行演示 简介 代码功能概述 本代码实现了三维空…

黑马Java面试笔记之 微服务篇(SpringCloud)

一. SpringCloud 5大组件 SpringCloud 5大组件有哪些? 总结 五大件分别有: Eureka:注册中心Ribbon:负载均衡Feign:远程调用Hystrix:服务熔断Zuul/Gateway:网关 如果项目用到了阿里巴巴&#xff…

CLIP多模态大模型的优势及其在边缘计算中的应用

CLIP多模态大模型的优势及其在边缘计算中的应用 CLIP(Contrastive Language-Image Pre-training)模型,是OpenAI开发的一种多模态大模型。该模型通过对比学习的方式,在大规模图像-文本对上进行预训练,成功实现了图像和文…

基于STM32语音识别柔光台灯

基于STM32语音识别柔光台灯 (程序+原理图+PCB+设计报告) 功能介绍 具体功能: 基于语音识别的智能LED柔光台灯设计,主要包括语音识别模块应用,PWM波控制LED柔光灯的亮度&#xff0c…

基于PSO粒子群优化的VMD-GRU时间序列预测算法matlab仿真

目录 1.前言 2.算法运行效果图预览 3.算法运行软件版本 4.部分核心程序 5.算法仿真参数 6.算法理论概述 6.1变分模态分解(VMD) 6.2 门控循环单元(GRU) 6.3 粒子群优化(PSO) 7.参考文献 8.算法完…

探索未知惊喜,盲盒抽卡机小程序系统开发新启航

在消费市场不断追求新鲜感与惊喜体验的当下,盲盒抽卡机以其独特的魅力,迅速成为众多消费者热衷的娱乐与消费方式。我们紧跟这一潮流趋势,专注于盲盒抽卡机小程序系统的开发,致力于为商家和用户打造一个充满趣味与惊喜的数字化平台…

基于开源AI大模型与AI智能名片的S2B2C商城小程序源码优化:企业成本管理与获客留存的新范式

摘要:本文以企业成本管理的两大核心——外部成本与内部成本为切入点,结合开源AI大模型、AI智能名片及S2B2C商城小程序源码技术,构建了企业数字化转型的“技术-成本-运营”三维模型。研究结果表明,通过AI智能名片实现获客留存效率提…

Python----目标检测(YOLO简介)

一、 YOLO简介 [YOLO](You Only Look Once)是一种流行的物体检测和图像分割模型, 由华盛顿大学的约瑟夫-雷德蒙(Joseph Redmon)和阿里-法哈迪(Ali Farhadi)开发,YOLO 于 2015 年推出&#xff0c…

Profinet 协议 IO-Link 主站网关(三格电子)

一、产品概述 1.1 产品用途 SG-PN-IOL-8A-001 网关是 Profinet 从转 IO-Link 主的网关设备 ,可以将 IO-Link 从站设备接入 Profinet 系统,通过该网关可实现传感器及驱动器与控制 器之间的信息交互。网关有两个百兆网口和 8 个 IO-Link 端口,两…

Ubuntu22.04 安装 Miniconda3

Conda 是一个开源的包管理系统和环境管理系统,可用于 Python 环境管理。 Miniconda 是一个轻量级的 Conda 发行版。Miniconda 包含了 Conda、Python和一些基本包,是 Anaconda 的精简版本。 1.下载安装脚本 在 conda官网 找到需要的安装版本&#xff0…

Hubstudio浏览器如何使用Loongproxy?

1. 使用软件 1.1 Loongproxy 1. 顶级ISP资源:Loongproxy是神龙云旗下品牌,依托与全球领先ISP运营商的深度合作,Loongproxy 精选全球优质静态住宅IP资源。 2. IP池庞大:覆盖 100 国家/地区,构建庞大的 70 万 静态IP池…

硬件工程师笔记——555定时器应用Multisim电路仿真实验汇总

目录 一 555定时器基础知识 二、引脚功能 三、工作模式 1. 单稳态模式: 2. 双稳态模式(需要外部电路辅助): 3. 无稳态模式(多谐振荡器): 4. 可控脉冲宽度调制(PWM)模式: 四、典型应用 五、优点 二 555无稳态触发器 三 555单稳态触发器 四 555双稳态触发器…

ComfyUI 对图片进行放大的不同方法

本篇里 ComfyUI Wiki将讲解 ComfyUI 中几种基础的放大图片的办法,我们时常会因为设备性能问题,不能一次性生成大尺寸的图片,通常会先生成小尺寸的图像然后再进行放大。 不同的放大图片方法有不同的特点,以下是本篇教程将会涉及的方法: 像素重新采样SD 二次采样放大使用放…

Elasticsearch最新入门教程

文章目录 Elasticsearch最新入门教程1.Elasticsearch安装2.Kibana安装3.Elasticsearch关键概念4.SpringBoot整合Elasticsearch4.1 导入Elasticsearch数据4.2 创建SpringBoot项目4.3 修改pom.xml文件4.4 创建es实体类4.5 创建es的查询接口 5.DSL语句5.1 无条件查询5.2 指定返回的…

【Linux网络篇】:从HTTP到HTTPS协议---加密原理升级与安全机制的全面解析

✨感谢您阅读本篇文章,文章内容是个人学习笔记的整理,如果哪里有误的话还请您指正噢✨ ✨ 个人主页:余辉zmh–CSDN博客 ✨ 文章所属专栏:Linux篇–CSDN博客 文章目录 HTTPS协议原理一.预备知识1.什么是“加密”2.为什么要“加密”…

字符串 金额转换

package heima.Test09;import java.util.Scanner;public class Money {public static void main(String[] args) {//1。键盘录入一个金额Scanner sc new Scanner(System.in);//请输入一个数据String result "";int money;while (true) {System.out.println("请…

浅聊一下,大模型应用架构 | 工程研发的算法修养系列(二)

大模型应用架构基础 AI应用演进概述 人工智能应用的发展经历了多个关键阶段,每个阶段都代表着技术范式的重大转变。 大语言模型基础 大语言模型(LLM)作为现代AI应用的核心组件,具有独特的技术特性和能力边界,理解这些基础对架构设计至关重要。…

装载机防撞系统:智能守护,筑牢作业现场人员安全防线

在尘土飞扬、机械轰鸣的建筑工地上,装载机是不可或缺的 “大力士”,承担着土方搬运、物料装卸等繁重任务。然而,传统作业模式下,装载机的安全隐患时刻威胁着现场人员的生命安全与工程进度。随着智能化技术的突破,唯创安…