この記事は、仮想記憶 からの続編です。
この記事は、絵でわかる プログラムとは何か(4)~マルチタスクとメモリ~ の一記事です。
この記事のポイント
- マルチタスクOSでは、メモリの枯渇を避けるため、以下のようなメモリ管理を行う。
- 不要になったメモリ上のデータを上書き可能にするガベージコレクション
- メモリのフラグメンテーション(断片化)を解消するメモリコンパクション
- メモリ上のあまり使われていないデータをストレージへ移すメモリスワッピング
- メモリスワッピングのデータ単位には、ページとセグメントがある。
- 仮想アドレスと物理アドレスの変換は、メモリスワッピングも絡み複雑になるが、MMUで高速化する。
ガベージコレクション
物理アドレスが重ならないように、複数のプログラムをロードしていくと、メモリ上のまとまった空き領域はすぐに足りなくなるかもしれません。
それをできるだけ回避するため、OSや言語処理系プログラムは、不要になったメモリ上のデータを、どんどん解放します。(上書き可能な状態にします)。
これをガベージコレクションと言います。
ガベージ(garbage)は「ゴミ」、コレクション(collection)は「収集」という意味で、ガベージコレクションは、メモリ上のゴミデータ集め(撤去)をイメージして付けられた名称です。
メモリコンパクション
ガベージコレクションを繰り返すと、メモリは、小さなデータ領域と小さな空き領域が混ざり合ってできる断片化(フラグメンテーション)を引き起こしているかもしれません。
仮想アドレスと違い、物理アドレスはひと続きである必要はありませんが、読み書きの効率を考えると、やはりできるだけひと続きのほうが好都合です。
OSは、フラグメンテーションを解決するため、メモリ上の物理アドレスができるだけ一続きになるように、メモリ上のデータを配置し直します。これをメモリコンパクションと言います。
フラグメンテーション(fragmentation)は、破片(fragment)のようになるという意味で、コンパクション(compaction)は、コンパクト(compact)にするという意味です。
メモリスワッピング
しかし、実際のメモリの全領域以上にプロセスが増えてしまうと、どんなに隙間を詰めても、当然、空き領域は足りなくなります。
そこで、メモリ上にある記録(プログラムやデータ)の中から、あまり使われていない記録部分をいったんストレージの”一時保存”専用領域 (ストレージ内のswapファイルなど)に移し、これからロードするプログラムのために、その物理アドレス領域を空き領域に換えるしくみが、OSに取り入れられました。
これをメモリスワッピングと言います。スワッピングの元の英語のswapは、「取り換える」という意味です。あまり使われていない記録部分をいったんストレージに移すことをスワップアウトと言います。

セグメンテーションとページング
メモリスワッピングには、ストレージに移す記録部分の単位として、セグメントとページの2種類があります。
セグメント
セグメントは、実行ファイル形式のセクションのように、中身によって区分けされた記録単位です。セグメント単位で記録部分をスワップする方式をセグメント方式と言います。セグメント方式での仮想アドレスと物理アドレスの対応表をセグメントテーブルと言います。
ページ
それに対してページは、中身に関係なく固定サイズで、通常4,096バイト(アドレスにして12ビット)程度の大きさをとります。このページ単位で記録部分をスワップする方式をページング方式と言います。ページング方式での仮想アドレスと物理アドレスの対応表をページテーブルと言います。

現在のメモリスワッピングは、ページング方式が主流になっています。ただし、メモリスワッピングの方式としてはページング方式でも、セグメントの区分けをアクセス制限や共有のために利用している場合もあります。
メモリ管理ユニット(MMU)
MMUとTLB
MMUは、Memory Management Unit の略で、CPUに付属され、主に仮想アドレスと物理アドレスの変換を、OSと連携して行うハードウェアです。MMUは、TLB(Translation Lookaside Buffer)というページテーブルの一部コピーをキャッシュに持っていて、それを使って高速アドレス変換をします。キャッシュは、レジスタのように、通常のメモリよりも高速にアクセスできるメモリです。さらにMMUは検索アルゴリズムをハードウェア(ワイヤードロジック)で実装しているため、超高速でアドレス変換をします。

ページフォールト
TLBにもページテーブルにも、アクセス先仮想アドレスが存在しない場合、MMUはページフォールトをOSに通知します。ページフォールトが通知された場合、アクセス先データがページアウト(メモリスワッピングでストレージに移されること)されている可能性があります。
ページアウト + ページイン = メモリスワッピング
その場合OSは、ストレージからメモリに対象ページを戻し(ページイン)、その物理アドレスでページテーブルを更新します。
さらに、OSがアクセス先データをページインするときに、メモリの空き領域が不足していた場合は、先に空き領域を作るために他のデータをページアウトします。(メモリスワッピング)
この記事のまとめ
マルチタスクOSでは、メモリの枯渇を避けるため、以下のようなメモリ管理を行っています。
- 不要になったメモリ上のデータを上書き可能にするガベージコレクション
- メモリのフラグメンテーション(断片化)を解消するメモリコンパクション
- メモリ上のあまり使われていないデータをストレージへ移すメモリスワッピング
メモリスワッピングのデータ単位には、ページとセグメントがあり、現在はページ方式のメモリスワッピングが主流です。ただしセグメントは、メモリ領域の権限管理に使われています。
仮想アドレスと物理アドレスの変換は、メモリスワッピングも絡むと複雑になりますが、メモリスワッピングされているかの判定や、メモリスワッピングされていない場合の処理は、MMUで高速化されています。
次は、バスとダイレクトメモリアクセス(DMA) に進みましょう。
この記事は、絵でわかる プログラムとは何か(4)~マルチタスクとメモリ~ の一記事です。
コンピューターのしくみ全体を理解したい場合は、以下の2コースがお勧めです。
日本全国 オンラインレッスン にも対応しています。
知りたいことだけ単発で聞きたい場合は、 オンラインサポート をご利用ください。