資格道場 › レッスン一覧 › ソフトウェア
ソフトウェア・6/10・14分

仮想記憶とページ置換え

ゴール

ページング・セグメント・ページフォールト・スラッシングの用語を見分け、FIFO と LRU でページの置換えを手で追えるようになる。ページサイズから仮想アドレスのビットの内訳も計算できるようになる。

仮想記憶は OS 分野の定番で、なかでも LRU(34回)とスラッシング(16回)は公開過去問で何度も出ています。用語の区別とトレース(手で1つずつ追うこと)の両方が問われるので、ここを押さえると確実に点が取れます。

このレッスンで稽古する(用語チェック・過去問)

結論:仮想記憶は「必要な分だけ主記憶に置く」仕組み

仮想記憶は、プログラムに広いアドレス空間(番地の範囲)があるように見せる仕組みです。実際に主記憶(メモリ)に置くのは、いま必要な部分だけです。残りは補助記憶(SSD・HDD)に置いておき、必要になったら主記憶へ運びます。

たとえるなら、**机(主記憶)と本棚(補助記憶)**です。机が狭くても、使う資料だけ机に出し、使わない資料を本棚に戻せば、大量の資料を扱えます。

大事なのは、仮想記憶は主記憶を効率よく使うための仕組みで、速くする仕組みではないことです。本棚まで取りに行く分だけ、かえって遅くなります。

ページング方式:固定長で区切る

ページング方式は、仮想アドレス空間と実記憶(主記憶)を、それぞれ同じ固定長の区画に分けて対応づける方式です。仮想側の区画をページ、実記憶側の区画をページフレームと呼びます。

この方式の効果は、処理に必要なページを動的に(実行中その場で)主記憶へ割り当てるので、主記憶を効率的に使えることです。前のレッスンの断片化(すき間が散らばる問題)も、固定長で区切るので起きにくくなります。

用語 長さ 何の単位か
ページ 固定長 仮想アドレス空間を区切った単位
ページフレーム(フレーム) 固定長 実記憶(主記憶)側を区切った単位
セグメント 可変長 プログラムやデータの論理的なまとまり(関数・データ領域など)ごとの単位
セクタ 固定長 ディスクの物理的な最小単位(仮想記憶とは関係ない)

セグメント方式は、ページングとは逆に、意味のまとまりごとに可変長で管理する方式です。試験では「固定長=ページ」「可変長=セグメント」が見分けられれば解けます。

仮想アドレス空間主記憶(実記憶)ページ0ページ1ページ2ページ3フレーム0フレーム1(空き)フレーム2補助記憶SSD・HDD同じ固定長なので、空いた枠のどこにでも入る
ページとページフレームは同じ固定長なので、ページは主記憶のどのフレームに置いてもよい(順番どおりでなくてよい)。いま必要でないページは補助記憶に残しておく。

仮想アドレスの内訳:ページ番号+ページ内変位

仮想アドレスは「何番目のページか(仮想ページ番号)」と「そのページの先頭から何バイト目か(ページ内変位)」の2つに分かれます。マンションの「部屋番号」と「部屋の中の位置」のような関係です。

  • ページ内変位のビット数 = ページサイズを 2 の何乗で表すか
  • 仮想ページ番号のビット数 = 仮想アドレス全体のビット数 − ページ内変位のビット数

計算の手順は下の例題で確認します。

仮想アドレス(例:32ビット)仮想ページ番号20ビットページ内変位12ビット上位下位全体 − 変位のビット数32 − 12 = 20ページサイズ 4KiB= 2の12乗→ 12ビットマンションの部屋番号部屋の中の位置
仮想アドレスは上位の仮想ページ番号と下位のページ内変位に分かれる。例として32ビット・ページサイズ4KiB(2の12乗)なら、上位20ビット+下位12ビットになる。

ページフォールトと、そのあとの処理順序

ページフォールトは、アクセスしたページが主記憶に無いときに起きる割込み(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)。

3枠にA→B→Cの順で入れ、Aを参照そこへDが来たら、誰を追い出す?FIFO:入った順の列ABCD先頭最後尾→ Aを追い出す(参照されても順番は同じ)LRU:最後に使った順の列BCAD先頭最後尾→ Bを追い出す(Aは参照で最後尾へ)
同じ状況でも、FIFO は入った順の列の先頭を、LRU は最後に使った順の列の先頭を追い出すので、結果が変わる。

スラッシング:入れ替えばかりで仕事が進まない

スラッシングは、仮想記憶方式で多重度(同時に動かすプログラムの数)を上げすぎた結果、主記憶が足りなくなり、ページイン・ページアウトが多発して処理がほとんど進まなくなる現象です。CPU は入れ替えの処理(オーバヘッド=本来の仕事以外の負荷)に追われ、アプリが CPU を使える割合が下がり、応答が急に遅くなります。

たとえるなら、狭い机で同時に5つの仕事をしようとして、資料の出し入ればかりしている状態です。

発生の条件は**「仮想記憶方式」×「多重度が大きい」**です。実記憶方式(仮想記憶を使わない方式)にはページングがないので、スラッシングは起きません。

用語 意味 スラッシングとの違い
スラッシング ページの入れ替えが多発し、性能が急に落ちる ―
フラグメンテーション 主記憶の空きが細切れになる(断片化) 空き領域の形の問題で、入れ替えの多発ではない
メモリコンパクション 細切れの空きを1か所に詰め直す 断片化への対策
オーバレイ プログラムを分割し、必要な部分だけ順に主記憶に読み込む 仮想記憶以前の、プログラム側で行う工夫
ロールアウト/ロールイン プログラム全体を補助記憶へ退避する/戻す ページ単位ではなくプログラム単位の退避
ボトルネック 全体の性能を決めてしまう遅い箇所(一般用語) 現象名としては一般的すぎる
アプリがCPUを使える割合多重度(同時に動かすプログラムの数)主記憶に収まる間多重度とともに伸びるスラッシング入れ替えばかり
多重度を上げると最初はアプリが CPU を使える割合が伸びるが、主記憶が足りなくなった所から入れ替えが多発し、急に落ちる。これがスラッシング。
例題 1

仮想ページ番号とページ内変位のビット数

ページング方式の仮想記憶において,ページサイズが4kバイト,仮想アドレス空間が2^32バイトの場合,仮想ページ番号とページ内変位はそれぞれ何ビットで表現されるか。ここで,1kは1,024とする。
仮想ページ番号のビット数ページ内変位のビット数
ア1220
イ1616
ウ2012
エ248

ア 仮想ページ番号 12ビット,ページ内変位 20ビット
イ 仮想ページ番号 16ビット,ページ内変位 16ビット
ウ 仮想ページ番号 20ビット,ページ内変位 12ビット
エ 仮想ページ番号 24ビット,ページ内変位 8ビット

出典:基本情報技術者試験 科目A免除 修了試験 20260614 実施分 問13

解き方と答えを見る
  1. ページサイズを 2 の累乗で表す:4k バイト = 4 × 1,024 = 2^2 × 2^10 = 2^12 バイト
  2. ページの中の位置を表すには 2^12 通りが必要なので、ページ内変位は 12 ビット
  3. 仮想アドレス空間は 2^32 バイトなので、仮想アドレス全体は 32 ビット
  4. 仮想ページ番号 = 32 − 12 = 20 ビット(ページの数は 2^20 個)
  5. この組合せ(20, 12)は選択肢ウ。4k を 2^10 と考えると、ページ内変位を 10 ビットと誤る

答え:ウ(仮想ページ番号 20 ビット、ページ内変位 12 ビット)

例題 2

LRU:ページ6をアクセスしたとき、どのページが追い出されるか(ページ枠4)

ページング方式の仮想記憶において,ページ置換えアルゴリズムに LRU 方式を採用する。主記憶に割り当てられるページ枠が 4 のとき,ページ 1, 2, 3, 4, 5, 2, 1, 3, 2, 6 の順にアクセスすると,ページ 6 をアクセスする時点で置き換えられるページはどれか。ここで,初期状態では主記憶にどのページも存在しないものとする。

ア 1
イ 2
ウ 4
エ 5

出典:平成27年度 春期 基本情報技術者試験 午前 問20

解き方と答えを見る
  1. 列は「最後に参照した順」で、左ほど古い。ヒットしたページは最後尾へ移す
  2. 1, 2, 3, 4:空きに順に入る → [1, 2, 3, 4]
  3. 5:フォールト。左端の 1 を追い出す → [2, 3, 4, 5]
  4. 2:ヒット。2 を最後尾へ → [3, 4, 5, 2]
  5. 1:フォールト。左端の 3 を追い出す → [4, 5, 2, 1]
  6. 3:フォールト。左端の 4 を追い出す → [5, 2, 1, 3]
  7. 2:ヒット。2 を最後尾へ → [5, 1, 3, 2]
  8. 6:フォールト。左端の 5(最後の参照から最も時間がたったページ)を追い出す

答え:エ(5)

例題 3

FIFO と LRU の置換え回数を数える(ページ枠3、アクセス順 1,3,2,1,4,5,2,3,4,5)

仮想記憶方式のコンピュータにおいて,実記憶に割り当てられるページ数は 3 とし,追い出すページを選ぶアルゴリズムは,FIFO と LRU の二つを考える。あるタスクのページのアクセス順序が 1,3,2,1,4,5,2,3,4,5 のとき,ページを置き換える回数の組合せとして,適切なものはどれか。
FIFOLRU
ア32
イ36
ウ43
エ54

ア FIFO: 3,LRU: 2
イ FIFO: 3,LRU: 6
ウ FIFO: 4,LRU: 3
エ FIFO: 5,LRU: 4

出典:平成29年度 春期 基本情報技術者試験 午前 問19

解き方と答えを見る
  1. 【FIFO】列は「入った順」。ヒットしても列は動かさない
  2. 1, 3, 2:空きに入る(置換えではない)→ [1, 3, 2]
  3. 1:ヒット → [1, 3, 2](動かさない)
  4. 4:1 を追い出す(1回目)→ [3, 2, 4]
  5. 5:3 を追い出す(2回目)→ [2, 4, 5]
  6. 2:ヒット
  7. 3:2 を追い出す(3回目)→ [4, 5, 3]
  8. 4:ヒット/5:ヒット → FIFO は 3 回
  9. 【LRU】列は「最後に参照した順」。ヒットしたら最後尾へ
  10. 1, 3, 2 → [1, 3, 2]。1:ヒット → [3, 2, 1]
  11. 4:3 を追い出す(1回目)→ [2, 1, 4]
  12. 5:2 を追い出す(2回目)→ [1, 4, 5]
  13. 2:1 を追い出す(3回目)→ [4, 5, 2]
  14. 3:4 を追い出す(4回目)→ [5, 2, 3]
  15. 4:5 を追い出す(5回目)→ [2, 3, 4]
  16. 5:2 を追い出す(6回目)→ [3, 4, 5] → LRU は 6 回

答え:イ(FIFO 3 回、LRU 6 回)。この並びでは LRU のほうが多い

例題 4

FIFO のページイン回数(ページ枠3、参照順 4,3,2,1,3,5,2)

仮想記憶におけるページ置換えアルゴリズムとして FIFO 方式を採用する。主記憶のページ枠が 3 で,プログラムが参照するページ番号の順序が,4,3,2,1,3,5,2 のとき,ページインは何回行われるか。ここで,初期状態では主記憶にどのページも存在しないものとする。

ア 2
イ 3
ウ 5
エ 6

出典:基本情報技術者試験 科目A免除 修了試験 200906 実施分 問20

解き方と答えを見る
  1. 問われているのは『ページイン』の回数。最初に空きへ読み込む分も 1 回ずつ数える(『置換え』の回数なら数えない)
  2. 4, 3, 2:空きに読み込む(ページイン 3 回)→ [4, 3, 2]
  3. 1:フォールト。最も古い 4 を追い出して読み込む(4 回目)→ [3, 2, 1]
  4. 3:ヒット(ページインしない)
  5. 5:フォールト。最も古い 3 を追い出して読み込む(5 回目)→ [2, 1, 5]
  6. 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)

仮想記憶 かそうきおく
主記憶より大きなアドレス空間があるように見せ、必要な部分だけを主記憶に置く仕組み。
⚠ 主記憶より速くなるわけではない。目的は主記憶を効率よく使うこと。
ページング方式 ぺーじんぐほうしき
仮想記憶と実記憶をそれぞれ固定長の区画に分けて対応づける方式。
⚠ 再配置(プログラムを別の場所で動かせるようにすること)、メモリインタリーブ(同時アクセスのために主記憶を分けること)、ブロッキング(レコードをまとめて読み書きすること)とは別物。
ページ ぺーじ
仮想アドレス空間を固定長で区切った単位。
⚠ 実記憶側の区画はページフレーム。可変長の単位はセグメント。
ページフレーム ぺーじふれーむ
実記憶(主記憶)を、ページと同じ固定長で区切った区画。
⚠ 仮想側を区切った単位はページ。問題文が『仮想アドレス空間を分割』ならページを選ぶ。
セグメント せぐめんと
プログラムやデータの論理的なまとまりごとに割り当てる、可変長の管理単位。
⚠ 固定長ならページ。『論理的な単位』『可変長』がセグメントの目印。
セクタ せくた
磁気ディスクを読み書きする物理的な最小単位。
⚠ 仮想記憶の用語ではない。選択肢に混ぜてあるだけ。
ページ内変位 ぺーじないへんい
仮想アドレスのうち、ページの先頭から何バイト目かを表す部分。
⚠ ビット数はページサイズで決まる。仮想ページ番号のビット数は、アドレス全体から引いた残り。
ページフォールト ぺーじふぉーると
アクセスしたページが主記憶に無いときに発生する割込み。
⚠ 主記憶にあるページへのアクセスでは起きない。更新されたページが多いかどうかとも関係ない。
ページイン ぺーじいん
必要なページを補助記憶から主記憶へ読み込むこと。
⚠ ページアウトの後に行う。ページイン回数には、最初に空きへ読み込む分も入る。
ページアウト ぺーじあうと
置換え対象のページを主記憶から補助記憶へ書き出して、場所を空けること。
⚠ ページインより先に行う(空けてから入れる)。
FIFO First In First Out
主記憶に最も古くから存在しているページを追い出す置換え方式。
⚠ LRU は最後に参照した時刻で判断する。FIFO は入った時刻で判断し、その後の参照は見ない。
LRU Least Recently Used
最後に参照されてから最も長い時間がたったページを追い出す置換え方式。
⚠ 判断基準は『最後に参照した時刻』。最初に参照した時刻なら FIFO、参照回数なら LFU。
LFU Least Frequently Used
参照回数が最も少ないページを追い出す置換え方式。
⚠ LRU は時刻、LFU は回数で判断する。
スラッシング すらっしんぐ
仮想記憶で多重度を上げすぎ、ページの入れ替えが多発して処理がほとんど進まなくなる現象。
⚠ フラグメンテーション(空きの細切れ)、オーバレイ、ロールアウト、メモリコンパクションとは別物。実記憶方式では起きない。
多重度 たじゅうど
マルチプログラミングで、同時に並行して実行するプログラムの数。
⚠ 多重度が大きいほど主記憶が足りなくなり、スラッシングが起きやすい。

このレッスンの過去問

このレッスンで稽古する