之前的学习当中,我们都见过这样的空间布局图
让我们来用一段代码感受一下:
输入的结果如下图所示:
我们发现输出的变量和地址是一样的,进程按照父进程为模板,父子并没有对变量进行任何的修改。
输出结果如下所示:
我们发现父子进程的地址是一样的,但是内容不一样。
变量内容不一样,所以父子进程输出的变量绝对不是同一个变量。地址却是一样的说明该地址不是物理地址。在Linux下,这种地址叫做虚拟地址。
我们用C/C++语言看到的地址,全部都是虚拟地址!物理地址,用户一概看不到,由OS统一管理
OS必须负责将虚拟地址转化成物理地址
子进程对全局数据修改,并不影响父进程!进程具有独立性
进程 = 内核数据结构 + 代码和数据
我么之前所说的程序地址空间是不准确的,准确的应该说成进程地址空间
,我们可以用一下这幅图来理解:
同一个变量,地址相同,其实是虚拟地址相同,内容不同其实是被映射到不同的物理地址
数据和代码真正只能在内存当中
我们的程序再被编译的时候,没有被加载到内存,请问我们的程序有没有地址呢?
虚拟地址这样的策略,不仅会影响OS,还要让我们的编译遵守这样的规则
源代码被编译的时候,就是按照虚拟地址的方式进行对代码和数据早就已经编号了对应的编制