コピーオンライト(CoW)
コピーオンライトは、コピーを要求された時点では実体を共有し、書き込みが起きた瞬間に初めて複製する遅延戦略です。fork やスナップショットを高速・省メモリにします。
- 1.コピーオンライト(CoW)は、複製要求時はデータを共有し、書き込み時に初めてコピーする仕組みです。
- 2.読むだけなら共有のままなので、複製のコストとメモリを大きく節約できます。
- 3.fork によるプロセス生成、ファイルシステムやVMのスナップショットなどで広く使われます。
コピーオンライトとは
コピーオンライト(Copy-on-Write、CoW) は、「コピーして」と頼まれても すぐには複製せず、実体を共有したままにしておく 戦略です。そして、どちらかが書き込もうとした瞬間 に初めて、その部分を本物にコピーします。
発想の出発点は、「多くのコピーは 作られるだけで、結局書き換えられない」という観察です。読むだけなら全員が同じ実体を見ても問題ありません。だったら 書き込みが実際に起きるまでコピーを遅らせれば、無駄な複製を丸ごと省けます。
CoW は複製のコストを「コピーした瞬間」ではなく「初めて書き込んだ瞬間」へ後ろ倒しします。読み取りしかしない利用者にとっては、複製コストが実質ゼロになります。
仕組み:共有と書き込み時の分岐
メモリにおける CoW は、仮想記憶のページ単位 で動きます(前提は 仮想記憶(ページング))。
- コピー時、新旧どちらも 同じ物理ページ を指すようにする
- そのページを 読み取り専用 に設定する
- どちらかが書き込もうとすると、ハードウェアが ページフォルト を起こす
- OS が割り込み、そのページだけを複製 して書き込み側に専用ページを与える
- 以後、両者は別々の実体を持つ
複製直後(共有・読み取り専用):
プロセスA ─┐
├─▶ [物理ページ X](read-only)
プロセスB ─┘
Bが書き込んだ瞬間:
プロセスA ───▶ [物理ページ X]
プロセスB ───▶ [物理ページ X' のコピー](書き換え可)
ポイントは、書き込まれたページだけ が複製されること。触られなかったページは最後まで共有されたままで、メモリを節約できます。
代表的な使われ方
CoW は OS のあちこちで使われています。
| 用途 | 何を共有するか | 効果 |
|---|---|---|
| fork(プロセス生成) | 親子のメモリ空間 | 巨大プロセスでも一瞬で複製 |
| FS スナップショット | ディスク上のブロック | 瞬時に断面を保存できる |
| VM/コンテナイメージ | ベースイメージ | 多数のインスタンスで土台を共有 |
とりわけ有名なのが fork です。fork はプロセスを丸ごと複製しますが、メモリ全体を即コピーすると非常に重い。そこで CoW により親子はページを共有し、どちらかが書き換えた部分だけを後から分けます。
pid_t pid = fork(); /* この時点ではメモリは共有(CoW)*/
if (pid == 0) {
/* 子が変数に書き込むと、そのページだけ複製される */
}
ファイルシステム(ZFS、Btrfs など)の スナップショット も同じ発想です。断面を取る瞬間はブロックを共有し、その後変更されたブロックだけを新しく書くので、スナップショット作成が一瞬で済みます。
メリットと注意点
利点は明確です。
- 複製が速い:実体をコピーしないので、サイズに関係なく一瞬
- メモリ/容量を節約:書き換えられない部分は共有のまま
一方で、コストが消えるわけではなく 後ろにずれる だけです。
共有していたデータへ初めて書き込む瞬間に、ページフォルトと複製の処理が走ります。複製した分メモリ使用量も増えるため、「fork 直後は軽いのに、子が書き込みを始めた途端にメモリが膨らむ」といった挙動が起こり得ます。CoW は万能ではなく、コストの先送りだと理解しておきましょう。
まとめ
- CoW は、複製要求時は 実体を共有 し、書き込み時に初めてコピー する遅延戦略。
- メモリでは ページ単位 で動き、書き込みを ページフォルト で検知して該当ページだけ複製する。
- fork・スナップショット・VM イメージ など、複製を高速・省メモリにしたい場面で活躍する。
- コストは消えず 書き込み時へ先送り される点に注意。
前提知識は 仮想記憶(ページング)、プロセス生成は プロセスとスレッド も参照してください。
OS Article
コピーオンライト(CoW)を実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
コピーオンライト
比較で見る軸
難易度: intermediate / カテゴリ: OS / タグ数: 4
導入後に効く点
読むだけなら共有のままなので、複製のコストとメモリを大きく節約できます。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- intermediate
- カテゴリ
- OS
- タグ数
- 4
判断チェックリスト
- 自社の用途が「コピーオンライト / メモリ管理」に近いか確認する。
- 強みである「コピーオンライト(CoW)は、複製要求時はデータを共有し、書き込み時に初めてコピーする仕組みです。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。