gpt4 book ai didi

fork 期间写时复制

转载 作者:太空宇宙 更新时间:2023-11-04 01:21:52 24 4
gpt4 key购买 nike

这是我对 fork() 的理解:fork() 系统调用从父进程中分离出一个子进程。子进程的核心镜像(地址空间)是父进程的精确副本。地址空间包含:

  1. 堆栈。
  2. 文本段(包含程序)。
  3. 数据段(包含变量)。

但是直到其中一个进程(父进程或子进程)开始写入其地址空间时,复制才真正完成。只有这样, child 才会被分配一个单独的地址空间。

我写了一个程序来测试我的理解,结果显示我可能遗漏了一些东西:

#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>

int main()
{
pid_t pid;
pid=fork();
int a=5;

if(pid<0){/*error condition*/
printf("Error forking\n");
}

if(pid==0){/*child process*/
printf("Child process here\n");
a=a+5;
printf("The value of a is %d\n",a);
printf("The address of a is %p\n",&a);
printf("Child terminated\n");
exit(getpid()); /*child terminates*/
}
else{/*parent process*/
printf("Parent blocked\n");
wait(NULL); /*waiting for child process to exit*/
printf("Parent process here");
printf("The value of a is %d\n",a);
printf("The address of a is %p\n",&a);
printf("parent terminated");
}

}

下面是上面程序的输出:

Parent blocked
Child process here
The value of a is 10
The address of a is 0x7ffe4c37b1a0
Child terminated
Parent process hereThe value of a is 5
The address of a is 0x7ffe4c37b1a0

有人可以向我解释为什么两个 a 的地址相同吗?由于子进程更新了它的变量,它应该被分配一个单独的内存位置。

最佳答案

不是这样。

child 和 parent 看到的地址是相对于他们自己的地址空间,而不是相对于整个系统。

操作系统将每个进程使用的内存映射到物理(或虚拟)内存中的不同位置。但该映射对进程不可见。

关于 fork 期间写时复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40545577/

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