(O+P)ut

アウトプット



(O+P)ut

エンジニアのアウトプット

【サルでも分かる】仮想記憶入門

スポンサーリンク

f:id:mtiit:20190807221424p:plain

はじめに

仮想記憶?何が仮?

程度の知識でも仮想記憶について理解できるよう、順を追って説明する入門記事を書いてみました。

所要時間目安 : 5分

仮想記憶とは?

仮想記憶とは搭載されているメモリにプロセスから直接アクセスさせるのではなく仮想アドレスというアドレスを用いて間接的にアクセスさせる仕組みです。

要はメモリへのアクセスに関する仕組みです。

メモリってなんだっけ?

そもそもメモリとは?

メモリとはコンピュータを構成するパーツの一つで高速に読み書きできる記憶装置です。主記憶装置とも言われます。
同じく記憶装置であるディスク等はメモリと対比して補助記憶装置と呼ばれます。
以下のような全体像で、CPUと補助記憶装置の間に立ってデータの受け渡しをしています。
f:id:mtiit:20190214190207p:plain

メモリとディスク、何が違うの?

よく言われるのは、メモリは机の上で補助記憶装置は机の引き出しという例えです。
プロセス等を起動すると、机の上であるメモリに「コード+データ」として展開されます。

一方でメモリにはOSの機能を提供しているようなシステムプロセスも展開されており、そこを皆が好き勝手に触れてしまうのは大問題です。マルチユーザを想定しているUNIX系のシステムてあれば、そのメモリ箇所を書き換えてしまうことで全ユーザに影響します。

メモリ全体をアクセス対象にさせたくないんだね

メモリを隠蔽したい

上記のような事態を避けるためにOSの機能として各プロセス毎にメモリの番地を仮想的に見せています。そんな番地を物理アドレスとの対比で仮想アドレスと呼びます。

以下が仮想アドレスと物理アドレスの例です。

仮想アドレス 物理アドレス
0~249 1700~1949

このマッピングにより、プロセスが例えば仮想アドレス範囲外であるエリアにアクセスしようとしてもエラーを返すことが可能です。

ちなみに、これらを実現するためのマップ表をページテーブルと呼びます。仮想アドレスと物理アドレスの橋渡しを行う役割があり、このテーブル自体もメモリに展開されています。

実メモリに直接アクセスさせずに仮想アドレスを介してアクセスしているんだね

以下に二つのプロセスのページテーブルの例です。

プロセスAの仮想アドレス 物理アドレス プロセスBの仮想アドレス
0~249 1700~1949 -
- 1950~2149 0~199

他のプロセスへのアクセスをOSの機能として封じています。

他にも仮想記憶のメリットはないの?

メモリの断片化を防げる

物理アドレスですが、プロセスの起動や停止を繰り返していく中で使われているエリアと使われていないエリアが歯抜けになることがあります。

物理アドレス 空きか否か
0~99 O
100~199 X
200~299 O
300~399 X
400~499 O

要はメモリは300番地分空いているのに空き領域がバラバラなので100番地以上の空き領域の確保に失敗していまいます。

飛び飛びでも確保できそうだけど?

技術的にはできるのですが、プログラム側で複数領域にまたがるメモリ管理を実装する必要があるので現実的ではありません。

そこに先ほどの仮想記憶の仕組みを使えば、ページテーブル側でこのギャップを吸収できます。

仮想アドレスで0~299と扱えるんだね

メモリが断片化しても有効活用できる、というのが正確な表現です。

デメリットも

仮想的なメモリとして扱っているので、物理メモリは空いているのに仮想メモリが枯渇してプロセスがエラーになる可能性があります。
実際、古いOSでは仮想メモリのアドレス空間に厳しい上限があり、大量のメモリを利用するプログラムが動作しない場合がありました。

終わりに

ページテーブルに仮想アドレスと物理アドレスの対応情報を入れ込み、プロセスは仮想アドレスを通してメモリにアクセスを行う仕組みが仮想記憶です。これらはCPUが自動的にアドレス変換を行うので利用者として意識することはありませんが、IT系の素養として知っておくと役立つと思います。

以上、ご参考になれば幸いです。