程序地址空间

我们在学习linux的时候,老师曾给我们画过这样的空间布局图。

 

由图我们并不能理解它所表达的意思,接下来用代码验证一下:

代码结果:

j

结论:根据代码结果可知,当我们fork一个进程时,它的父子进程的地址以及数据都是相同的,因此我们可以的得出父子进程创建时共享代码段以及数据段。

我们将代码稍加改动:

结果如下:

结论:从以上比较我们可以看出,代码改变之后他们的地址依旧相同,但数值却有所不同,那么我们便可以肯定这里的地址肯定不是物理地址,那它究竟是什么呢?接下来让我们用一张图来解释一下:

其实当一个进程创建好时,它不仅拥有PCB,它还创建了虚拟地址空间,以及页表。

当我们创建出父子进程时,他们通过页表映射到物理内存。因此在代码不做修改时,我们看到的数据是一样的。在这里我们将看到的相同地址称为“虚拟地址”。当有一方想要更改数据时,操作系统就会为更改方拷贝新的数据段(写时拷贝),如下所示:

从图可以看出,当值改变时,操作系统给我们看到的地址是一样的,但是其实在物理内存是不一样的。

其实计算机如此设计目的就是为了更好的保护物理内存,防止物理内存被破坏以及侵占。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值