Linux fork写时赋值技术(copy-on-write)

Here is the basic concept:

Copy-on-write (sometimes referred to as “COW”) is an optimization strategy used in computer programming. The fundamental idea is that if multiple callers ask for resources which are initially indistinguishable, you can give them pointers to the same resource. This function can be maintained until a caller tries to modify its “copy” of the resource, at which point a true private copy is created to prevent the changes becoming visible to everyone else. All of this happens transparently to the callers. The primary advantage is that if a caller never makes any modifications, no private copy need ever be created.

COW技术初窥:

在Linux程序中,fork()会产生一个和父进程完全相同的子进程,但子进程在此后多会执行exec系统调用,出于效率考虑,linux中引入了“写时复制“技术,也就是只有进程空间的各段的内容要发生变化时,才会将父进程的内容复制一份给子进程

那么子进程的物理空间没有代码,怎么去取指令执行exec系统调用呢?

fork之后exec之前两个进程用的是相同的物理空间(内存区),子进程的代码段、数据段、堆栈都是指向父进程的物理空间,也就是说,两者的虚拟空间不同,但其对应的物理空间是同一个。当父子进程中有更改相应段的行为发生时,再为子进程相应的段分配物理空间。

COW详述:

1.传统的fork()函数

创建一个子进程,子进程和父进程共享正文段,复制数据段,堆,栈到子进程
示意图如下:
Linux fork写时赋值技术(copy-on-write)_第1张图片

2.Linux的fork()函数-写时复制(copy-on-write)

创建一个子进程,内核只为子进程创建虚拟空间,不分配物理内存,和父进程共享物理空间,
当父进程中有更改相应段的行为发生时,才为子进程分配物理空间。

示意图如下:
Linux fork写时赋值技术(copy-on-write)_第2张图片

3.vfork()函数

创建一个子进程,共享父进程的一切。

示意图如下:
Linux fork写时赋值技术(copy-on-write)_第3张图片

4.传统fork与copy-on-write区别

传统的fork函数直接把所有资源复制给新的进程,效率很低下。
写时拷贝在需要写入时,数据才会被复制,没有数据写入时,fork()的开销实际只是复制父进程的页表以及为子进程创建唯一的进程描述符。有数据要写入前,会将将要改变的数据页复制给子进程。

参考

  1. https://www.cnblogs.com/biyeymyhjob/archive/2012/07/20/2601655.html
  2. https://stackoverflow.com/questions/628938/what-is-copy-on-write
  3. https://www.cnblogs.com/shijingjing07/p/7499441.html

你可能感兴趣的:(Linux)