Memory 当程序具有相同的虚拟地址空间时,会出现什么情况

Memory 当程序具有相同的虚拟地址空间时,会出现什么情况,memory,mapping,virtual-address-space,Memory,Mapping,Virtual Address Space,如果在两个不同的终端上运行程序foo.c,并打印正在执行的局部变量的地址。他们会是一样的。然而,在分叉和执行的上下文中,例如在shell中,我运行了一个程序,比如foo.c。它将创建一个完全相同的shell副本,然后执行foo.c。它们将具有相同的虚拟地址空间。 如果一个程序递归调用自己,那么被递归调用的同一个变量是否仍然具有相同的地址空间?这个程序如何在自己的地址空间中增长?如果在两个不同的终端上运行foo.c并打印局部变量的地址,它们将显示相同的地址。然而,它们是两个不同的变量,恰好具有相同

如果在两个不同的终端上运行程序foo.c,并打印正在执行的局部变量的地址。他们会是一样的。然而,在分叉和执行的上下文中,例如在shell中,我运行了一个程序,比如foo.c。它将创建一个完全相同的shell副本,然后执行foo.c。它们将具有相同的虚拟地址空间。
如果一个程序递归调用自己,那么被递归调用的同一个变量是否仍然具有相同的地址空间?这个程序如何在自己的地址空间中增长?

如果在两个不同的终端上运行foo.c并打印局部变量的地址,它们将显示相同的地址。然而,它们是两个不同的变量,恰好具有相同的值

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

从shell中分叉还将使进程在虚拟内存的两个不同区域中拥有两个独立且不同的变量

事实上,如果您从foo.c生成一个进程,情况就是这样


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

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

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

从shell中分叉还将使进程在虚拟内存的两个不同区域中拥有两个独立且不同的变量

事实上,如果您从foo.c生成一个进程,情况就是这样

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

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

不一定,现代操作系统使用,这意味着内存地址可以(而且确实)从一次执行到下一次执行

在分叉和执行的上下文中,比如说在shell中,我运行了一个程序,比如foo.c。它将创建一个完全相同的shell副本,然后执行foo.c。它们将具有相同的虚拟地址空间

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

如果一个程序递归调用自己,那么递归调用的同一个变量是否仍然具有相同的地址空间?这个程序如何在自己的地址空间中增长

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

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

不一定,现代操作系统使用,这意味着内存地址可以(而且确实)从一次执行到下一次执行

在分叉和执行的上下文中,比如说在shell中,我运行了一个程序,比如foo.c。它将创建一个完全相同的shell副本,然后执行foo.c。它们将具有相同的虚拟地址空间

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

如果一个程序递归调用自己,那么递归调用的同一个变量是否仍然具有相同的地址空间?这个程序如何在自己的地址空间中增长


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

所以当递归发生时,它实际上是在创建自己的线程。我认为线程需要显式生成,就像使用thread_fork(foo.c)是os161(忽略我的参数)术语“递归”通常只是指在同一线程和进程上调用自身的函数。也许我误解了你所说的“程序递归调用自身”的意思。一个线程有一个堆栈,它在递归函数调用期间在进程的地址空间中增长。因此,当递归发生时,它实际上是在创建一个自己的线程。我认为线程需要显式生成,就像使用thread_fork(foo.c)是os161(忽略我的参数)术语“递归”通常只是指在同一线程和进程上调用自身的函数。也许我误解了你所说的“程序递归调用自身”的意思。线程有一个堆栈,在递归函数调用期间,该堆栈在进程的地址空间内增长。