繁体   English   中英

程序具有相同的虚拟地址空间时会怎样?

[英]What are the cases when a program has the same virtual address space

如果您在两个不同的终端上运行了一个程序foo.c,并打印了正在执行的局部变量的地址。 他们会是一样的。 但是,例如在shell内执行并执行分支的情况下,我运行了foo.c这样的程序。 它将创建完全相同的Shell副本,然后执行foo.c。 他们将拥有相同的虚拟地址空间。 而且,如果程序递归调用自己,该递归调用的相同变量是否仍具有相同的地址空间,并且该程序如何在其自身的地址空间内增长?

如果您在两个不同的终端上运行了一个程序foo.c,并打印了正在执行的局部变量的地址。 他们会是一样的。

不一定,现代操作系统使用地址空间布局随机化 ,这意味着内存地址可以(并且确实)从一个执行更改为另一个执行。

在例如在shell中进行分叉和执行说的情况下,我运行了foo.c这样的程序。 它将创建完全相同的Shell副本,然后执行foo.c。 他们将拥有相同的虚拟地址空间。

不,每个进程都有自己的虚拟地址空间。 变量的地址可能看起来相同,但是在一个进程中写入局部变量对另一进程没有影响(除非您已显式共享内存)

而且,如果程序递归调用自己,该递归调用的相同变量是否仍具有相同的地址空间,并且该程序如何在其自身的地址空间内增长?

研究进程和线程之间的差异,以更好地了解这里发生的情况。 如果程序派生 ,则子进程将具有单独的地址空间。 如果函数在程序中调用自身,它将在相同的地址空间中执行,但是局部变量在每个堆栈帧中都将分开。 跨函数调用,全局(或静态)变量将位于相同的内存地址。

如果在两个不同的终端中运行foo.c并打印了局部变量的地址,则它们将显示相同的内容。 但是,它们是两个具有相同值的不同变量。

它们不指向内存中的同一区域。

从外壳进行分叉还将使该过程在虚拟内存的两个不同区域中具有两个单独且不同的变量。

实际上,如果您从foo.c中产生一个进程,就是这种情况

如果希望在两个进程之间有共享内存,则需要生成线程或使用共享内存

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM