💖作者:小树苗渴望变成参天大树🎈
🎉作者宣言:认真写好每一篇博客💤
🎊作者gitee:gitee✨
💞作者专栏:C语言,数据结构初阶,Linux,C++ 动态规划算法🎄
如 果 你 喜 欢 作 者 的 文 章 ,就 给 作 者 点 点 关 注 吧!
前言
各位友友们好久不见,本人前段时间出去放松了一下,所以就一直没有更新新的文章,现在博主回来了,又可以给大家更新新的文章了,今天我们讲的是进程概念的最后一个专题,进程地址空间,这也是相对来说比较难理解的一个概念,这个概念之前有所了解,但今天需要展开来讲,我会一层层的带大家去理解的,话不多说,我们开始进入正文。
一、验证进程地址空间
1.验证
我们首先来看一个案例,创建父子进程,定义一个全局变量,然后其中一个进程修改全局变量,来看看效果是什么样的:
#include<stdio.h>
#include<unistd.h>
int g_val=100;
int main()
{
pid_t id =fork();
if(id==0)
{
int cnt=0;
while(1)
{
printf("我是子进程:g_val=%d,&g_val=%p,cnt=%d\n",g_val,&g_val,cnt);
sleep(1);
if(cnt++==5)
{
g_val=200;
}
}
}
else
{
while(1)
{
printf("我是父进程:g_val=%d,&g_val=%p\n",g_val,&g_val);
sleep(1);
}
}
return 0;
}
我们通过子进程修改了全局变量,我们一起来看看运行后的效果是什么样的吧
我们发现相同的地址,里面的值不一样,这显然是不符合常理的,我们一个地址对应着一个数据才是正确的,不然就会有二义性,所以这个地址并不是我们所说的内存上真正的地址,现在我先告诉你这是一个虚拟地址,内存上的是物理地址(硬件可以直接访问的地址),所以我们的程序加载到内存上,形成的地址都是一个虚拟地址,下面这个图就是我们平时说到虚拟内存地址分布,这上面的地址都是虚拟地址,这些虚拟地址最后都会通过映射的方式来映射到实际的物理地址上。来进行运算的。
我们上面的代码怎么为什么出现这样的效果呢,看下图:
虚拟地址虽然是相同的,但是通过页表映射到物理地址却是不同的地址,所以相同的是虚拟地址,值不同就是物理地址的不同。
相信大家看到这里,应该了解了一部分,但是还是不明白,博主采取一种先给大家看结论,然后再一点点的去讲细节,所以接下来,我将给大家详细介绍一下。
上面的内存区域分布图是虚拟内存的分布图,而不是真正的内存区域分布图,我们的代码的各个变量都会有对应区域(怎么做到的,后面再说),我们来验证一下,这些区域的到底存不存在。看代码:
#