blog

博客

View on GitHub

写时复制(copy-on-write)

linux中的copy-on-write

当调用fork()系统调用创建一个子进程时,Linux并不会为子进程创建新的物理内存空间,而是公用父进程的物理内存。这是因为Linux的内核开发者觉得,调用者调用fork()系统调用后会立刻调用exec()系统调用执行新的程序,这样旧的物理内存内容就没有什么作用了(因为新的程序与旧的程序完全没有关联),所以为子进程复制父进程的物理内存内容是一件徒劳无功的事情。

所以Linux的做法就是:父子进程共用同一物理内存。把共用的物理内存设置为只读,因为读操作不会改变内存的内容,所以对于父子进程都是允许的。而当父子进程其中一个进行写操作时,因为内存被设置为只读,所以CPU会触发 “page fault” 的错误,从而调用内核的do_page_fault()函数。而do_page_fault()函数又会调用do_wp_page()函数去进行复制父进程内存的内容。

PHP变量的copy-on-write


<?php   //例一
    $foo = 1;
    $bar = $foo;
    echo $foo + $bar;  // 输出2
    echo $foo += $bar; // 输出2

这段代码从内存分析 $foo = 1;时,分配一块内存给$foo变量,里面存储一个,然后因为$bar = $foo;, 此时$bar 完全等于$foo, 两者指向同一块内存,可以省去分配内存和管理内存的开销。