Linux笔记记录5 写时拷贝
首先可以先看一下《LINUX内核设计与实现》中相关内容:
传统的fork()系统调用创建子进程会把所有的资源也复制给新的进程。这种实现效率低下,因为他拷贝的数据也许可以共享。
如果新进程打算立即执行一个新的映像那么所有的拷贝都将前功尽弃。
Linux的fork()使用写时拷贝页实现。
所谓的写时拷贝,是fork()时并不复制整个进程地址空间,而是先让父子进程共享同一拷贝,只有需要写入即才会复制一份,使各个进程拥有自己的一份拷贝,在此之前以只读方式共享。它使地址空间上页的拷贝推出到发生写入的时候。
此时fork()后接exec()就无需再拷贝多余的不会使用的数据。
fork()实际上的开销来自于复制父进程的页表以及给子进程创建唯一的进程描述符。
关于fork()相关的点好像之前的某篇博文写过了=。=不过不够完善吧 有空回去改改
写时拷贝技术内核只为新生成的进程创建虚拟空间结构,他们复制于父进程的虚拟空间结构,但不分配物理内存。
虚拟地址空间上有:正文段、数据段、堆、栈。当父子进程中有更改相应段的行为时,将为子进程分配相应段的物理空间
图片参考网上的资料