メモリを固定サイズのページ単位で管理する仮想記憶の方式。
ページング方式とは、メモリを固定サイズの「ページ」単位で管理する仮想記憶の方式です。仮想空間を同じ大きさのページに区切り、物理メモリも同サイズのフレーム(=枠)に区切ります。
身近な例で考えると、コインロッカーに似ています。どのロッカーも同じ大きさなので、荷物(ページ)はどの空きロッカー(フレーム)にも入れられます。荷物を連続した並びに置く必要はなく、空いている所へバラバラに預けてよいわけです。
上のツールで▶ボタンを押すと、仮想空間とフレームを同サイズに分割し、ページテーブルで対応づけて物理アドレスを求める流れを確認できます。
ページテーブルは、各ページが物理のどのフレームに置かれているかを記録した対応表です。住所録のように「ページ◯はフレーム△にいる」という情報を引けます。
仮想アドレスは「ページ番号」と「オフセット(=ページ内の位置)」に分かれます。変換の手順は次のとおりです。
・① ページ番号で表を引く:そのページがどのフレームにあるかを調べる
・② フレーム番号 × ページサイズ:フレームの先頭の物理アドレスを求める
・③ オフセットを足す:求めた先頭にページ内の位置を足して物理アドレス完成
例えばページ1がフレーム5にあり、オフセットが200なら、物理アドレスは 5 × 1024 + 200 = 5320 です。物理上はバラバラに置かれていても、表さえ引けば正しい場所が分かります。上のツールのSTEP4・5で確認できます。
固定区画方式とページング方式は、どちらも区切って管理しますが、置き方が大きく違います。
| 項目 | 固定区画方式 | ページング方式 |
|---|---|---|
| 配置 | プログラム全体を1区画に連続配置 | 小ページに分け物理上はバラバラ |
| 内部断片化 | 大(区画の余りが大きい) | 小(最後のページの端数のみ) |
| 外部断片化 | 起こりうる | 回避できる |
固定区画はプログラム全体を1つの区画に連続して置くため、区画より小さいと大きな余り(内部断片化)が出ます。一方ページングは小さなページに分けて物理上はバラバラに置けるため、外部断片化を回避でき、内部断片化も最後のページの端数だけに抑えられます。荷物を1台のトラックに丸ごと積むか、小さな箱に分けて空いた棚へ配るか、の違いと考えると分かりやすいです。
固定サイズに分ける理由は、メモリの管理をシンプルにするためです。サイズがバラバラだと、大きなプログラムを入れようとしたとき「どこに置くか」の計算が複雑になり、使われていない隙間(=断片化)が生まれやすくなります。
固定サイズにそろえると、次のメリットがあります。
・空きフレームならどこでも使える:全部同じ大きさなので、どのフレームにどのページを置いても問題ない
・管理が単純:「空きか埋まっているか」だけで管理でき、場所探しの計算が軽い
・外部断片化がゼロ:サイズが合わなくて隙間が生まれる、という現象が起きない
身近な例で考えると、引き出しがすべて同じ大きさのタンスをイメージしてください。どの引き出しも同じなので、何をどこにしまっても取り出しやすく、場所探しで迷いません。一方、大きさがバラバラの引き出しだと「この荷物が入る引き出しはどれか」と探す手間が増えます。
仮想アドレス(=プログラムが使う番地)は、「ページ番号」と「オフセット」の2つに分かれています。オフセットとは「そのページの先頭から何バイト目か」を示す数値です。
変換は3ステップで行われます。
・① ページ番号でページテーブルを引く:「ページ1はフレーム5にある」と分かる
・② フレーム番号 × ページサイズ:フレーム5の先頭アドレスを計算する(例:5 × 1024 = 5120)
・③ オフセットを足す:先頭に「ページ内の位置」を足して物理アドレスが完成する(例:5120 + 200 = 5320)
身近な例で考えると、本棚(フレーム)に冊子(ページ)が並んでいる場面に似ています。「第1冊(ページ1)の200ページ目」を探すとき、目次(ページテーブル)で「第1冊は棚番号5にある」と調べ、棚5の先頭から200ページ進んだ場所を開きます。この仕組みのおかげで、プログラムは物理メモリの実際の場所を知らなくても、自分の番地で正しい内容を参照できます。