🐧

【Linux】仮想記憶の役割

に公開

結論

  • 仮想記憶とは、物理的なメモリに直接アクセスせずに、仮想アドレスとページテーブルを用いて間接的にメモリにアクセスする仕組み。
  • 仮想記憶によって、「メモリの断片化」「マルチプロセスの実現」「不正領域へのアクセス」といった、メモリを扱う上での不都合な点をカバーする役割がある。

登場人物

  1. 仮想アドレス
  2. 物理アドレス
  3. アドレス空間
  4. ページテーブル

1.仮想アドレス

プロセスがアクセスするアドレス

2.物理アドレス

実際のメモリのアドレス

3.アドレス空間

アドレスによってアクセスができる範囲。
プロセスごとに異なる

4.ページテーブル

仮想アドレスを物理アドレスに変換するための対応表で、カーネルが作成する。
プロセスごとに作成される。

仮想記憶の仕組み

ページテーブルが以下のように作成された場合。

仮想アドレス 物理アドレス
0~100 500~600
100~200 600~700
200~300 700~800

プロセスが200にアクセスすると、実際のメモリの700のアドレスにアクセスされるようになります。

仮想記憶がないと何が不便なのか?

物理アドレスに直接アクセスさせない理由としては3つあります。

  1. メモリが断片化する
  2. マルチプロセスの実現が難しい
  3. 不正な領域にアクセスできてしまう

メモリが断片化する

メモリの獲得・解放を繰り返していると、断片化してしまいます。
例えば、500バイト分のメモリがあり、プロセスAが0~100、200~300、400~500を使用してるとします。
次にプロセスBが200バイト分をまとめて確保しようとしても100~200、300~400の100バイトずつ2つの領域に分かれてしまっています。
このように細かくメモリ領域が分かれてしまう現象が断片化です。

マルチプロセスの実現が難しい

複数のプロセスを同時に実行したい場合、それぞれのプロセスが読み込まれるメモリ領域が被ってしまうと実行できません。

不正な領域にアクセスできてしまう

物理メモリに直接アクセス出来ると、カーネルなどの別のプロセスに割り当てられているメモリ領域にもアクセスできてしまいます。

仮想記憶による解決

では、仮想記憶の仕組みによってこれらの問題をどう解決しているかを見ていきます。

メモリの断片化

ページテーブルによって実際には断片化していても1つの大きな領域として扱うことができます。
例えば以下のように物理アドレスが断片化されていても、仮想アドレスと対応させることにより、
300バイトの連続した領域として扱うことができます。

仮想アドレス 物理アドレス
0~100 500~600
100~200 800~900
200~300 1000~1100

マルチプロセスの実現

アドレス空間やページテーブルはプロセスごとに作られるため、他のプロセスとメモリ領域が被ってしまう心配はありません。

不正な領域へのアクセスを防止

前述の通りアドレス空間はプロセスごとに作られるため、プロセスAがプロセスBのメモリに直接アクセスできません。

参考図書

https://gihyo.jp/book/2022/978-4-297-13148-7

GitHubで編集を提案

Discussion