C 做fork时有趣的父母和孩子行为

C 做fork时有趣的父母和孩子行为,c,operating-system,fork,C,Operating System,Fork,有人能解释一下下面程序的输出吗。为什么父母和孩子的&a值相同 它们必须有不同的物理地址。如果我认为我得到了虚拟地址,那么它们怎么能有相同的虚拟地址,因为据我所知,每个物理地址都唯一地绑定到虚拟地址。 #include <stdio.h> #include <stdlib.h> int main(void) { int pid=fork(); int a=10; if(pid==0) { a=a+5;

有人能解释一下下面程序的输出吗。为什么父母和孩子的&a值相同

它们必须有不同的物理地址。如果我认为我得到了虚拟地址,那么它们怎么能有相同的虚拟地址,因为据我所知,每个物理地址都唯一地绑定到虚拟地址。
#include <stdio.h>
#include <stdlib.h>
int main(void) {


    int pid=fork();
      int a=10;
    if(pid==0)
        {
            a=a+5;
            printf("%d %d\n",a,&a);
        }
        else
        {
            a=a-5;
            printf("%d %d\n",a,&a);
        }
        return 0;
}
#包括
#包括
内部主(空){
int-pid=fork();
INTA=10;
如果(pid==0)
{
a=a+5;
printf(“%d%d\n”,a和a);
}
其他的
{
a=a-5;
printf(“%d%d\n”,a和a);
}
返回0;
}

子进程从父进程继承其虚拟地址空间,即使子进程写入页面后虚拟地址开始引用不同的物理地址。这就是所谓的写时复制(CoW)语义

因此,在父级
中,
映射到某个物理地址。Fork最初只是复制映射。然后,当进程写入
a
时,CoW启动子进程,复制包含
a
的物理页面,更新虚拟地址映射以引用副本,并且两个进程都有自己的
a
副本,位于相同的虚拟地址
&a
,但位于不同的物理地址

每个物理地址都唯一地绑定到虚拟地址

那不是真的。物理内存地址可能未映射,也可能映射到一个或多个进程地址空间中的多个虚拟地址

相反,一个虚拟地址可以映射到多个物理地址,只要这些虚拟地址存在于不同进程的虚拟地址空间中


[顺便说一句,您无法使用
%d
可靠地打印内存地址(这恰好适用于32位x86)。请改用
%p
。此外,
fork
的返回类型是
pid\u t
,而不是
int
]

这是一个很好的答案,但我认为您应该更清楚地说明虚拟:物理映射是M:N——不仅可以将同一个物理地址映射到多个虚拟地址(在一个或多个地址空间中),还可以将同一个虚拟地址映射到多个物理地址(当然,每个地址空间最多只能有一个这样的映射)。后者似乎是这里的混淆点。