「仮想記憶管理」。ちょっと格好良い響きの言葉ですよね。
コンピュータにおけるプログラムを管理するための仕組みを「記憶管理」と呼び、その中の方式の一つとして「仮想記憶管理」があります。
今回は「仮想記憶管理」の仕組みと代表的な方式である「ページング方式」に関して解説します!
メモリの記憶管理とは?
突然ですが、主記憶装置(※この記事ではメモリと呼びます)の役割とは何でしょうか?
ざっくり言うとそれは「プログラムを実行する前に格納しておく場所」となります。
コンピュータはCPUでデータを計算して、命令を実行しますが、その前のデータや命令を主記憶に格納しておきます。メモリに格納することで、高速で複雑な処理を可能としております。この方式のことを「プログラム内蔵方式」(ノイマン型コンピュータ)と呼びます。
プログラムのサイズには大小あるので、プログラムを格納した際にメモリが使う量はプログラムによって違ってきますが、現在のコンピュータは並行してプログラムを走らせるので(マルチタスク)、何も考えずに全てのプログロムをメモリに読み込んでいたら、メモリは直ぐにいっぱいになってしまいます。
メモリは価格も高く、容量も限られているので、このメモリの容量を効率的に使用するために、OSは「記憶管理」を行っています。
この記憶管理ですが、二つの種類があります。それが、「実記憶管理」と「仮想記憶管理」です。
「メモリの記憶管理」と「実記憶管理」の詳細を以下の記事で解説してますので、併せて読んでみてにしてください。
仮想記憶管理とは?
では、本題の「仮想記憶管理」の説明に入っていきましょう。
実記憶管理は主記憶(メモリ)の容量が不足した際にプログラムを補助記憶(HDDやSSDなど)に「移動」して「メモリを空ける」ことを実施していました。
ただ、コンピュータで実行するプログラムのサイズや数は年々大きくなっているため、実記憶管理でメモリを効率的に使うには限界があります(移動だけでは解決できない)。
そこで、補助記憶領域の一部を主記憶であるかのように見せかけて、実際の主記憶(メモリサイズ)よりもずっと大きな記憶領域を「仮想的に作り出す」ことを実現しております。
物理的には実記憶(メモリ)と補助記憶(HDDやSSD)と分けれているのですが、プログラムを扱う空間としては一つに見えます。
最近のコンピュータはメモリを4GBや8GBを積んでいるのが主流ですが、HDDは500GBとか1TBとかの容量がありますので、仮想記憶容量としてはかなり大きく使えることが分かります。勿論全部の容量を使う訳では無く、動的にOSが割当てたりします。補助記憶の数GB程度を使っていると思います。
上の図の例だと仮想記憶としては、「主記憶装置の8GB+補助記憶装置の8GB = 16GB」の容量を使えることになりますね。
では、仮想記憶はあくまでも仮想なので、実際は物理的な記憶装置内のデータの場所と仮想記憶領域の場所を紐付けていく必要がありますよね。
その紐付けとデータのデータの移動の代表的な方式として次の「ページング方式」があります。
ページング方式とは?
仮想記憶管理において、仮想メモリと主記憶、補助記憶とのデータを処理する、いわゆる「メモリ割り当て」を行う方法には「ページング方式」と「セグメント方式」があります。二つの方式はメモリの効率性と複雑さが違うのですが、ここではWindowsでも採用されているシンプルな方式であるページング方式に関して詳細に説明します。
ページング方式は、主記憶と補助記憶をそれぞれ決まった大きさのページ(固定長)に分割し、ページングテーブルで対応付けて管理する方法です。
処理に必要なページを動的に主記憶(メモリ)に割り当てますので、限られた容量のメモリを効率的に使用することができます。
メモリの動的な割り当ての処理を「ページング」と呼びますがページングにおいて、「ページフォールト、ページアウト、ページイン」と呼ばれる3つのキーワードがあります。
では、仮想記憶管理の順を追って見ていきましょう。
まず、プログラムは大きな容量の「仮想記憶」に読み込まれます。実際は仮想記憶に読み込んだ段階で主記憶装置と補助記憶装置にそれぞれのデータが分かれて格納されます。
仮想記憶上のデータがどっちの物理的な記憶装置にあるかは「ページテーブル」と呼ばれる仮想記憶上のアドレスと主記憶装置のアドレスを紐づけたテーブルで管理されています(下図参照)。
続いてページング処理です。コンピュータの処理において、主記憶(メモリ)上に必要なページがないことを「ページフォールト」と呼びます。ページフォールト状態の場合、メモリから補助記憶へページを追い出すことを「ページアウト」と呼びます。
そして、必要なページを補助記憶からメモリに呼び出すことを「ページイン」と呼びます。これらの処理を随時行うことで、プログラムをメモリ上で実行しています。
ページングは次の図のような流れで実行されていきます。
ページングの中でページアウトするページを決定する方式としては次のようなものがあります。
ページアウトの方式
- FIFO(ファイフォ:First-In First-Out)
⇒ ページが読み込まれた順番にページアウトする - LRU(エルアールユー:Least Recently Used)
⇒ 最後に参照された時間が古い順番(使われていない)にページアウトする - LFU(エルエフユー:Least Frequently Used)
⇒ 参照された頻度(回数)が少ない順番にページアウトする
まとめ
今回は大容量のプログラムや複数プログラムをコンピュータ上で扱うために必要な「仮想記憶管理」に関して解説しました。
主記憶装置(メモリ)だけでなく、補助記憶装置(HDDやSDD)を使うことで扱える容量を増やし、データを裏で管理する仕組みとしてページング方式が活躍していますね。
ページング方式のページアウトするアルゴリズムもいくつかあることも覚えておきましょう!
何気なく使っているコンピュータは凄い仕組みで動いていることに気付かされますね。
尚、メモリを効率的に利用するためにメモリをキレイにするメモリコンパクションやガベージコレクションといった仕組みも以下記事で解説してますので、併せて読んでみてください。
以上です!
参考URL) うさぎでもわかる計算機システム(基本情報対応) Part19 仮想記憶とページング(4GBの壁の正体は?)