仮想記憶への応用
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/06/17 01:47 UTC 版)
「コピーオンライト」の記事における「仮想記憶への応用」の解説
コピーオンライトは主に仮想記憶方式のオペレーティングシステムで使用されている。例えば、プロセスのコピーを作成 (fork) するとき、書き換えることのないメモリページは、両方のプロセス(元のプロセスと生成されたプロセス)で共用し、書き換える可能性のあるメモリページは、新たなメモリページを割り当ててコピーを作成する必要がある。ここでコピーオンライトが使用される。一方のプロセスがメモリを更新すると、オペレーティングシステムのカーネルがその操作を横取りし、メモリのコピーを作成してメモリ内容の更新が他方のプロセスから見えないようにする。 他にも、calloc()関数で使われている。calloc()はメモリ領域をゼロで初期化して確保する(malloc参照)。このためにゼロで初期化されたページをシステムに1つ用意しておき、calloc()で確保した領域にはこのページをマッピングしてコピーオンライト機能を使用する。このようにするとcalloc()呼び出し直後はたとえ何ページのメモリが必要でも物理的には1ページしか使われておらず、その領域の内容を更新しようとしたときに初めて個別のコピーが作成される。このような最適化はページサイズ以上の大きなアロケーションでのみ使用されるのが一般的である。 コピーオンライトは、MMUに対してプロセスのアドレス空間のある領域がリードオンリーであると通知することで実現する。その領域にデータを書き込もうとしたとき、MMUは例外を発生し、それをカーネルが処理する。カーネルは新たな物理ページを確保して、書き込みが行われた領域のマッピングを変更して、その新たな物理ページに対応させる。 COWの主な利点は、メモリを空間的にまばらに利用する可能性にある。データを格納したときだけ物理メモリ使用量が増えるので、若干メモリ使用量が増えるが非常に効率的なハッシュテーブルを実装することができる。しかし、そのような使い方をすると仮想空間を使い切ってしまう危険性もある(ハッシュテーブルに使われる仮想アドレス空間の領域はマッピングされる物理ページはまばらだが、他の用途に空間を利用できない)。カーネルレベルでのCOWの主な問題点はその複雑さにあるが、そのような懸念はスワップ方式などのもっと基本的な部分も同じである。カーネル自身がコピーオンライト制御されているページに書き込みを行った場合、やはりコピーが必要となる(訳注:例えばシステムコールの結果をユーザー空間に書き込む場合など。実際には書きこみの前にコピーオンライトかどうかをチェックし、必要に応じてコピー作成後に書き込みを行う)。 COWはカーネル以外でも、ライブラリやアプリケーションやシステムコードなどでも使われる。C++のStandard Template Libraryが提供する string クラスはコピーオンライト型の実装が可能な設計になっている。このような領域でのCOWはマルチスレッドコードで問題となる。コピー元のリソースを複数のスレッドで共有するにはロックが必要であり、COWの利点以上のオーバヘッドとなる可能性が高い。
※この「仮想記憶への応用」の解説は、「コピーオンライト」の解説の一部です。
「仮想記憶への応用」を含む「コピーオンライト」の記事については、「コピーオンライト」の概要を参照ください。
- 仮想記憶への応用のページへのリンク