【コピーオンライト】

コピーオンライト(CoW) とは?

最終更新:
💡 書き込むそのときまで、コピーは先送り

データを複製するとき、まず同じ実体を共有し、書き換えが必要になった部分のコピーを後から作る仕組み。変更をほかの利用者から分離しながら、不要な複製を減らす。

📌 このページのポイント
コピーオンライト:共有から必要な複製へ 例:Linuxのforkで私有メモリを共有① まだ書き込まない親プロセス子プロセス共有ページA② 子が共有中のページへ書き込む親プロセス子プロセス元のページA子のコピーA′複製子の変更は親の私有メモリへ反映しない
左右の矢印は各プロセスが参照するページ、縦の矢印はページの複製を示す。共有中の私有ページに子が書く例で、更新を共有するMAP_SHAREDは対象外。データ全体ではなく、必要な部分を複製する。
ひよこ ひよこ
コピーオンライトって何?
ペンギン先生 ペンギン先生
複製したいデータを、最初は同じ実体で共有し、書き換えが必要になった部分を後からコピーする考え方だよ。読むだけなら不要なコピーを作らずに済むんだ。
ひよこ ひよこ
どこで使うの?
ペンギン先生 ペンギン先生
Linuxのfork()では、親子の私有メモリを最初から全部コピーせず、CoWでページを共有するよ。ページテーブルや子プロセスの管理情報を作る処理は必要で、プロセス生成が無コストになるわけではないんだ。
ひよこ ひよこ
子が書き込むと、親の値も変わる?
ペンギン先生 ペンギン先生
私有メモリなら、子の変更は親の値へ反映しないよ。たとえば共有していたページAに子が書くと、子用のコピーを作って書き換える。親は元のページを使い続ける。共有を目的にした領域とは区別しよう。
ひよこ ひよこ
書き込みはどう見つけるの?
ペンギン先生 ペンギン先生
Linuxのメモリ管理では、書き込みを検出するページフォールトを使ってCoWを処理するよ。フォールトは必ずプログラムの異常というわけではない。ただし、不正な読み取り専用領域への書き込みまで許可する仕組みではないんだ。
ひよこ ひよこ
弱点や、ほかの使い道は?
ペンギン先生 ペンギン先生
共有中の部分を更新するとコピーなどの処理が増えるよ。Redisがfork()で保存している間に更新が多いと、複製されたページでメモリが増える。BtrfsのスナップショットにもCoWの発想が使われるけれど、扱う単位や実装はメモリとは異なるんだ。
もっと詳しく知りたい人へ

fork後の書き込みはすべてコピーされますか?

説明は私有のメモリ領域についてです。MAP_SHAREDのように共有を目的にした領域は、親子からの更新を共有するため、同じ扱いではありません。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「コピーオンライト」って出てきたら「書き換えるときまでコピーを先送りする仕組み」と思えればだいたいOK!
📖 おまけ:英語の意味
「Copy-on-Write」 = 書き込み時にコピー
💬 Copy(複製)をOn Write(書き込みが起きたとき)に行うから、この名前だよ。略して「CoW」と書かれることもあるね

参考資料

← 用語集にもどる