コピーオンライトについて詳しく解説

コピーオンライト(英語の頭字語「COW」でよく呼ばれます) は、コンピューター プログラミングで使用される最適化戦略です。基本的な考え方: 複数の呼び出し元が最初は区別できないリソースを要求した場合、それらの呼び出し元に同じリソースへのポインターを与えることができます。このフィクションは、呼び出し元がリソースの「コピー」を変更するまで維持できます。この時点で、プライベート コピーが作成されます。これにより、変更が他の場所で表示されなくなります。これは呼び出し元に対して透過的に行われます。主な利点は、呼び出し元が何も変更を加えなかった場合、プライベート コピーは決して作成されないことです。

コピーオンライトの主な用途は、オペレーティング システムの仮想メモリです。プロセスがそれ自体のコピーを作成すると、プロセスまたはそのコピーによって変更する必要があるメモリのページがコピーオンライトとしてマークされます。プロセスがメモリ ページを変更すると、オペレーティング システム カーネルが操作をインターセプトしてメモリ ページをコピーし、あるプロセスのメモリへの変更が別のプロセスのメモリに影響を与えないようにします。

もう 1 つの用途は calloc 関数です。これは、物理メモリのページをゼロで埋めることで実装できます。メモリが割り当てられると、返されるページはすべてゼロを参照し、コピーオンライトとしてマークされます。このように、プロセスに割り当てられる物理メモリの量は、calloc によって返されたバッファにデータが書き込まれるまで増加しません。通常、これは大規模なメモリ割り当ての場合にのみ行われます。

コピーオンライトは、プロセスのアドレス空間内の特定のページが読み取り専用であることを MMU に伝えることで実装できます。データがこれらのページに書き込まれると、MMU はカーネルによって処理される例外をスローします。これにより、物理メモリ内に新しいスペースが割り当てられ、書き込まれたページが物理メモリ内のこの新しい場所に対応します。

メモリの使用量を節約できることは、COW の大きな利点です。物理メモリの使用量はデータの保存時にのみ増加するため、非常に効率的なハッシュ テーブルを実装できます。これらは、含まれるオブジェクトよりもほとんど多くのメモリを使用しません。ただし、そのようなプログラムでは仮想メモリ空​​間が不足する可能性があります。ハッシュ テーブルで使用されない仮想ページは、プログラムの他の部分では使用できません。カーネル レベルでの COW の主な問題は、複雑さが増すことですが、その懸念は、ディスクへのページングなど、より基本的な仮想メモリの問題によって引き起こされる問題と似ています。カーネルがこれらのページを書き込むときは、コピーオンライトとマークされているかのようにページをコピーする必要があります。

COW は、カーネルの外部、ソフトウェア ライブラリ、アプリケーション、またはシステムソフトウェアで使用できます。 C++ 標準テンプレート ライブラリによって提供されるStringクラスは、COW実装をサポートするように設計されています。これらのコンテキストにおける COW のリスクの 1 つは、複数のスレッドを含むコードにあり、異なるスレッドのオブジェクトが同じ表現を共有するために追加のロックが必要になる場合に生じます。実装の複雑さによって、COW 技術の想定される利点が打ち消される可能性があります。

BochsQEMU 、UML などの仮想化/エミュレーション ソフトウェアは、仮想ディスク ストレージに COW を使用します。これにより、複数の仮想マシンが同じディスク イメージに基づいている場合に、ディスク容量要件を大幅に削減できます。さらに、ディスクからの読み取りを RAM にキャッシュし、その後の他の仮想マシンの読み取りをキャッシュから処理できるため、パフォーマンスが向上します。

  1. Nuus – afrikaans
  2. The – – – – – ancien anglais
  3. خبر (إعلام) – arabe
  4. ܛܐܒܐ – araméen
  5. Noticia – asturien
  6. Xəbər – azerbaïdjanais

コピーオンライトについて詳しく解説・関連動画

サイエンス・ハブ

知識の扉を開け、世界を変える。