仮想記憶3

仮想記憶続きです。詳細と管理です。

仮想アドレスから物理アドレスへの変換はMMU(メモリ管理ユニット)というハードウェア装置によって実装されている。これはCPUに内蔵されたモジュールの場合もあるし、外付けでCPUに密結合された別のチップの場合もある。これを動的アドレス変換機構 (DAT : Dynamic Address Translation) と呼ぶ。

オペレーティングシステムは、プログラムの仮想アドレス空間のどの部分を物理メモリに保持するかを決定する。オペレーティングシステムは、MMUが使用する仮想アドレスから物理アドレスへの変換テーブルも管理する。さらに仮想メモリ例外が発生したら、オペレーティングシステムはそれを解決するために物理メモリ領域を確保し、必要なら元の内容をディスクに追い出した上で新たに必要とされている情報をディスクから持ってきて、変換テーブルを更新し、例外発生したソフトウェアの実行を再開する。


多くのコンピュータでは、この変換テーブルは物理メモリに格納されている。従って仮想メモリを参照すると、本来の参照以外に変換テーブルの参照が(変換テーブルの構成によっては複数回)発生する。このアドレス変換による性能低下を低減するため、ほとんどのMMUはよく使われる仮想ページに高速にアクセスできるよう、最近使われた仮想アドレスとそれに対応する物理アドレスを保持しておくテーブルを持っている。

これをトランスレーション・ルックアサイド・バッファ(TLB)と呼ぶ。参照アドレスがTLB内に格納された変換テーブルでカバーされていれば、余分な変換テーブルの参照をせずに、高速に変換を行うことができる。ただしTLBは高価な装置の為テーブルの大きさが限られており、目標の仮想アドレスが見当たらない場合は物理メモリ上の変換テーブルを参照してアドレス変換が行われる。

プロセッサによっては、この一連の処理がハードウェア内で行われる。MMUは物理メモリ上の変換テーブルから必要な変換内容を持ってくるので、ソフトウェア側は余分な処理を必要としない。別の種類のプロセッサでは、オペレーティングシステムの介在が必須である。

TLBに必要な変換内容がない場合、例外が発生し、オペレーティングシステムがTLB内の1つのエントリを必要な変換テーブルの内容と置き換え、当初のメモリ参照を行った命令から実行が再開され、再度TLBを参照して変換を行う。


仮想記憶をサポートするハードウェアの多くはメモリ保護機能もサポートしている。MMUはメモリ参照の種類(リード、ライト、実行)やメモリ参照時のCPUモードによって扱いを変える機能を持っていることもある。

これによってオペレーティングシステムは自身のコードとデータ(例えばアドレス変換テーブルなど)を問題のあるアプリケーションプログラムの不正なメモリアクセスから保護したり、アプリケーションを相互に保護したり、アプリケーション自身の不正動作(例えば自身のコード部分に書き込もうとするなどの動作)から保護したりする






各プロセスの仮想アドレス空間には、そのプロセスが使用するコードやデータが配置される。ページング方式であれ、セグメント方式であれ、仮想アドレス空間内で使用している範囲の管理と制御が仮想記憶機構として必須である。例えば、実行ファイルの内容を仮想メモリ上に配置する領域、コールスタックを配置する領域などがある。

このような領域をセグメントと呼ぶ(セグメント方式のセグメントと似ているが純粋に仮想的なオブジェクトである)。実行ファイルを配置する領域は必ずしも連続ではない。プログラムのコード部分とデータ部分を分離して配置するのが一般的で、前者をテキストセグメント、後者をデータセグメントと呼ぶ。データセグメントと隣接してヒープ領域が配置されることが多く、これをUNIX系システムではBSSと呼ぶ。

各セグメントはマッピングしているオブジェクトが何であるか、その領域へのアクセス権などを属性情報として保持する。

テキストセグメントはファイルシステム上の実行ファイルの一部と完全に対応しており、書き換えられることもない。従って、マッピングしているオブジェクトは実行ファイルであり、アクセス属性は「リードオンリー」となる。スタックやBSSは一時的な存在であるため何かをマッピングしているわけではない。

そこでこれらは匿名ファイル(Anonymous File)をマッピングしているものとして管理される。匿名ファイルをマッピングしているセグメントに対応するページを匿名ページと呼び、これがスワッピングの際にスワップ領域に書き出される。データセグメントは当初は実行ファイルの一部と対応しているが、書き込み可能な属性が設定されている。ページング方式の場合、データセグメント内の内容が更新されたページはページ単位で匿名ページへと属性変更される。

exec()システムコールなどで新たにプロセスの仮想アドレス空間を設定した当初は、基本的にこのような仮想アドレス空間を管理するデータ構造がカーネル内に作成されるだけで、実際の実行ファイルの内容はロードされない。UNIX系システムでは、exec()システムコールからユーザ空間に制御が戻された瞬間にページフォールトが発生し、そこで初めてページ単位に実行ファイルの内容がロードされる(性能向上目的で事前にマッピングを作成する場合もある)。

各プロセスの仮想アドレス空間のアドレス範囲は同じでありオーバーラップしているのが一般的である。これを多重仮想記憶と呼ぶ。MMUは現に実行中のプロセスの仮想空間のみを認識する。コンテキストスイッチでプロセスを切り替える際、MMUに対して仮想アドレス空間の切り替えも指示する必要があるが、その方式はアーキテクチャによって様々である。

同じプログラムを実行するプロセスが複数存在する場合、多重仮想記憶ではそれぞれが同じ仮想アドレスに実行ファイルをマッピングしていながら、それぞれ独立した仮想空間を使用する。

このため、実行ファイルを配置する仮想アドレスはどのプロセスでも同じにすることができ、実行ファイル自体に配置すべきアドレスを格納しておくようになっているのが一般的である。また、それぞれのプロセスが実行ファイルのテキストセグメントをマッピングするのに使う物理メモリは共有することができる。他にもmmapでファイルをマッピングする場合や共有メモリ機能でプロセス間の通信を行う場合、マッピングされる物理メモリが共有される。

なお、アーキテクチャによっては、多重仮想記憶がオーバーラップしていると捉えず、全仮想空間がフラットに並んだ巨大な仮想空間を想定することもある。この場合、仮想空間識別番号が巨大な仮想空間のアドレスの一部と考えられる。もっとも、これは単にモデル化の手法が違うだけで実装に大きな違いがあるわけではない。実際、各ユーザープロセスが自分の仮想空間識別番号以外の仮想空間にアクセスすることはできない。

                           ウィキペディア

仮想記憶2

仮想記憶の続きです。

仮想記憶は、必須ではないものの通常ページング方式を使って実装される。ページングでは仮想アドレスを表すビット列の下位ビット列部分はそのまま物理アドレスの下位ビット列部分として使われる。上位ビット列部分はアドレス変換テーブル(群)のキーとして使用され、それによって実際の物理アドレスの上位ビット部分を得る。

このため、サイズが2の冪乗の仮想アドレス空間の連続したアドレス範囲が、対応する連続な物理アドレス範囲に変換される。そのような範囲で参照されるメモリをページと呼ぶ。ページサイズは512バイトから8192バイト(特に4Kバイト)が一般的であるが、特殊用途として4Mバイトやそれ以上のサイズのページも使われることがある。

オペレーティングシステムは、ページテーブルと呼ばれるデータ構造にアドレス変換テーブル、つまり仮想ページ番号と物理ページ番号のマッピング情報を格納する。

あるページが使用不可とされている場合(物理メモリに対応しておらず、スワップ領域に内容がある場合など)、CPUがそのページ内のメモリ位置を参照しようとしたとき、ハードウェアの機構がオペレーティングシステムに(ページフォールトと一般に呼ばれる)例外を通知する。

これにより実行コンテキストはオペレーティングシステム内の例外処理ルーチンにジャンプする。そのページがスワップ領域にあるなら、そのルーチンは「ページスワップ」と呼ばれる処理を実行して必要なページの内容を物理メモリに読み込む。

ページスワップ操作には一連の段階がある。まず、メモリ上のページを選択する。例えば、最近アクセスされておらず、なるべくならスワップ領域を含む何らかのディスクから読み込まれたままで変更されていないページを選択する(詳細はページ置換アルゴリズムを参照)。

そのページが変更されている場合、その内容をスワップ領域に書き出す。次に必要とされているページ(例外発生時に参照しようとしてた仮想アドレスに対応するページ)の情報を読み込む。

ページの読み込みが完了したら、その物理メモリの内容更新に応じて仮想アドレスから物理アドレスへの変換テーブルを更新する。ページスワップが完了すると、例外処理を完了し、元のプログラムの実行が例外発生箇所から再開されて何事もなかったかのように処理が続行される。

仮想ページに何も割り当てられていないために使用不可となっている可能性もある。そのような場合、未使用(あるいはスワップアウトして未使用にした)物理ページを割り当て、OSによってはその内容をゼロクリアする。ページテーブルはそれに対応して更新され、上述の場合と同様にプログラムが再開される。

                           ウィキペディア

仮想記憶

仮想記憶についてです。


仮想記憶(かそうきおく、Virtual Memory)とは、メモリ管理技法の一種であり、マルチタスクオペレーティングシステムが不連続なメモリ領域をソフトウェア(プロセスなど)から見て連続になるように見せかけるものである。仮想記憶はまた、コンピュータ上に実装されている主記憶よりも大きな記憶領域を仮想的に提供する仕組みを提供する。仮想記憶の仕組みを利用することで、メモリ空間の一部をハードディスク装置等の大容量外部記憶に待避でき、実装メモリ量以上のメモリ空間が利用できるようになる。


仮想的に与えられたアドレスを仮想アドレス (virtual address) または論理アドレス (logical address) といい、実記憶上で有効なアドレスを物理アドレス (physical address) または実アドレス (real address) という。仮想アドレスの範囲を仮想アドレス空間、物理アドレスの範囲を物理アドレス空間という。



仮想記憶の実装には、大きく分けてセグメント方式とページング方式の二種類がある。 一般にページング方式の方がよく使われている。これにより、メモリスワッピング(あるいは匿名メモリページング)と仮想記憶が結びつけられる。メモリスワッピングとは、一次記憶装置内のメモリページを二次記憶装置(のスワップファイルあるいはスワップパーティションと呼ばれる場所)に書き出して、より高速な一次記憶装置を他のプロセスが使えるように解放することである。

「仮想記憶」という用語は「メモリスワッピング」と混同されることが多い。これはMicrosoft Windows系のOSがメモリスワッピングの可/不可を設定する項目を "virtual memory" と称していることも一因と考えられる。実際、Windowsはその "virtual memory" を不可としても、ページング方式と仮想記憶を使用している。


UNIX系システムでもスワップファイルやスワップパーティションなしで仮想記憶を使用することが可能である。従って主記憶装置以上の大きな記憶領域を仮想的に使用できるようにすることは仮想記憶の主な目的ではあるが、本質ではないとも言える。本質は、不連続な物理メモリ領域を連続な仮想メモリ領域にマッピングすることであり、複数のプロセスがそれぞれ固有の連続な仮想メモリ領域を割り当てられる点である。これによって他のプロセスのことを気にせずに動作できる環境が提供されている。そういった意味で、仮想機械がゲストOSに対して提供していることと、仮想記憶がユーザープロセスに提供していることは等価である。


技術的には、仮想記憶を使うことにより、ソフトウェアが動作するメモリアドレス空間のサイズとアドレス範囲は当該コンピュータの物理メモリ領域には必ずしも縛られなくなる。仮想記憶を適切に実装するには、CPU(あるいはそれに付随するデバイス)がオペレーティングシステムに対して仮想メモリを物理メモリにマップする(対応付ける)手段を提供し、主記憶(物理メモリ)に対応していない仮想アドレスにアクセスしたことを検出する手段を提供して必要なデータをスワップインできるようにしなければならない。

CPUの支援なしで仮想記憶を提供することも可能だが、その場合は上述の機能を提供するCPUをエミュレートするだけであって、本質的には同じことである。Adobeの一部のアプリケーションのように、アプリケーションプログラムが自前で仮想記憶機構を持つ例もある。

                          ウィキペディア


要するにおおざっぱにいえば特殊な操作をすれば要領が増すといううことですね。