Linux写时复制(copy-on-write)

Linux写时复制(copy-on-write)

fork()函数创建一个子进程。

第一代Unix系统实现了一种傻瓜式的进程创建:当执行fork系统调用时,内核复制父进程的整个用户空间并把复制得到的那一份分配给子进程。这种行为时非常耗时的,因为它需要完成以下几项任务:

  • 为子进程的页表分配页面

  • 为子进程的页分配页面

  • 初始化子进程的页表

  • 把父进程的页复制到子进程对应的页中

这种创建地址空间的方式涉及到许多内存访问,消耗许多CPU周期,并且完全破坏了高速缓存中的内容。在大多数情况下,这样做是毫无意义的,因为许多子进程是通过装入一个新的程序开始他们的运行,完全丢弃了所继承的地址空间。

写时复制(copy-on-write)是一种可以推迟甚至避免复制数据的技术。内核此时并不是复制整个进程空间,而是让父进程和子进程共享同一个副本。只有在需要写入的时候,数据才会被复制,从而使父进程、子进程拥有各自的副本。也就是说,资源的复制只有在需要写入的时候才进行,在此之前以只读方式共享。这种技术使得对地址空间中的页的复制被推迟到实际发生写入的时候。有时共享页根本不会被写入,例如,fork()后立即调用exec(),就无需复制父进程的页了。fork()实际开销就是复制父进程的页表以及给子进程创建唯一的PCB。这种优化可以避免复制大量根本就不会使用的数据(地址 空间里常包含数十兆字节的数据)

==============END==============

你可能感兴趣的:(Linux写时复制(copy-on-write))