PromleeBlog

posting thumbnail
仮想メモリとは? - 1日10分で学ぶOS 11日目

📅

はじめに 🔗

普段使うプログラムは、思っている以上に多くのメモリを必要とします。一方、物理RAMの容量は限られています。このときOSが使う仕組みが、*仮想メモリ(Virtual Memory)*です。
今回は、仮想メモリの考え方、ページの読み込みと入れ替え、混同しやすい「コピーオンライト(Copy-on-Write)」まで、子どもでもわかるよう順を追って説明します。

仮想メモリとは? 🔗

仮想メモリ
は、物理メモリより広いアドレス空間を作り出すOSの技術です。プログラムは大きなメモリがあるかのように動きますが、実際にメモリに載っているのは一部で、残りはディスクに置かれます。
小さな部屋に住みながら、別に倉庫を借り、必要な物だけを出しておくのに似ています。

なぜ仮想メモリが必要? 🔗


デマンドページング(Demand Paging) 🔗

仮想メモリでは、最初からすべてのページをメモリに載せず、
必要なときだけ
読み込みます。これを*デマンドページング(Demand Paging)*と呼びます。
📦 必要な物だけ倉庫から取り出して使うのと同じです。

動作の仕組み 🔗

  1. プログラムを実行し、最初に必要な数ページだけをメモリに載せます。
  2. 実行中に別のページが必要になると、**ページフォールト(Page Fault)**が発生します。
  3. 該当のページをディスクから読み出し、メモリに載せます。
  4. 実行を再開します。

動作の例 🔗

  1. プロセスには10ページありますが、メモリには3ページだけを載せます。
  2. 残りのページのどれかが必要になると、OSがページフォールトを検知します。
  3. 必要なページをディスクからRAMへコピーします。
デマンドページングにより、メモリをより広く使えます。

ページ置換(Page Replacement) 🔗

メモリがすでに満杯なのに、新しいページを載せる必要がある場合はどうするのでしょうか。
🎒 かばんが本でいっぱいなら、読まない本を出して新しい本を入れるのと同じです。
このときOSは、
ページ置換アルゴリズム
を使って、どのページを追い出すか決めます。
代表的なアルゴリズムは次のとおりです。

FIFO 🔗

最初に入ったページから取り除きます。
페이지 프레임: 3개
요청: A, B, C, A, D

→ 적재 순서: A, B, C
→ A는 재사용됨
→ D 요청 시, A가 가장 먼저 들어왔으므로 A 제거
→ 페이지 교체: A → D
最も長い間使っていないページを取り除きます。
페이지 프레임: 3개
요청: A, B, C, A, D

→ A, B, C 적재
→ A 재사용됨 → A는 최근 사용됨
→ D 요청 → B가 가장 오래 사용되지 않음 → B 제거
→ 페이지 교체: B → D

Optimal 🔗

次に使う時点が最も遠いページを取り除きます。将来の参照を知る必要があるため、実際には使うのが困難です。
페이지 프레임: 3개
요청: A, B, C, A, D, B

→ A, B, C 적재
→ A 재사용됨
→ D 요청 → C는 앞으로 사용되지 않음 → C 제거
→ B 요청 → A는 안 쓰고 D는 나중에 → D 제거 (미래 기준)

コピーオンライト(Copy-on-Write) 🔗

2つのプロセスが同じデータを使うとき、最初は同じページを
共有
し、
片方が書き換えるときだけコピーする
方法です。
📄 同じ書類を読むだけなら共有し、誰かが書き換えるときに別のコピーを作るのと同じです。

動作の仕組み 🔗

  1. 親プロセスが子プロセスを作り、メモリを共有します。
  2. どちらのプロセスもメモリを読み取れます。
  3. 片方が書き換えようとすると、
    そのページだけをコピーして分離します
    。
この手法は、
fork()
後にメモリを効率よく管理するため、よく使われます。

メモリ圧縮(Memory Compression) 🔗

一部のOSでは、スワップの代わりに、使っていないデータを
圧縮し、より多くのデータをメモリ上に保つ
ことがあります。

カーネルのメモリ割り当て 🔗

仮想メモリはユーザープログラムだけでなく、カーネル領域でも使われます。
OS内部でもメモリを確保し、解放する必要があるため、カーネルにはslabやbuddyなど、独自のメモリアロケーターがあります。
カーネルを「OSの中にある小さなプログラム」と考えるとわかりやすいでしょう。このプログラムにもメモリが必要です!

まとめ 🔗

今回は、仮想メモリの基本と、デマンドページング、ページ置換、コピーオンライトなどを通じて、実際のOSがメモリを効率よく使う方法を見てきました。
次回は、大容量ストレージの構造とディスクスケジューリングを取り上げます。

参考 🔗

    仮想メモリとは? - 1日10分で学ぶOS 11日目 | PromleeBlog