一尘不染

叉子-相同的内存地址?

linux

这是关于Linux中的C语言。

fork()main()其中创建2个子进程。然后,在两个子进程中都运行一个函数abc(),其中有一个局部变量x。我在其中写一些价值。然后,我用打印此变量的地址printf("%p",&x)

这两个过程都打印相同的地址。我以为每个孩子都会得到父母记忆的(独立)副本。我需要每个进程都有自己的变量x。我该怎么办或我做错了什么?


阅读 203

收藏
2020-06-02

共1个答案

一尘不染

您需要了解,物理内存与进程的虚拟地址空间之间存在脱节。

每个进程都有 自己的 4G虚拟地址空间,这是操作系统和硬件内存管理器将您的虚拟地址映射到物理地址的工作。

因此,尽管 看起来 两个进程的变量地址相同,但这只是 虚拟 地址。

内存管理器会将其映射到完全不同的 物理 地址a。

此映射还使您可以运行十个进程,每个进程占用1G的空间,即使您的计算机只有4G的物理内存。操作系统可以将您的内存中的一部分交换到磁盘上,并在您尝试使用它们时将其重新带回。


a:通常是这样。如果您在进程之间共享内容,则它可能映射到相同的物理地址。例如,共享内存,内核代码和数据,动态库等。

2020-06-02