gpt4 book ai didi

c - 做 fork 时有趣的 parent 和 child 的行为

转载 作者:行者123 更新时间:2023-12-04 12:11:44 24 4
gpt4 key购买 nike

谁能解释一下下面程序的输出。为什么我为 parent 和 child 获得相同的 &a 值。

它们必须具有不同的物理地址。如果我认为我正在获取虚拟地址,那么它们怎么可能具有相同的虚拟地址,因为据我所知,每个物理地址都唯一绑定(bind)到虚拟地址。

#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;
}

最佳答案

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

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

each physical address is uniquely bound to virtual address

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

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

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

关于c - 做 fork 时有趣的 parent 和 child 的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13335344/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com