2009-03-10 35 views
76

コピーオンライトとは何ですか? 「コピーオンライトアレイ」という言葉は、Sun JDKのチュートリアルで何回も言及されていますが、意味が理解できませんでした。コピーオンライトとは何ですか?

答えて

88

私は自分の説明を書くつもりでしたが、this Wikipedia articleはそれをかなり要約しています。ここで

は、基本的な概念です:

コピー・オン・ライトは、(時には「COW」と呼ばれる)コンピュータ・プログラミングで使用される最適化戦略です。基本的な考え方は、複数の発信者が最初は見分けがつかないリソースを求める場合、同じリソースへのポインタを与えることができるということです。この機能は、発信者がリソースの「コピー」を変更しようとするまで保持されます。その時点で、真のプライベートコピーが作成され、変更が他の人に見えなくなります。このすべては、発信者に対して透過的に行われます。主な利点は、発信者が何も修正を加えない場合、プライベートコピーを作成する必要がないことです。また、ここで

は、COWの一般的な使用のアプリケーションです:

COWの概念は、2005年インスタントスナップショットを保存するMicrosoft SQL Serverなどのデータベースサーバー上でインスタントスナップショットの維持にも使用されていますデータの更新が更新されたときに、事前に変更されたデータのコピーを保存することによって、データベースの静的ビューを作成します。インスタントスナップショットは、使用状況やモーメント依存レポートのテストに使用されるため、バックアップの置き換えには使用しないでください。全員が同じデータの単一の共有コピーを持ってそれはを書かれて、その後、コピーが作成されるまで:

+0

これは何のために使用されますか? – hhafez

+0

何かに対しては、通常の配列が使用されますが、状況によっては、このタイプの戦略の結果がより最適化されます。 –

+1

@hhafez:Linuxは、 'fork()'を実装するために 'clone()'を使うときにそれを使います。親プロセスのメモリは子プロセスのためにCOWされています。 –

39

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

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

+1

変更を行った場合、他の人は新しいコピーをどのように通知しますか?彼らは間違ったデータを見ないでしょうか? – powder366

+7

@ powder366 - コピーが実際に作成されたときに変更を加えると、間違ったデータは表示されません。たとえば、 'A'というデータブロックがあります。 '1''、' 2'、 '3'、' 4'はそれぞれコピーを作成して読み込みを開始しますが、 "Copy on write"システムでは何もコピーされません。プロセス '3'は' A'のコピーを変更したいので、プロセス '3'は実際には' A'のコピーを作り、 'B'という新しいデータブロックを作ります。プロセス「1」、「2」、「4」は依然としてブロック「A」を読み取り中であり、プロセス「3」は現在「B」を読み取っている。 – Puddler

+0

@Puddler 'A'で変更が加えられた場合どうなりますか?すべてのプロセスは更新された情報または古い情報を読み込みますか? – Developer

6

私はコピーオンライトについて同じ回答を繰り返さないものとします。私はAndrew's answerCharlie's answerは既にそれを非常に明確にしたと思います。私はあなたにOSの世界からの一例をあげるが、このコンセプトがどれくらい広く使われているかを言及するだけである。

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

+2

"vforkはコピーオンライトの概念に従います"。この行を変更することを検討してください。 'vfork'はCOWを使用しません。実際に子供が何かを書くと、それは未定義の振る舞いを引き起こし、ページのコピーはできません!実際には、あなたはもう一方の方法が丸みを帯びていると言うことができます。 COWは、何かが共有空間で変更されるまで 'vfork'のように動作します! –

+0

パヴァンに完全に同意します。 "vforkはコピーオンライトの概念に従います"という行を削除します。今ではCOWが最適化としてフォークで使用されているため、vforkのように動作し、子プロセスの親データのコピーを作成しません。 –

1

これはRuby 'Enterprise Edition'でもメモリを節約するために使用されています。

+2

私は彼が "その意味で使われています。 – spydon

6

もう1つの例を提供するには、クローン作成ローカルリポジトリを実際に「安い」操作にするためにMercurial uses copy-on-writeを入力してください。

原則は他の例と同じですが、メモリ内のオブジェクトではなく物理ファイルについて話している点が異なります。最初は、複製は複製ではなく、元の複製にhard linkです。クローン内のファイルを変更すると、新しいバージョンを表すコピーが作成されます。

1

私もCOWを述べたPHP、中にzval程度this良い記事を見つけました:(「COW」と略す)ライトオン

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

関連する問題