在 Linux 系统中,调用 fork
系统调用创建子进程时,并不会把父进程所有占用的内存页复制一份,而是与父进程共用相同的内存页,而当子进程或者父进程对内存页进行修改时才会进行复制 —— 这就是著名的 写时复制
机制。
下面我们将分析 Linux 写时复制(Copy On Write)
机制的原理。
虚拟内存与物理内存
进程的内存可分为 虚拟内存
和 物理内存
。
物理内存
:就是电脑安装的内存条,如果电脑安装了2GB的内存条,那么系统就用于 0 ~ 2GB 的物理内存空间。虚拟内存
:虚拟内存是使用软件虚拟的,在 32 位操作系统中,每个进程都独占 4GB 的虚拟内存空间。
应用程序使用的是 虚拟内存
,比如 C 语言取地址操作符号 &
所得到的地址就是 虚拟内存地址
。而 虚拟内存地址
需要映射到 物理内存地址
才能使用,如果使用没有映射的 虚拟内存地址
,将会导致 缺页异常
。
虚拟内存地址
映射到 物理内存地址
如下图所示: