Copy On Write机制

一、Linux下的copy-on-write

Linux下的copy-on-write机制是通过常见的进程操作fork()和exec()来完成的

fork is an operation whereby a process creates a copy of itself.

fork是类Unix操作系统上创建进程的主要方法。

  • fork用于创建子进程
  • 所有的Linux的进程都通过init进程或init的子进程fork(vfork)出来的。

exec函数的作用就是:装载一个新的程序(可执行映像)覆盖当前进程内存空间中的映像,从而执行不同的任务。

  • exec系列函数在执行时会直接替换掉当前进程的地址空间

 

 

 

 

 

 

 

Linux下的COW

fork()会产生一个和父进程完全相同的子进程(除了pid)

如果按传统的做法,会直接将父进程的数据拷贝到子进程中,拷贝完之后,父进程和子进程之间的数据段和堆栈是相互独立的。

 

 

 

但是,以我们的使用经验来说:往往子进程都会执行exec()来做自己想要实现的功能。

  • 所以,如果按照上面的做法的话,创建子进程时复制过去的数据是没用的(因为子进程执行exec(),原有的数据会被清空)

既然很多时候复制给子进程的数据是无效的,于是就有了Copy On Write这项技术了

 

  • fork创建出的子进程,与父进程共享内存空间,内存空间中的数据并不会马上复制给子进程。
  • 当父子进程中有更改相应段的行为发生时,再为子进程相应的段分配物理空间。
  • 原理是:fork()之后,kernel把父进程中所有的内存页的权限都设为read-only,然后子进程的地址空间指向父进程。当父子进程都只读内存时,相安无事。当其中某个进程写内存时,CPU硬件检测到内存页是read-only的,于是触发页异常中断,kernel就会把触发的异常的页复制一份,于是父子进程各自持有独立的一份。

posted on 2020-09-06 11:20  ro0ter  阅读(387)  评论(0)    收藏  举报

导航