TL;DR

複数のプロセスでメモリページを共有しておき、どれかが更新しようとしたときに初めてそのページをコピーする手法。fork でプロセスを作るときなどに使われる。

なぜ必要か

Wikipedia によると、コピーオンライトは、データの複製を実際に書き込みが起きるまで遅らせるリソース管理の手法である。書き込みがなければ複製の処理時間もメモリも使わずに済むので、読み取りが中心の処理では実行速度を上げられる。

例

fork にコピーオンライトを採用した場合、親プロセスと子プロセスは同じメモリページを共有する。どちらかのプロセスがあるメモリページの内容を更新しようとすると、OS はそのページを新しい場所にコピーする。これにより、各プロセスがそれぞれのコピーを持つようになる。

メモリ以外にも、ファイルシステムのスナップショットでは、変更されたブロックだけを新たにコピーする。APFS や ReFS は、この仕組みでファイルのコピーを一瞬で終わらせられる。QEMU などの仮想ディスクでは、複数の仮想マシンが同じディスクイメージを共有する。

注意点

プロセスがメモリの大部分を更新すると、OS はほとんどのページをコピーしなければならない。

既存のデータを更新するときは、一時的に新旧両方のデータが必要になるので、空き容量が足りないとエラーになることがある。マルチスレッドの環境では、共有のためのロックが必要になり、かえってオーバーヘッドが大きくなる場合もある。

関連

出典