コピー オン ライトとは何か、またその用途について知りたいです。この用語は、Sun JDK チュートリアルで何度か言及されています。
9 に答える
私は自分の説明を書くつもりでしたが、このウィキペディアの記事はほとんどそれを要約しています.
基本的なコンセプトは次のとおりです。
コピー オン ライト (「COW」とも呼ばれる) は、コンピューター プログラミングで使用される最適化戦略です。基本的な考え方は、複数の呼び出し元が最初は区別できないリソースを要求した場合、それらに同じリソースへのポインターを与えることができるということです。この機能は、呼び出し元がリソースの「コピー」を変更しようとするまで維持できます。その時点で、真のプライベート コピーが作成され、変更が他の人に表示されるのを防ぎます。これらはすべて、発信者に対して透過的に行われます。主な利点は、呼び出し元が変更を行わない場合、プライベート コピーを作成する必要がないことです。
また、COW の一般的な使用法を次に示します。
COW の概念は、Microsoft SQL Server 2005 などのデータベース サーバーでのインスタント スナップショットのメンテナンスにも使用されます。インスタント スナップショットは、基になるデータが更新されたときにデータの変更前のコピーを保存することで、データベースの静的ビューを保持します。インスタント スナップショットは、用途のテストや瞬間依存のレポートに使用され、バックアップの代わりとして使用しないでください。
「コピー オン ライト」とは、多かれ少なかれその言葉のように聞こえることを意味します。書き込みが行われるまで、全員が同じデータの 1 つの共有コピーを持ち、その後コピーが作成されます。通常、コピー オン ライトは、同時実行の種類の問題を解決するために使用されます。たとえば、ZFS では、ディスク上のデータ ブロックにコピー オン ライトが割り当てられます。変更がない限り、元のブロックを保持します。変更は、影響を受けるブロックのみを変更しました。これは、最小数の新しいブロックが割り当てられることを意味します。
これらの変更は通常、トランザクションとして実装されます。つまり、ACIDプロパティがあります。これにより、すべての更新がアトミックであることが保証されるため、同時実行の問題が解消されます。
コピーオンライトで同じ答えを繰り返すつもりはありません。アンドリューの答えとチャーリーの答えは、すでに非常に明確になっていると思います。この概念がどれほど広く使用されているかについて言及するために、OS の世界の例を挙げます。
fork()
またはを使用vfork()
して、新しいプロセスを作成できます。vfork は、コピー オン ライトの概念に従います。たとえば、vfork によって作成された子プロセスは、データとコード セグメントを親プロセスと共有します。これにより、分岐時間が短縮されます。exec の後に vfork を実行する場合は、vfork を使用することが期待されます。したがって、vfork はデータとコード セグメントを親と共有する子プロセスを作成しますが、exec を呼び出すと、子プロセスのアドレス空間に新しい実行可能ファイルのイメージが読み込まれます。
別の例を示すために、Mercurialはコピーオンライトを使用して、ローカルリポジトリのクローン作成を本当に「安価な」操作にします。
原則は他の例と同じですが、メモリ内のオブジェクトではなく物理ファイルについて話している点が異なります。最初は、クローンは複製ではなく、元のクローンへのハードリンクです。クローン内のファイルを変更すると、新しいバージョンを表すためにコピーが書き込まれます。
PHP の zval に関する次の良い記事を見つけました。COW についても言及されています。
コピー オン ライト (略して「COW」) は、メモリを節約するために設計されたトリックです。これは、ソフトウェア エンジニアリングでより一般的に使用されます。これは、シンボルがすでに zval を指している場合、シンボルに書き込むときに PHP がメモリをコピーする (または新しいメモリ領域を割り当てる) ことを意味します。
また、Ruby 'Enterprise Edition' でも、メモリを節約するための優れた方法として使用されています。