C 做fork时有趣的父母和孩子行为
有人能解释一下下面程序的输出吗。为什么父母和孩子的&a值相同 它们必须有不同的物理地址。如果我认为我得到了虚拟地址,那么它们怎么能有相同的虚拟地址,因为据我所知,每个物理地址都唯一地绑定到虚拟地址。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;
#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——不仅可以将同一个物理地址映射到多个虚拟地址(在一个或多个地址空间中),还可以将同一个虚拟地址映射到多个物理地址(当然,每个地址空间最多只能有一个这样的映射)。后者似乎是这里的混淆点。