复制为该进程分配的每个页面(它是具有堆栈或堆的虚拟内存页面),以便派生的进程能够访问它。
实际上,它并非一开始就被复制,而是将其设置为“写时复制”,这意味着一旦其中一个进程(父级或子级)尝试修改要复制的页面,这样它们就不会对彼此造成伤害,并且仍然可以访问fork()处的所有数据。
例如,将实际可执行文件映射到内存中的代码页通常是只读的,因此会在所有分叉的进程中重用- 它们将不会再次被复制,因为没有人在此处写,只能读等等。不再需要写时复制。
具体来说,fork()如何处理Linux中malloc()的动态分配内存?
复制为该进程分配的每个页面(它是具有堆栈或堆的虚拟内存页面),以便派生的进程能够访问它。
实际上,它并非一开始就被复制,而是将其设置为“写时复制”,这意味着一旦其中一个进程(父级或子级)尝试修改要复制的页面,这样它们就不会对彼此造成伤害,并且仍然可以访问fork()处的所有数据。
例如,将实际可执行文件映射到内存中的代码页通常是只读的,因此会在所有分叉的进程中重用- 它们将不会再次被复制,因为没有人在此处写,只能读等等。不再需要写时复制。