web-dev-qa-db-ja.com

コピーオンライトとは何ですか?

コピーオンライトとは何か、それが何に使われているのか知りたいのですが? 「コピーオンライト配列」という用語は、Sun JDKチュートリアルで何度も言及されていますが、その意味がわかりませんでした。

103
hhafez

私は自分の説明を書くつもりでしたが、 このウィキペディアの記事 はほとんどそれを要約しています。

基本概念は次のとおりです:

コピーオンライト(「COW」とも呼ばれる)は、コンピュータープログラミングで使用される最適化戦略です。基本的な考え方は、複数の呼び出し元が最初は区別できないリソースを要求する場合、同じリソースへのポインターを与えることができるということです。この関数は、呼び出し元がリソースの「コピー」を変更しようとするまで維持できます。その時点で、真のプライベートコピーが作成され、変更が他のすべてのユーザーに表示されなくなります。これはすべて、発信者に対して透過的に行われます。主な利点は、呼び出し元が変更を加えない場合、プライベートコピーを作成する必要がないことです。

また、ここにはCOWの一般的な使用のアプリケーションもあります:

COWの概念は、Microsoft SQL Server 2005などのデータベースサーバーでのインスタントスナップショットのメンテナンスにも使用されます。インスタントスナップショットは、データのアンダーレイが更新されるときにデータの変更前のコピーを保存することにより、データベースの静的ビューを保持します。インスタントスナップショットは、テストの使用または瞬間依存のレポートに使用され、バックアップの置き換えには使用しないでください。

119
Andrew Hare

「書き込み時にコピー」とは、多かれ少なかれそれがどのように聞こえるかを意味します。誰もが同じデータの単一の共有コピーを持ちます書き込まれるまでで、その後コピーが作成されます。通常、コピーオンライトは、並行性の問題を解決するために使用されます。たとえば、ZFSでは、ディスク上のデータブロックにコピーオンライトが割り当てられます。変更がない限り、元のブロックを保持します。変更により、影響を受けるブロックのみが変更されました。これは、新しいブロックの最小数が割り当てられることを意味します。

これらの変更は、通常、トランザクションになるように実装されています。つまり、ACIDプロパティがあります。これにより、すべての更新がアトミックであることが保証されるため、並行性の問題がいくつかなくなります。

51
Charlie Martin

Copy-on-Writeで同じ答えを繰り返さない。 アンドリューの答えチャーリーの答え はすでにそれを非常に明確にしていると思います。この概念がどの程度広く使用されているかを言及するために、OSの世界から例を挙げます。

fork()またはvfork()を使用して、新しいプロセスを作成できます。 vforkは、コピーオンライトの概念に従います。たとえば、vforkによって作成された子プロセスは、データとコードセグメントを親プロセスと共有します。これにより、分岐時間が短縮されます。 execの後にvforkを実行する場合は、vforkを使用することが期待されています。したがって、vforkは親とデータおよびコードセグメントを共有する子プロセスを作成しますが、execを呼び出すと、子プロセスのアドレススペースに新しい実行可能ファイルのイメージをロードします。

9
Shamik

別の例を提供するために、 Mercurialはcopy-on-writeを使用します を使用して、ローカルリポジトリのクローン作成を本当に「安い」操作にします。

原則は他の例と同じですが、メモリ内のオブジェクトではなく物理ファイルについて説明している点が異なります。最初は、クローンは複製ではなく、オリジナルへの ハードリンク です。クローン内のファイルを変更すると、新しいバージョンを表すコピーが書き込まれます。

6
harpo

私は this PHPのzvalに関する良い記事を見つけました。

コピーオンライト(略して「COW」)は、メモリを節約するためのトリックです。ソフトウェアエンジニアリングでより一般的に使用されます。これは、シンボルに書き込むときにPHPがメモリをコピーする(または新しいメモリ領域を割り当てる)ことを意味します(このシンボルが既にzvalを指している場合)。

2
Amir Shabani

また、Ruby 'Enterprise Edition'でもメモリを節約するためのきちんとした方法として使用されます。

0
Chris