[パタヘネ:読書メモ]第5章 容量と速度の両立:記憶階層の利用 その3

5.4 仮想記憶



仮想記憶を使う目的は主に2つある

複数プログラム間でメモリを効率よく使用する
主記憶以上のメモリ空間を(仮想的に)プログラムが使用できるようにする



後者は、仮想アドレスと物理アドレスの変換機能と、他プロセスから自プロセスのメモリ空間をアクセスされないための保護機能がある。

基本的に仮想記憶とキャッシュは同じ考え方だけど、歴史的な経緯により用語がそれぞれで異なっている。
キャッシュミスのことは、仮想記憶の世界ではページフォールトと呼ばれる。

ページフォールが起きるとペナルティが非常に大きい(メモリに対してディスクは10万倍くらい遅いから)なので、以下にページフォルトを抑えるかは非常に重要。

仮想記憶上のアドレスと実アドレスを対応付けるための仕組みをアドレスマッピング(またはアドレス変換)と呼ぶ。
また、仮想記憶があると、プログラムのローダは、他のプロセスの事を気にする必要がなくなるため、プログラムを任意の場所にロードできるというメリットがある。

キャッシュの場合、書き込み時の戦略にはライトスルーとライトバックの両方が選択してあったが、仮想記憶の場合は速度差が大きすぎるのでライトスルーは現実的ではない。
なのでライトバック方式が取られる。また、この方式だと連続領域に書き込みが行われる事になるので、ディスクへの書き込み時間が短くなる(ディスクをシークする頻度が相対的に下がるため)。
また、ページに書き込みが行われたかをdirty bitで管理し、変更されていないデータが追い出されたときは、ディスクへの書き込みを行わないようにする。



仮想記憶では、ページ表というものを使って、物理アドレスと仮想アドレスのメモリブロック間の対応付けを管理している。また、この対応表は最近参照されたものを再度参照する可能性が高い(空間的局所性)ので、キャッシュされる。これをTLB(translation-loolaside buffer:アドレス変換バッファ)と呼ぶ。

なので特定のデータが欲しい場合は、まずTLBを検索し、その後ページ表をチェックする事になる。
両者にデータが無ければ、CPUはOSに対してページフォールトの例外を投げる事になる。

仮想記憶の機能として、メモリのアクセス保護がある事を前述したけど、これをOSがサポートするにはプロセッサが以下の3つの機能を持っている必要がある。

実行中のプログラムのレベル(OS,ユーザプログラム)をプロセッサに伝えることが出来る事
    前者のレベルを,カーネルプロセス,スーパーバイザプロセス,エグゼクティブプロセス等と呼ぶ
 
ユーザプロセスが、CPUの情報を読み込みの可能なように行える事
    ここで言うCPUの情報とは、プログラムのレベル、ページ表ポインタ、TLB等を指している。
    上記の情報をWriteするには、スーパーバイザの権限があるときのみに出来る。
 
 
両者2つのレベルを移動できるようにする。
    ユーザモードからスーパーバイザモードへは通常システムコールによって行われ、
    MIPSではsyscall命令がそれに相当する。


上記3つが全てそろって初めて、ユーザプロセスは他プロセスからのメモリアクセスを保護することが出来る。


仮想記憶で問題になるのは、メモリの空きが少ないときにディスク<->メモリ間のデータ移動が頻繁になることである。
これをスラッシング(thrashing)と呼び、パフォーマンスが非常に低下するが、これを低減させる仕組みの1つとしてワーキングセットが有る。
ワーキングセットというのは、有るプロセスが同時に使用するページ郡を纏めたもので、メモリが少ない場合はワーキングセット内のメモリが破棄され内容にコントロールすると、スラッシングの発生を減少させる事ができる。ワーキングセットは大きすぎると、メモリ内に共存できるプロセス数が減るので同時実行性が損なわれる。一方、小さすぎるとこまめなキャッシュアウトが頻発するためページフォールトの頻度が増すので、程よいサイズを保つ事が重要。

関連記事

コメントを残す

メールアドレスが公開されることはありません。