linux学习笔记04
1.环境变量
1.1命令行参数
main函数的命令行参数就是为了实现程序的不同的子功能;
类似于在linux下面的这个指令的选项,通过不同的选项实现不同的功能;
在我们的这个main函数里面,也就是我们学习这个C语言的时候撰写的这个第一个程序,int main()这个main函数里面实际上也是存在着这个命令行参数的,也就是argc和argv,后面的这个事数组,前面的这个是我们的程序的命令行参数的个数;
1.2浅谈环境变量
环境变量最开始在我们的这个配置文件里面,是从系统的配置文件里面来的;
登录的时候bash读取配置文件,形成环境变量表,把配置文件里面的内容放到这个环境变量表里面,用输入的指令也会在这个bash里面形成命令行参数表;
命令行参数表随着我们的这个指令的输入不断的变化,但是这个环境变量表比较稳定;
export在bash的环境变量表里面添加新的环境变量;
父进程的环境变量可以被子进程继承,因此我们的这个环境变量具有全局的属性,这样我们的这个子进程可以根据继承得到的这个环境变量,进行定制化的操作;
我们可以使用系统调用getenv获取环境变量的内容;
本地变量不会被子进程继承,只会被我们的bash内部使用;
2.程序地址空间
2.1进程地址空间的引入
下面的这个图可能我们是非常熟悉的了,其实这个就是程序地址空间,或者说是进程地址空间,也叫做虚拟地址空间,并不是我们真正的这个物理意义上面的内存,而是虚拟的;
2.2虚拟地址的验证
下面的这个实际上是一个程序,就是想说明这个事虚拟地址,因为这个第二列里面的地址也就是&gval是完全一致的,但是这个父进程和子进程的数值是不一样的,父进程是100,子进程的这个数据是变化的;
如果这个事物理地址,不可能出现这么玄学的情况,因此这个就是虚拟地址;
2.3虚拟地址物理地址转换
虚拟地址和物理地址的转换主要是通过页表进行的(计算机组成原理,操作系统里面都会接触这些概念的);
每一个进程都有属于自己的这个虚拟地址空间,每一个进程都有自己的页表;
当我们的这个子进程想要对于这个数据进行修改的时候,会把这个物理地址内存里面的数据拷贝一份新的,让我们的这个子进程进行修改,这个拷贝的动作是操作系统做的;
这个实际上就是我们介绍的写实拷贝;
实际上我们的这个子进程的地址空间,页表都是拷贝的我们的父进程的,指向的这个区域都是和我们的父进程指向的是一样的区域;
2.4为什么需要虚拟地址
我们想要进行这个物理地址的访问的时候,本来我们是可以直接进行这个物理地址的访问的,但是现在因为这个虚拟地址的存在,导致我们现在必须要经过这个虚拟地址和物理地址的转换,经过页表,现在反而多走了一步,这个是为什么了,难道我们直接一步到位不好么?
不知道大家有没有这个疑问,下面我们通过一个案例说明一下这个虚拟地址存在的必要性;
实际上就是你本来的压岁钱,可以直接去买一些自己喜欢的,但是后来你的妈妈发现了这个你老是去买一些辣条,很有添加剂的垃圾食品,于是你的妈妈介入,对于你的这个压岁钱进行管理,你想要使用这个零花钱的时候,就去请示你的母亲,但是当你想要买辣条的时候,你的母亲直接拒绝,说这个东西对于你的身体健康有害,因此不同意你的这个请求;
可以见得,你本来可以直接使用你的零花钱的,但是你的母亲介入使得需要对于你的这个请求进行检查;
虚拟地址也是类似的道理,如果你直接对于这个物理地址进行访问,可能会存在无法预料到的问题,例如这个权限之类的,但是虚拟地址的介入相当于是对于这个想要访问的地址进行检查,看看这个合法性之类的,以及这个权限是否满足,也就是对于我们的这个物理地址进行保护;
还有一点:地址空间存在可以帮助我们的进程管理和内存IO管理解耦合,不让他们之间的这个耦合性过强;
即使是malloc不连续的这个区域,我们的这个操作系统会使用一个list对于这些不连续的空间进行管理;
- 点赞
- 收藏
- 关注作者
评论(0)