分叉 linux 关于 COW
forking in linux about COW
在linux,因为浪费我知道是COW实现的。但是,在书中说,当 child 在 fork() 之后立即调用 exec() 时,地址 space 永远不会被复制。
但我认为如果child使用exec(),意味着在地址space中创建新的数据或代码还没有被复制。所以当exec()被调用时,地址spaced被复制(Copy on Write),新的数据或代码被写入这里。
我错了吗?为什么 exec() 调用从不复制 parent 的东西?
或者如果child调用了exec(),那么child就自己做一个mm_struct然后在自己的地址space里面写新的数据是新做的吗? (未从 parent 复制)
exec 是 execve 内核调用的库包装器。在 execve 启动之前会有一些堆栈 activity(即使直接调用 execve),因此在 exec 启动与进程上下文断开连接之前,将有一个堆栈块在写入时复制 at-least。
同时,在子进程断开连接之前,父进程将进行大量写入复制。
在linux,因为浪费我知道是COW实现的。但是,在书中说,当 child 在 fork() 之后立即调用 exec() 时,地址 space 永远不会被复制。 但我认为如果child使用exec(),意味着在地址space中创建新的数据或代码还没有被复制。所以当exec()被调用时,地址spaced被复制(Copy on Write),新的数据或代码被写入这里。
我错了吗?为什么 exec() 调用从不复制 parent 的东西?
或者如果child调用了exec(),那么child就自己做一个mm_struct然后在自己的地址space里面写新的数据是新做的吗? (未从 parent 复制)
exec 是 execve 内核调用的库包装器。在 execve 启动之前会有一些堆栈 activity(即使直接调用 execve),因此在 exec 启动与进程上下文断开连接之前,将有一个堆栈块在写入时复制 at-least。
同时,在子进程断开连接之前,父进程将进行大量写入复制。