【Linux】-进程概念之进程地址空间的万字详解(解决一个变量怎么保存不同数据的问题)

在这里插入图片描述
💖作者:小树苗渴望变成参天大树🎈
🎉作者宣言:认真写好每一篇博客💤
🎊作者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;
}

我们通过子进程修改了全局变量,我们一起来看看运行后的效果是什么样的吧
在这里插入图片描述
我们发现相同的地址,里面的值不一样,这显然是不符合常理的,我们一个地址对应着一个数据才是正确的,不然就会有二义性,所以这个地址并不是我们所说的内存上真正的地址,现在我先告诉你这是一个虚拟地址,内存上的是物理地址(硬件可以直接访问的地址),所以我们的程序加载到内存上,形成的地址都是一个虚拟地址,下面这个图就是我们平时说到虚拟内存地址分布,这上面的地址都是虚拟地址,这些虚拟地址最后都会通过映射的方式来映射到实际的物理地址上。来进行运算的。
在这里插入图片描述
我们上面的代码怎么为什么出现这样的效果呢,看下图:
在这里插入图片描述
虚拟地址虽然是相同的,但是通过页表映射到物理地址却是不同的地址,所以相同的是虚拟地址,值不同就是物理地址的不同。

相信大家看到这里,应该了解了一部分,但是还是不明白,博主采取一种先给大家看结论,然后再一点点的去讲细节,所以接下来,我将给大家详细介绍一下。

上面的内存区域分布图是虚拟内存的分布图,而不是真正的内存区域分布图,我们的代码的各个变量都会有对应区域(怎么做到的,后面再说),我们来验证一下,这些区域的到底存不存在。看代码:

#
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

橘柚!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值