程序地址空间

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

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

代码结果:

j

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

我们将代码稍加改动:

结果如下:

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

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

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

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

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

猜你喜欢

转载自blog.csdn.net/CDatreides/article/details/85047790