分叉 - 相同的内存地址?

Ash*_*332 14 c linux fork

这是关于Linux中的C语言.

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

两个进程都打印SAME地址.我以为每个孩子都得到父母记忆的(独立)副本.我需要每个进程都有自己的变量x.我怎么能这样做或者我做错了什么?

pax*_*blo 22

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

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

因此,虽然看起来两个进程对于变量具有相同的地址,但这只是虚拟地址.

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

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


:大多数情况下,这是事实.如果您在进程之间共享内容,它可能会映射到相同的物理地址.例如,共享内存,内核代码和数据,动态库等.

  • 实际上它将全部映射到相同的物理地址,直到发生写时复制. (11认同)

R..*_*R.. 5

如果你停下思考一分钟,就不可能fork在父和子进程中为变量提供单独的地址.您可能已经将地址存储在内存中的任何位置,或者对它们进行哈希处理,或将它们保存到文件或其他任何内容中,然后孩子中依赖这些地址有效的任何内容都会可怕地中断.事实上fork 确实必须创建一个子进程中的虚拟地址空间是相同的父的虚拟地址空间.