仮想記憶とページ置換え
ページング・セグメント・ページフォールト・スラッシングの用語を見分け、FIFO と LRU でページの置換えを手で追えるようになる。ページサイズから仮想アドレスのビットの内訳も計算できるようになる。
仮想記憶は OS 分野の定番で、なかでも LRU(34回)とスラッシング(16回)は公開過去問で何度も出ています。用語の区別とトレース(手で1つずつ追うこと)の両方が問われるので、ここを押さえると確実に点が取れます。
このレッスンで稽古する(用語チェック・過去問)結論:仮想記憶は「必要な分だけ主記憶に置く」仕組み
仮想記憶は、プログラムに広いアドレス空間(番地の範囲)があるように見せる仕組みです。実際に主記憶(メモリ)に置くのは、いま必要な部分だけです。残りは補助記憶(SSD・HDD)に置いておき、必要になったら主記憶へ運びます。
たとえるなら、**机(主記憶)と本棚(補助記憶)**です。机が狭くても、使う資料だけ机に出し、使わない資料を本棚に戻せば、大量の資料を扱えます。
大事なのは、仮想記憶は主記憶を効率よく使うための仕組みで、速くする仕組みではないことです。本棚まで取りに行く分だけ、かえって遅くなります。
ページング方式:固定長で区切る
ページング方式は、仮想アドレス空間と実記憶(主記憶)を、それぞれ同じ固定長の区画に分けて対応づける方式です。仮想側の区画をページ、実記憶側の区画をページフレームと呼びます。
この方式の効果は、処理に必要なページを動的に(実行中その場で)主記憶へ割り当てるので、主記憶を効率的に使えることです。前のレッスンの断片化(すき間が散らばる問題)も、固定長で区切るので起きにくくなります。
| 用語 | 長さ | 何の単位か |
|---|---|---|
| ページ | 固定長 | 仮想アドレス空間を区切った単位 |
| ページフレーム(フレーム) | 固定長 | 実記憶(主記憶)側を区切った単位 |
| セグメント | 可変長 | プログラムやデータの論理的なまとまり(関数・データ領域など)ごとの単位 |
| セクタ | 固定長 | ディスクの物理的な最小単位(仮想記憶とは関係ない) |
セグメント方式は、ページングとは逆に、意味のまとまりごとに可変長で管理する方式です。試験では「固定長=ページ」「可変長=セグメント」が見分けられれば解けます。
仮想アドレスの内訳:ページ番号+ページ内変位
仮想アドレスは「何番目のページか(仮想ページ番号)」と「そのページの先頭から何バイト目か(ページ内変位)」の2つに分かれます。マンションの「部屋番号」と「部屋の中の位置」のような関係です。
- ページ内変位のビット数 = ページサイズを 2 の何乗で表すか
- 仮想ページ番号のビット数 = 仮想アドレス全体のビット数 − ページ内変位のビット数
計算の手順は下の例題で確認します。
ページフォールトと、そのあとの処理順序
ページフォールトは、アクセスしたページが主記憶に無いときに起きる割込み(CPU に処理を中断させる合図)です。したがって、主記憶に無いページへのアクセスが増えるほど、ページフォールトも増えます。
主記憶に空きが無いときは、次の順番で処理します。
flowchart LR
A["① ページフォールト発生"] --> B["② 置換え対象ページを決定"]
B --> C["③ ページアウト(追い出す)"]
C --> D["④ ページイン(読み込む)"]
- ページアウト:主記憶のページを補助記憶へ書き出して、場所を空けること
- ページイン:必要なページを補助記憶から主記憶へ読み込むこと
「まず気づく(フォールト)→ 誰をどかすか決める → どかす → 入れる」の順です。席が満席の店で、新しい客が来た(フォールト)→ 帰ってもらう客を決める → 帰ってもらう → 案内する、と同じ流れです。
ページ置換えアルゴリズム:誰を追い出すか
空きが無いときにどのページを追い出すかを決めるルールが、ページ置換えアルゴリズムです。試験の主役は LRU で、FIFO・LFU との区別がよく問われます。
| 方式 | 正式名 | 追い出すページ | 判断基準 |
|---|---|---|---|
| FIFO | First In First Out | 最も古くから主記憶にいるページ | 主記憶に入った時刻 |
| LRU | Least Recently Used | 最後に参照されてから最も時間がたったページ | 最後に参照した時刻 |
| LFU | Least Frequently Used | 参照回数が最も少ないページ | 参照回数 |
| 最適(OPT) | Optimal | 次に参照されるのが最も先のページ | 未来の参照(実際には分からない理論上の方式) |
FIFO と LRU の違いは「入った後に使われたかどうかを見るか」です。FIFO は、入ってから何度使われていても、入った順に追い出します。LRU は、使われるたびに「最近使った」扱いに戻ります。
トレースのコツは、**FIFO は「入った順の列」、LRU は「最後に使った順の列」**を書いて追うことです。LRU では、ヒット(主記憶にあった)したページを列の最後尾へ移します。
注意点として、LRU のほうが常に置換え回数が少ないとは限りません。アクセス順によっては、FIFO のほうが少なくなります(例題3)。
スラッシング:入れ替えばかりで仕事が進まない
スラッシングは、仮想記憶方式で多重度(同時に動かすプログラムの数)を上げすぎた結果、主記憶が足りなくなり、ページイン・ページアウトが多発して処理がほとんど進まなくなる現象です。CPU は入れ替えの処理(オーバヘッド=本来の仕事以外の負荷)に追われ、アプリが CPU を使える割合が下がり、応答が急に遅くなります。
たとえるなら、狭い机で同時に5つの仕事をしようとして、資料の出し入ればかりしている状態です。
発生の条件は**「仮想記憶方式」×「多重度が大きい」**です。実記憶方式(仮想記憶を使わない方式)にはページングがないので、スラッシングは起きません。
| 用語 | 意味 | スラッシングとの違い |
|---|---|---|
| スラッシング | ページの入れ替えが多発し、性能が急に落ちる | ― |
| フラグメンテーション | 主記憶の空きが細切れになる(断片化) | 空き領域の形の問題で、入れ替えの多発ではない |
| メモリコンパクション | 細切れの空きを1か所に詰め直す | 断片化への対策 |
| オーバレイ | プログラムを分割し、必要な部分だけ順に主記憶に読み込む | 仮想記憶以前の、プログラム側で行う工夫 |
| ロールアウト/ロールイン | プログラム全体を補助記憶へ退避する/戻す | ページ単位ではなくプログラム単位の退避 |
| ボトルネック | 全体の性能を決めてしまう遅い箇所(一般用語) | 現象名としては一般的すぎる |
仮想ページ番号とページ内変位のビット数
| 仮想ページ番号のビット数 | ページ内変位のビット数 | |
|---|---|---|
| ア | 12 | 20 |
| イ | 16 | 16 |
| ウ | 20 | 12 |
| エ | 24 | 8 |
ア 仮想ページ番号 12ビット,ページ内変位 20ビット
イ 仮想ページ番号 16ビット,ページ内変位 16ビット
ウ 仮想ページ番号 20ビット,ページ内変位 12ビット
エ 仮想ページ番号 24ビット,ページ内変位 8ビット
出典:基本情報技術者試験 科目A免除 修了試験 20260614 実施分 問13
解き方と答えを見る
- ページサイズを 2 の累乗で表す:4k バイト = 4 × 1,024 = 2^2 × 2^10 = 2^12 バイト
- ページの中の位置を表すには 2^12 通りが必要なので、ページ内変位は 12 ビット
- 仮想アドレス空間は 2^32 バイトなので、仮想アドレス全体は 32 ビット
- 仮想ページ番号 = 32 − 12 = 20 ビット(ページの数は 2^20 個)
- この組合せ(20, 12)は選択肢ウ。4k を 2^10 と考えると、ページ内変位を 10 ビットと誤る
答え:ウ(仮想ページ番号 20 ビット、ページ内変位 12 ビット)
LRU:ページ6をアクセスしたとき、どのページが追い出されるか(ページ枠4)
ア 1
イ 2
ウ 4
エ 5
解き方と答えを見る
- 列は「最後に参照した順」で、左ほど古い。ヒットしたページは最後尾へ移す
- 1, 2, 3, 4:空きに順に入る → [1, 2, 3, 4]
- 5:フォールト。左端の 1 を追い出す → [2, 3, 4, 5]
- 2:ヒット。2 を最後尾へ → [3, 4, 5, 2]
- 1:フォールト。左端の 3 を追い出す → [4, 5, 2, 1]
- 3:フォールト。左端の 4 を追い出す → [5, 2, 1, 3]
- 2:ヒット。2 を最後尾へ → [5, 1, 3, 2]
- 6:フォールト。左端の 5(最後の参照から最も時間がたったページ)を追い出す
答え:エ(5)
FIFO と LRU の置換え回数を数える(ページ枠3、アクセス順 1,3,2,1,4,5,2,3,4,5)
| FIFO | LRU | |
|---|---|---|
| ア | 3 | 2 |
| イ | 3 | 6 |
| ウ | 4 | 3 |
| エ | 5 | 4 |
ア FIFO: 3,LRU: 2
イ FIFO: 3,LRU: 6
ウ FIFO: 4,LRU: 3
エ FIFO: 5,LRU: 4
解き方と答えを見る
- 【FIFO】列は「入った順」。ヒットしても列は動かさない
- 1, 3, 2:空きに入る(置換えではない)→ [1, 3, 2]
- 1:ヒット → [1, 3, 2](動かさない)
- 4:1 を追い出す(1回目)→ [3, 2, 4]
- 5:3 を追い出す(2回目)→ [2, 4, 5]
- 2:ヒット
- 3:2 を追い出す(3回目)→ [4, 5, 3]
- 4:ヒット/5:ヒット → FIFO は 3 回
- 【LRU】列は「最後に参照した順」。ヒットしたら最後尾へ
- 1, 3, 2 → [1, 3, 2]。1:ヒット → [3, 2, 1]
- 4:3 を追い出す(1回目)→ [2, 1, 4]
- 5:2 を追い出す(2回目)→ [1, 4, 5]
- 2:1 を追い出す(3回目)→ [4, 5, 2]
- 3:4 を追い出す(4回目)→ [5, 2, 3]
- 4:5 を追い出す(5回目)→ [2, 3, 4]
- 5:2 を追い出す(6回目)→ [3, 4, 5] → LRU は 6 回
答え:イ(FIFO 3 回、LRU 6 回)。この並びでは LRU のほうが多い
FIFO のページイン回数(ページ枠3、参照順 4,3,2,1,3,5,2)
ア 2
イ 3
ウ 5
エ 6
出典:基本情報技術者試験 科目A免除 修了試験 200906 実施分 問20
解き方と答えを見る
- 問われているのは『ページイン』の回数。最初に空きへ読み込む分も 1 回ずつ数える(『置換え』の回数なら数えない)
- 4, 3, 2:空きに読み込む(ページイン 3 回)→ [4, 3, 2]
- 1:フォールト。最も古い 4 を追い出して読み込む(4 回目)→ [3, 2, 1]
- 3:ヒット(ページインしない)
- 5:フォールト。最も古い 3 を追い出して読み込む(5 回目)→ [2, 1, 5]
- 2:ヒット
答え:ウ(5 回)
要点(試験直前に読む)
- ページング=固定長(仮想側はページ、実記憶側はページフレーム)。セグメント=論理的なまとまりごとの可変長。
- 仮想記憶の効果は、必要なページを動的に割り当てて主記憶を効率よく使えること。速くはならない。
- ページ内変位のビット数はページサイズで決まり(4k=2^12 なので 12 ビット)、仮想ページ番号のビット数はその残り(32 − 12 = 20)。
- ページフォールト → 置換え対象の決定 → ページアウト → ページイン の順。
- LRU=最後に参照した時刻が最も古いページ、FIFO=最も古くに入ったページ、LFU=参照回数が最少のページ。トレースでは、LRU だけヒットしたページを最後尾へ移す。
- スラッシング=仮想記憶 × 多重度が大きい → ページの入れ替えが多発し、CPU が本来の処理に使われず応答が急に遅くなる。
ひっかけ
- LRU の判断基準を問う問題で『最初に参照した時刻』(FIFO 的な基準)や『参照回数』(LFU)を選ばせる → LRU は Recently(最近)=『最後に参照した時刻』。
- FIFO の説明問題で、LRU(一番長く参照されていない)、最適方式(次の参照が最も遠い未来)、優先度方式の説明を並べてくる → FIFO は『最も古くから主記憶にある』ページを選ぶ。
- 『LRU のほうが優秀だから置換え回数は少ない』と思い込ませる → 先入観を捨てて、列を書いて1つずつ数える。ページイン回数か置換え回数かも確認する(最初に空きへ入る分を数えるかどうか)。
- 仮想アドレス空間を分割した固定長の単位を問う問題で、フレーム(実記憶側)やセグメント(可変長)を混ぜてくる → 仮想側で固定長ならページ。
- スラッシングの組合せ問題で『実記憶方式 × 多重度大』を選ばせる → ページングがあるのは仮想記憶方式だけ。答えは『仮想記憶 × 多重度が大きい』。
用語(15)
主記憶より大きなアドレス空間があるように見せ、必要な部分だけを主記憶に置く仕組み。
⚠ 主記憶より速くなるわけではない。目的は主記憶を効率よく使うこと。
仮想記憶と実記憶をそれぞれ固定長の区画に分けて対応づける方式。
⚠ 再配置(プログラムを別の場所で動かせるようにすること)、メモリインタリーブ(同時アクセスのために主記憶を分けること)、ブロッキング(レコードをまとめて読み書きすること)とは別物。
仮想アドレス空間を固定長で区切った単位。
⚠ 実記憶側の区画はページフレーム。可変長の単位はセグメント。
実記憶(主記憶)を、ページと同じ固定長で区切った区画。
⚠ 仮想側を区切った単位はページ。問題文が『仮想アドレス空間を分割』ならページを選ぶ。
プログラムやデータの論理的なまとまりごとに割り当てる、可変長の管理単位。
⚠ 固定長ならページ。『論理的な単位』『可変長』がセグメントの目印。
磁気ディスクを読み書きする物理的な最小単位。
⚠ 仮想記憶の用語ではない。選択肢に混ぜてあるだけ。
仮想アドレスのうち、ページの先頭から何バイト目かを表す部分。
⚠ ビット数はページサイズで決まる。仮想ページ番号のビット数は、アドレス全体から引いた残り。
アクセスしたページが主記憶に無いときに発生する割込み。
⚠ 主記憶にあるページへのアクセスでは起きない。更新されたページが多いかどうかとも関係ない。
必要なページを補助記憶から主記憶へ読み込むこと。
⚠ ページアウトの後に行う。ページイン回数には、最初に空きへ読み込む分も入る。
置換え対象のページを主記憶から補助記憶へ書き出して、場所を空けること。
⚠ ページインより先に行う(空けてから入れる)。
主記憶に最も古くから存在しているページを追い出す置換え方式。
⚠ LRU は最後に参照した時刻で判断する。FIFO は入った時刻で判断し、その後の参照は見ない。
最後に参照されてから最も長い時間がたったページを追い出す置換え方式。
⚠ 判断基準は『最後に参照した時刻』。最初に参照した時刻なら FIFO、参照回数なら LFU。
参照回数が最も少ないページを追い出す置換え方式。
⚠ LRU は時刻、LFU は回数で判断する。
仮想記憶で多重度を上げすぎ、ページの入れ替えが多発して処理がほとんど進まなくなる現象。
⚠ フラグメンテーション(空きの細切れ)、オーバレイ、ロールアウト、メモリコンパクションとは別物。実記憶方式では起きない。
マルチプログラミングで、同時に並行して実行するプログラムの数。
⚠ 多重度が大きいほど主記憶が足りなくなり、スラッシングが起きやすい。
このレッスンの過去問
- ページング方式の定義平成29年度 春期 基本情報技術者試験 午前 問15
- 仮想記憶のセグメント方式(可変長の管理単位)基本情報技術者試験 科目A免除 修了試験 20110626 実施分 問21
- 仮想アドレスのページ番号とページ内変位のビット数計算基本情報技術者試験 科目A免除 修了試験 20260614 実施分 問13
- ページフォールトの発生要因平成29年度 秋期 基本情報技術者試験 午前 問20
- ページフォールト発生時の処理順序(置換え・ページアウト・ページイン)基本情報技術者試験 科目A免除 修了試験 20220123 実施分 問19
- ページ置換えアルゴリズムFIFOの定義基本情報技術者試験 科目A免除 修了試験 20160124 実施分 問17
- LRU方式の置換え対象平成28年度 秋期 基本情報技術者試験 午前 問19
- FIFO・LRUページ置換え回数のトレース平成29年度 春期 基本情報技術者試験 午前 問19
- スラッシング現象の定義令和8年度 基本情報技術者試験 科目A 公開問題 問5