fork() 是否复制父级的所有内存?
Does fork() duplicate all the memory of the parent?
假设我编译 运行 fork() 的教科书示例。
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
int main(void)
{
pid_t pid;
pid = fork();
if (pid == -1)
return 1;
if (pid == 0)
puts("From child process.");
else
puts("From parent process.");
return 0;
}
if (pid == 0)
语句的两个分支的代码是否都到达 fork()
?换句话说,子进程是否包含父进程永远不会执行的代码,反之亦然?或者does/can编译器优化这个?
fork()
重复整个过程。唯一的区别在于 fork()
调用自身的 return 值——在 parent 中它 return 是 child 的 PID,在 child 它 returns 0
.
大多数操作系统使用一种称为写时复制 的技术对此进行了优化。 child 不是复制所有内存,而是共享 parent 的内存。然而,所有的内存页面都被标记为copy-on-write,这意味着如果任何一个进程修改了页面中的某些东西,它会在那个时候被复制并且修改它的进程将被更改为使用副本(和COW原始页面的标志也将被关闭。
有关详细信息,请参阅 fork and copy-on-write 上的维基百科文章。
假设我编译 运行 fork() 的教科书示例。
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
int main(void)
{
pid_t pid;
pid = fork();
if (pid == -1)
return 1;
if (pid == 0)
puts("From child process.");
else
puts("From parent process.");
return 0;
}
if (pid == 0)
语句的两个分支的代码是否都到达 fork()
?换句话说,子进程是否包含父进程永远不会执行的代码,反之亦然?或者does/can编译器优化这个?
fork()
重复整个过程。唯一的区别在于 fork()
调用自身的 return 值——在 parent 中它 return 是 child 的 PID,在 child 它 returns 0
.
大多数操作系统使用一种称为写时复制 的技术对此进行了优化。 child 不是复制所有内存,而是共享 parent 的内存。然而,所有的内存页面都被标记为copy-on-write,这意味着如果任何一个进程修改了页面中的某些东西,它会在那个时候被复制并且修改它的进程将被更改为使用副本(和COW原始页面的标志也将被关闭。
有关详细信息,请参阅 fork and copy-on-write 上的维基百科文章。