Linux系统 进程(环境变量+进程地址空间)

目录

1、环境变量

1.1、环境变量的概念

1.2、常见环境变量

1.3、 为什么我们的二进制程序需要加路径才可执行,而指令却可以直接执行呢?如何不需要加路径也可直接执行?

1.4、本地变量和环境变量的区别,如何查找

 1.5、main()函数参数,main函数中如何获取全局变量?

 2、进程地址空间

2.1、地址空间基本排布

2.2 进程地址空间是啥?

 2.3虚拟地址和物理地址关系

2.4为什么存在地址空间


1、环境变量

1.1、环境变量的概念

环境变量:一般是指操作系统中用来指定操作系统运行环境的一些参数。其有某些特殊用途,在系统当中具有全局属性。

1.2、常见环境变量

PATH:指定命令的搜索路径

HOME:指定用户的主工作目录

SHELL:当前Shell,他的值通常是/bin/bash。

1.3、 为什么我们的二进制程序需要加路径才可执行,而指令却可以直接执行呢?如何不需要加路径也可直接执行?

 不加当前路径系统不知道哪里去找我们的代码。将我们代码添加到环境变量PATH路径下,PATH会辅助系统查找我们的代码(指令)。环境变量具有全局属性。

1.4、本地变量和环境变量的区别,如何查找

命令行中可定义两者变量,本地变量和环境变量。环境变量具有全局属性,所以本地变量包含环境变量。环境变量可被bash创建的子进程访问,本地变量只能够在当前shell命令行解释器内被访问,子进程不能继承。

为何echo命令可以访问本地变量?

一般情况下执行命令,bash就会创建子进程,去访问本地变量,这时由于是本地故访问不到,但是echo是shell内部的内建命令,是shell内部的一个函数,本地变量也是shell内部的,所以可以访问。

 1.5、main()函数参数,main函数中如何获取全局变量?

main函数的第一个命令行参数是shell命令行上我们写的命令个数,第二个是一个指针数组,每个指针指向一个我们所写命令。

shell中的命令类似于下面

第三个main参数就是环境变量参数,想拿到某个具体的环境变量可以通过getenv。像下面这种就是所有通过第三个参数全部打印出来,其中要是使用environ(C语言提供)也是类似。

 2、进程地址空间

2.1、地址空间基本排布

上述代码验证了进程地址空间不是内存。

2.2 进程地址空间是啥?

一种虚拟地址。是一种结构体,按范围划分成不同区域。每一个地址就叫做虚拟地址。

 2.3虚拟地址和物理地址关系

 代码加载到内存,创建进程,进程通过虚拟地址空间找寻代码数据,其实就是虚拟地址通过页表和内存进行映射。

我们父进程创建子进程,代码都是一样的,数据不一样是父或子修改时让子进程页表映射到物理内存其他地方,就是写时拷贝到其他处,这时被改的数据就有两份。

通常我们认为父子进程代码共享,数据各一份,写时拷贝实现。

2.4为什么存在地址空间

1、以前没有地址空间,直接访问物理内存,使用物理地址的指针容易越界访问,当前进程访问到别的进程对应的资源上去。

存在的好处1:保护物理内存不受到任何进程内地址的直接访问,在虚拟地址到物理地址的转化过程中方便进行合法性校验

访问时如果指针从虚拟地址空间的一个区域到另外一个,会发生报错。比如你越界而且要修改字符常量区,页表上设置为只读,很显然程序要挂掉。

2、操作系统进程管理和内存管理是强耦合的

创建进程同时加载代码到内存,如果退出进程,得回收资源,创建得分配资源,但是如果没有地址空间页表,这样会导致代码特别复杂。如果有,创建进程时只需要知道哪些内存是有可分配的,通过页表直接映射分配就行了,回收时也只需要把页表映射取消就行。比如说在一块物理内存区域设置一个计数器count,当页表中有映射到这块区域时,count就++,当一个映射去掉时,就count–,内存管理只需要检测这个count是不是0,如果为0,说明它是没人用的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值