环境变量、进程地址空间

环境变量
在Linux下我们编写出一个程序后要运行,可以在前当前目录下./可执行文件名。如果不在当前目录下,就要加上要运行程序的路径。因为可执行文件是在硬盘上的,要运行一个程序,首先得将这个程序可执行程文件加载到内存,所以得知道这个可执行文件的位置。
我们的命令也存储在硬盘中啊,这么一说,我们的命令也是调用一个个可执行文件啊。那为什么不用加它的路径,这是因为PATH(环境变量)里存储了这些命令的路径,所以在执行命令的时候,系统会在环境变量里找到路径信息,就不用我们敲了。
概念:

环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数
如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。
环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性

常见的环境变量

  • PATH : 指定命令的搜索路径
  • HOME : 指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)
  • SHELL : 当前Shell,它的值通常是/bin/bash。

和环境变量相关的命令

  • echo: 显示某个环境变量值
  • export: 设置一个新的环境变量
  • env: 显示所有环境变量
  • unset: 清除环境变量
  • set: 显示本地定义的shell变量和环境变量

所以我们想不敲路径就运行某个自己写的程序,可以直接将该文件复制到环境变量目录里
env查看环境变量
在这里插入图片描述
这些环境变量要么是某个值,要么是路径。
环境变量是系统中某些具有一定全局性质的变量,通常是为了满足系统某些需求。那么系统全局变量存在有什么意义,是为了方便开发者、用户、系统进行某种最简单化的查找、定位、确认等问题。
我们所写的C、C++程序中main()函数是有三个参数的,一般情况下不写。
这三个参数是啥呢?

int main(int argc,char *argv[],char *env[])
{
  /*
  argc是命令行参数个数
  argv和env是字符型指针数组
  字符指针是指向以串字符的,所以argv[]和env[]中存储这一串串字符
  argv存的是命令行参数
  env存的是环境变量
  */
}

在这里插入图片描述
不带参数运行会崩溃
在这里插入图片描述
-a、-b后的执行如下
在这里插入图片描述
执行-b后打env数组,然后打印出了前面env指令显示的环境变量。
所以也可以通过代码来获取环境变量,main函数带参数的时候,参数传到哪都是由系统获取的。
每个程序都会收到一张环境表,环境表是一个字符指针数组,每个指针指向一个以’\0’结尾的环境字符串
在这里插入图片描述

环境变量是有全局性的,由上面打印的环境变量和env显示的环境变量也可以看出。
getenv()这个函数可以获取环境变量。

在这里插入图片描述
可以打印出来
在这里插入图片描述
环境变量具有全局性体:父进程的环境变量是可以被子进程继承下去的。所以默认情况下所有进程能看到的环境白能量都具有全局性。

进程地址空间
在这里插入图片描述
像这种图就很熟悉吧,对于各种数据存储的位置,这是我们对内存的划分。
来段代码
在这里插入图片描述
父进程先结束,子进程改变a的值。
在这里插入图片描述
结果a的值变了,但是他们任然在同一个地址空间,不符合逻辑啊。
变量内容不一样,所以父子进程输出的变量绝对不是同一个变量
但地址值是一样的,说明,该地址绝对不是物理地址!
在Linux地址下,这种地址叫做 虚拟地址
我们在用C/C++语言所看到的地址,全部都是虚拟地址!物理地址,用户一概看不到,由OS统一管理OS必须负责将 虚拟地址 转化成 物理地址 。
所以之前说‘程序的地址空间’是不准确的,准确的应该说成 进程地址空间 ,那该如何理解呢?看图
在这里插入图片描述
当创建一个进程时,他也会创建一个属于自己的地址空间结构。而这个进程内的数据空间分配是分配一个虚拟的内存,然后再由操作系统通过页表管理起来,将虚拟地址和物理地址链接起来。
所以上面代码打印出来的地址是两个进程的虚拟地址,虽然值一样,但是所指向的物理空间是不一样的,由进程本身的页表负责链接物理地址。
进程是独立的,在数据层面先进行独立。但是子进程会继承父进程的虚拟地址开间,这样也节省了内存开支,只有当数据改变时才会重新给他链接一个新的物理空间。
为什么要有地址空间?
本质上是为了更好的管理内存,保护内存。
就像一个银行,要是没有柜台管理,人们可以直接到仓库存取钱,这样你就可以越界拿到别人的钱,不规范的存钱也会造成空间的浪费,就比如你想存500万,但是你发现你面前的这个空间只能存300万了,然后你放弃了这里,去找了个新的空间。
所以有虚拟地址空间会让数据更安全,当越界时操作系统会有相应的保护机制。存放数据时,操作系统会给你分配,以保证能够充分利用到内存。
虚拟地址空间通过页表和物理地址相关联起来了。页表就像一个管理者,会将虚拟内存和物理内存连接起来,它会管理好内存防止越界访问修改,充分利用不连续的物理空间。
想想,似乎明白了许多,申请空间的本质是向内存所要空间,得到物理空间然后再在某个特定的空间申请虚拟地址建立映射关系。所以一个进程要包含着进程地址空间,从而才能保证对数据的管理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值