仮想記憶

出典: Wikipedio


画像:Virtual Memory Ja 1.JPG
仮想記憶の概念図

仮想記憶(かそうきおく、Virtual Memory)とは、メモリ管理技法の一種であり、マルチタスクオペレーティングシステムが不連続なメモリ領域をソフトウェア(プロセスなど)から見て連続になるように見せかけるものである。仮想記憶はまた、コンピュータ上に実装されている主記憶装置よりも大きな記憶領域を仮想的に提供する仕組みを提供する。仮想記憶の仕組みを利用することで、メモリ空間の一部をハードディスク装置等の大容量外部記憶に待避でき、実装メモリ量以上のメモリ空間が利用できるようになる。

仮想的に与えられたアドレスを仮想アドレス(virtual address)または論理アドレス(logical address)、実記憶上で有効なアドレスを物理アドレス(physical address)または実アドレス(real address)という。仮想アドレスの範囲を仮想アドレス空間、物理アドレスの範囲を物理アドレス空間という。

目次

概要

仮想記憶の実装には、大きく分けてセグメント方式ページング方式の二種類がある。ちなみにMC68000システムでは、68451(セグメント方式)と、68851(ページング方式)のMMUが準備されていた。

一般にページング方式の方がよく使われている。これにより、メモリスワッピング(あるいは匿名メモリページング)と仮想記憶が結びつけられる。メモリスワッピングとは、一次記憶装置内のメモリページを二次記憶装置(のスワップファイルあるいはスワップパーティションと呼ばれる場所)に書き出して、より高速な一次記憶装置を他のプロセスが使えるように解放することである。

「仮想記憶」という用語は「メモリスワッピング」と混同されることが多い。これはMicrosoft Windows系のオペレーティングシステム (OS) がメモリスワッピングの可/不可を設定する項目を "virtual memory" と称していることも一因と考えられる。実際、Windowsはその "virtual memory" を不可としても、ページング方式と仮想記憶を使用している<ref>Microsoft support: RAM, Virtual Memory, Pagefile and all that stuff</ref>。XP日本語版では、"システムのプロパティ"→"詳細設定"→"パフォーマンスオプション"→"仮想メモリ"のことである。

UNIX系システムでもスワップファイルやスワップパーティションなしで仮想記憶を使用することが可能である。従って主記憶装置以上の大きな記憶領域を仮想的に使用できるようにすることは仮想記憶の主な目的ではあるが、本質ではないとも言える。本質は、不連続な物理メモリ領域を連続な仮想メモリ領域にマッピングすることであり、複数のプロセスがそれぞれ固有の連続な仮想メモリ領域を割り当てられる点である。これによって他のプロセスのことを気にせずに動作できる環境が提供されている。そういった意味で、仮想機械がゲストOSに対して提供していることと、仮想記憶がユーザープロセスに提供していることは等価である。

技術的には、仮想記憶を使うことにより、ソフトウェアが動作するメモリアドレス空間のサイズとアドレス範囲は当該コンピュータの物理メモリ領域には必ずしも縛られなくなる。仮想記憶を適切に実装するには、CPU(あるいはそれに付随するデバイス)がOSに対して仮想メモリを物理メモリにマップする(対応付ける)手段を提供し、主記憶(物理メモリ)に対応していない仮想アドレスにアクセスしたことを検出する手段を提供して必要なデータをスワップインできるようにしなければならない。CPUの支援なしで仮想記憶を提供することも可能だが、その場合は上述の機能を提供するCPUをエミュレートするだけであって、本質的には同じことである。アドビシステムズの一部のアプリケーションのように、アプリケーションプログラムが自前で仮想記憶機構を持つ例もある。

ソフトウエアによって仮想記憶を実現する事は、本来ハードウエアで実現できる機能をあえてソフトウエアで行おうとしているので一見非効率に思える場合がある。しかし、この見方は場合によっては誤りである。なぜならページ方式やセグメント方式では仮想アドレス空間に対する広がりを持たせているので、例えば画像などを扱う場合には単にアドレス空間方向への広がり=すなわち水平方向への広がりしか持たない。だが画像に対する操作は、特定の2次元空間=面的な広がりを持っている。ここにソフトウエアで仮想記憶を実施するに当たって、面的な広がりをメモリ参照の局在性としてみなすと、単なる仮想記憶よりも性能の向上が期待できる。

背景

ほとんどのコンピュータは以下の4種類の記憶装置を内蔵している。CPUより近いほど高速で小容量、遠いほど低速で大容量となる傾向があり、階層構造をなしている。より詳しくは記憶階層の項目を参照。

  • CPU内のレジスタ。4種類の記憶装置の中では唯一CPUのクロック速度で動作するため、最も高速であるが、レジスタの使用は一般にコンパイラによって制御され、データは長期間保持されないため大きな容量もない(32ビットあるいは64ビットが数本)。
  • CPU内かCPUに隣接したキャッシュメモリ。通常はある種のSRAMを使用。レジスタに次いで高速であるが、容量は128kバイト~数メガバイト程度に留まる。
  • 主記憶装置(通常はDRAMを使用)は、プログラミング上CPUが直接リード/ライトできる。キャッシュメモリに比べると速度は落ちるものの、より大きな容量(数百メガバイト~数ギガバイト)を装着できる。
  • 補助記憶装置としての磁気ディスク装置は、機械的な動作を伴うため、主記憶装置と比べても桁違いに低速だが、数十ギガバイト~数テラバイトと容量が大きい。

主記憶装置とキャッシュメモリのどちらを使用するかは、一般にハードウェアが逐一決定するため、プログラマから見れば単に両者が物理メモリと見なせる。実際にはCPUの動作速度とのギャップを埋めるため、まずはキャッシュメモリをアクセスし、さらにハードウェアがキャッシュメモリと主記憶とのやり取りを行っている。

多くのアプリケーションは、情報(実行ファイルの命令列やデータ)がなるべく物理メモリ上に格納された状態でアクセスできることを要求する。これは特に見かけ上並列に複数のプロセス/アプリケーションを同時実行するオペレーティングシステムでは重要となる。全実行中プログラムが必要とする物理メモリ量が実装されている物理メモリ量より大きい場合、当然の結果として情報の一部をディスクに退避し、必要に応じてその内容を物理メモリに戻して使用することになる。しかし、これを実現する手法は様々である。

ひとつの方法として、アプリケーション自身が物理メモリ上に置くべき情報の範囲を決定し、補助記憶装置との情報のやりとりも制御することが考えられる。プログラマはプログラム(およびデータ)のどの部分が現時点で必要か不必要かを判断し、それらの領域の物理メモリへのロード(あるいはアンロード)を必要に応じて行わなければならないだろう。この手法の欠点は、各アプリケーションのプログラマがそのような設計/実装/デバッグに時間を費やす必要がある点であり、アプリケーションそのものに集中できなくなってプログラミング効率が低下する。また、あるプログラマがある時点で物理メモリ上に置くべきデータなどを決定しても、それが例えば、どうしても全物理メモリが必要となった場合など、他のプログラマの決定と衝突してしまう危険がある。仮想記憶が普及する以前のオーバーレイ方式がほぼこれに相当する。

別の方法として、データの参照ポインタではなく何らかのハンドルで行う方式である。OSはそのようなハンドルと対応するデータを物理メモリにロードしたり、逆に補助記憶装置に移したりする。この方式の欠点は、アプリケーションのコードが非常に複雑になる点、アプリケーションがうまく振舞わなければならない点(必要なデータを物理メモリにロックする機能が必要になるだろう)、標準ライブラリが大きなメモリを確保しておいてアプリケーションのメモリ確保要求に応えるという機能を使えなくなる点などが上げられる。この方式の既存の例としてはMicrosoft Windows 3.1が有名である。

現代の解決策は仮想記憶方式の使用である。特別なハードウェアとOSの組合せにより、主記憶容量が大きくなったように見せ、各プログラムが自由気ままに空間を広げて使用することを可能にする。動作中の他のソフトウェアからは、仮想記憶機構の内部の動きは見えない。一般に仮想的な主記憶容量はほとんどどんな大きさにもできる。ただし、アドレスそのもののサイズによる制限がある。32ビットシステムでは、仮想アドレス空間サイズは全体で 232バイト、つまり4ギガバイトである。64ビットの場合、アドレスは64ビットや48ビットといったさらに大きなものになっている。多くのオペレーティングシステムは仮想アドレス空間全体をアプリケーションに使わせることはなく、一部をカーネル空間にすることでカーネルからユーザ空間に容易にアクセスできるようにしている。ただし、これは絶対必要な機能ではなく、OSによっては仮想空間全体をユーザー空間としている。

仮想記憶によってアプリケーションプログラマの仕事はずっと単純になる。アプリケーションが必要とするメモリ容量を気にする必要はなく、必要なサイズの主記憶が使えるように見え、仮想アドレス空間全体の好きな場所にデータを配置することができる。プログラマは主記憶と補助記憶の間でデータをやりとりするのを気にしなくてもよい。もちろん、プログラマが大量のデータを扱う際の性能を考慮しなければならない場合、アクセスするデータがなるべく近いアドレスに配置されるよう注意して、ある時点で必要なメモリ量を減らし不要なスワッピングを回避しなければならない。

ページング

仮想記憶は、必須ではないものの通常ページング方式を使って実装される。ページングでは仮想アドレスを表すビット列の下位ビット列部分はそのまま物理アドレスの下位ビット列部分として使われる。上位ビット列部分はアドレス変換テーブル(群)のキーとして使用され、それによって実際の物理アドレスの上位ビット部分を得る。

このため、サイズが2の冪乗の仮想アドレス空間の連続したアドレス範囲が、対応する連続な物理アドレス範囲に変換される。そのような範囲で参照されるメモリをページと呼ぶ。ページサイズは512バイトから8192バイト(特に4Kバイト)が一般的であるが、特殊用途として4Mバイトやそれ以上のサイズのページも使われることがある。

オペレーティングシステムは、ページテーブルと呼ばれるデータ構造にアドレス変換テーブル、つまり仮想ページ番号と物理ページ番号のマッピング情報を格納する。

あるページが使用不可とされている場合(物理メモリに対応しておらず、スワップ領域に内容がある場合など)、CPUがそのページ内のメモリ位置を参照しようとしたとき、ハードウェアの機構がオペレーティングシステムに、一般にページフォールトと呼ばれる例外を通知する。これにより実行コンテキストはオペレーティングシステム内の例外処理ルーチンにジャンプする。そのページがスワップ領域にあるなら、そのルーチンは「ページスワップ」と呼ばれる処理を実行して必要なページの内容を物理メモリに読み込む。

ページスワップ操作には一連の段階がある。まず、メモリ上のページを選択する。例えば、最近アクセスされておらず、なるべくならスワップ領域を含む何らかのディスクから読み込まれたままで変更されていないページを選択する(詳細はページ置換アルゴリズムを参照)。そのページが変更されている場合、その内容をスワップ領域に書き出す。次に必要とされている、例外発生時に参照しようとしていた仮想アドレスに対応するページの情報を読み込む。ページの読み込みが完了したら、その物理メモリの内容更新に応じて仮想アドレスから物理アドレスへの変換テーブルを更新する。ページスワップが完了すると、例外処理を完了し、元のプログラムの実行が例外発生箇所から再開されて何事もなかったかのように処理が続行される。

仮想ページに何も割り当てられていないために使用不可となっている可能性もある。そのような場合、未使用、あるいはスワップアウトして未使用にした物理ページを割り当て、OSによってはその内容をゼロクリアする。ページテーブルはそれに対応して更新され、上述の場合と同様にプログラムが再開される。

詳細

画像:Virtual Memory DAT Ja 1.JPG
アドレス変換機構の概念図

仮想アドレスから物理アドレスへの変換はメモリ管理ユニット (MMU) というハードウェア装置によって実装されている。これはCPUに内蔵されたモジュールの場合もあるし、外付けでCPUに密結合された別のチップの場合もある。これを動的アドレス変換機構 (DAT : Dynamic Address Translation) と呼ぶ。

OSは、プログラムの仮想アドレス空間のどの部分を物理メモリに保持するかを決定する。OSは、MMUが使用する仮想アドレスから物理アドレスへの変換テーブルも管理する。さらに仮想メモリ例外が発生したら、OSはそれを解決するために物理メモリ領域を確保し、必要なら元の内容をディスクに追い出した上で新たに必要とされている情報をディスクから持ってきて、変換テーブルを更新し、例外発生したソフトウェアの実行を再開する。

多くのコンピュータでは、この変換テーブルは物理メモリに格納されている。従って仮想メモリを参照すると、本来の参照以外に変換テーブルの参照が(変換テーブルの構成によっては複数回)発生する。このアドレス変換による性能低下を低減するため、ほとんどのMMUはよく使われる仮想ページに高速にアクセスできるよう、最近使われた仮想アドレスとそれに対応する物理アドレスを保持しておくテーブルを持っている。これをトランスレーション・ルックアサイド・バッファ(TLB)と呼ぶ。参照アドレスがTLB内に格納された変換テーブルでカバーされていれば、余分な変換テーブルの参照をせずに、高速に変換を行うことができる。ただしTLBは高価な装置のためテーブルの大きさが限られており、目標の仮想アドレスが見当たらない場合は物理メモリ上の変換テーブルを参照してアドレス変換が行われる。

プロセッサによっては、この一連の処理がハードウェア内で行われる。MMUは物理メモリ上の変換テーブルから必要な変換内容を持ってくるので、ソフトウェア側は余分な処理を必要としない。別の種類のプロセッサでは、オペレーティングシステムの介在が必須である。TLBに必要な変換内容がない場合、例外が発生し、オペレーティングシステムがTLB内の1つのエントリを必要な変換テーブルの内容と置き換え、当初のメモリ参照を行った命令から実行が再開され、再度TLBを参照して変換を行う。

仮想記憶をサポートするハードウェアの多くはメモリ保護機能もサポートしている。MMUはメモリ参照の種類(リード、ライト、実行)やメモリ参照時のCPUモードによって扱いを変える機能を持っていることもある。これによってオペレーティングシステムは自身のコードとデータ(例えばアドレス変換テーブルなど)を問題のあるアプリケーションプログラムの不正なメモリアクセスから保護したり、アプリケーションを相互に保護したり、アプリケーション自身の不正動作(例えば自身のコード部分に書き込もうとするなどの動作)から保護したりする。

仮想アドレス空間管理

画像:Virtual Memory Ja 3.JPG
多重仮想記憶の概念図

プロセスの仮想アドレス空間には、そのプロセスが使用するコードやデータが配置される。ページング方式であれ、セグメント方式であれ、仮想アドレス空間内で使用している範囲の管理と制御が仮想記憶機構として必須である。例えば、実行ファイルの内容を仮想メモリ上に配置する領域、コールスタックを配置する領域などがある。このような領域をセグメントと呼ぶ。セグメント方式のセグメントと似ているが、純粋に仮想的なオブジェクトである。実行ファイルを配置する領域は必ずしも連続ではない。プログラムのコード部分とデータ部分を分離して配置するのが一般的で、前者をテキストセグメント、後者をデータセグメントと呼ぶ。データセグメントと隣接してヒープ領域が配置されることが多く、これをUNIX系システムではBSSと呼ぶ。各セグメントはマッピングしているオブジェクトが何であるか、その領域へのアクセス権などを属性情報として保持する。

テキストセグメントはファイルシステム上の実行ファイルの一部と完全に対応しており、書き換えられることもない。従って、マッピングしているオブジェクトは実行ファイルであり、アクセス属性は「リードオンリー」となる。スタックやBSSは一時的な存在であるため何かをマッピングしているわけではない。そこでこれらは匿名ファイル(Anonymous File)をマッピングしているものとして管理される。匿名ファイルをマッピングしているセグメントに対応するページを匿名ページと呼び、これがスワッピングの際にスワップ領域に書き出される。データセグメントは当初は実行ファイルの一部と対応しているが、書き込み可能な属性が設定されている。ページング方式の場合、データセグメント内の内容が更新されたページはページ単位で匿名ページへと属性変更される。

exec()システムコールなどで新たにプロセスの仮想アドレス空間を設定した当初は、基本的にこのような仮想アドレス空間を管理するデータ構造がカーネル内に作成されるだけで、実際の実行ファイルの内容はロードされない。UNIX系システムでは、exec()システムコールからユーザ空間に制御が戻された瞬間にページフォールトが発生し、そこで初めてページ単位に実行ファイルの内容がロードされる。性能向上目的で事前にマッピングを作成する場合もある。

各プロセスの仮想アドレス空間のアドレス範囲は同じでありオーバーラップしているのが一般的である。これを多重仮想記憶と呼ぶ。MMUは現に実行中のプロセスの仮想空間のみを認識する。コンテキストスイッチでプロセスを切り替える際、MMUに対して仮想アドレス空間の切り替えも指示する必要があるが、その方式はアーキテクチャによって様々である。

同じプログラムを実行するプロセスが複数存在する場合、多重仮想記憶ではそれぞれが同じ仮想アドレスに実行ファイルをマッピングしていながら、それぞれ独立した仮想空間を使用する。このため、実行ファイルを配置する仮想アドレスはどのプロセスでも同じにすることができ、実行ファイル自体に配置すべきアドレスを格納しておくようになっているのが一般的である。また、それぞれのプロセスが実行ファイルのテキストセグメントをマッピングするのに使う物理メモリは共有することができる。他にもmmapでファイルをマッピングする場合や共有メモリ機能でプロセス間の通信を行う場合、マッピングされる物理メモリが共有される。

なお、アーキテクチャによっては、多重仮想記憶がオーバーラップしていると捉えず、全仮想空間がフラットに並んだ巨大な仮想空間を想定することもある。この場合、仮想空間識別番号が巨大な仮想空間のアドレスの一部と考えられる。もっとも、これは単にモデル化の手法が違うだけで実装に大きな違いがあるわけではない。実際、各ユーザープロセスが自分の仮想空間識別番号以外の仮想空間にアクセスすることはできない。

歴史

仮想記憶技術が開発される以前、1940年代から1950年代のプログラマは2レベルの記憶装置(主記憶あるいはRAMと、磁気ディスク装置あるいは磁気ドラムメモリといった二次記憶)を直接管理する必要があった。

仮想記憶は1959年1962年マンチェスター大学Atlas上で開発され、1962年に完成した。なお、ドイツの初期の情報工学者 Fritz-Rudolf Güntsch (後に Telefunken TR 440 というメインフレームを開発)は 1957年の博士論文 Logischer Entwurf eines digitalen Rechengerätes mit mehreren asynchron laufenden Trommeln und automatischem Schnellspeicherbetrieb(複数非同期ドラム装置と自動高速メモリモードを持つデジタル計算機の論理概念)で仮想記憶のコンセプトを発明していたと言われている。

1961年バロースは世界初の仮想記憶をサポートした商用コンピュータ B5000 をリリースした。

コンピュータ史上の多くの技術と同様、仮想記憶にも様々な曲折があった。安定した技術と見なされるまで、仮想記憶の様々な問題点を解決しようとするモデルや実験や理論が開発された。仮想アドレスを物理アドレスに変換するハードウェア機構の開発も必然的だったが、それをコストに見合わないと考える者もいた。1965年MITが開発したMultics以降、本格的に採用され始めた。

1969年、商用コンピュータでの仮想記憶に関する論争は事実上終結した。David Sayre 率いるIBMの研究チームが仮想記憶システムが手動制御システムよりも優位にあることを示したのである。

1970年、IBMはSystem/370シリーズのOSであるDOS/VS、OS/VS1、OS/VS2(後のMVS)で仮想記憶をサポートした。以後の各社メインフレームでは仮想記憶が一般的となる。

1976年DECミニコンピュータ VAXシリーズのOSであるVMSで仮想記憶をサポートした。

しかし、1980年代の初期のパーソナルコンピュータでは仮想記憶は採用されていない。これは当時のマイクロプロセッサの性能や機能の問題もあるし、個人用のコンピュータに仮想記憶が必要になると見なされていなかったという面もある。当時の主流はバンク切り換えによるメモリ増設だった。仮想記憶が導入されたのは、OS/21987年)、Microsoft Windows 3.01990年)、MacintoshSystem 71991年)、Linuxカーネル 0.11+VM(1991年)などが最初である。

Windowsの場合

Microsoft Windows (Windows) では1990年に 3.0 から仮想記憶がサポートされた。これは、Windows 1.0 および Windows 2.0 の問題に対応する試みだった。Windows 3.xには隠しファイルとして 386SPART.PAR あるいは WIN386.SWP があり、これらが仮想記憶用スワップファイルとして使われている。通常、ルートディレクトリにあるが、WINDOWSディレクトリなど他の場所に置くこともある。そのサイズはコントロールパネルから設定される仮想メモリサイズで決定される。ユーザーがこのファイルを削除したり移動させたりするとシステムがクラッシュする。

Windows 95も同様のファイルを使用している。そのファイルはページファイルと呼ばれ、デフォルトでは物理メモリ容量の1.5倍のサイズである。最大では物理メモリ容量の3倍のサイズにまで拡張可能。ユーザーがメモリ容量の小さいシステム上で大量にメモリを使用するアプリケーションを使用する場合、ページファイルのサイズをデフォルトよりも大きくしておくのが良い。

Windows NTベースのWindows(Windows 2000Windows XPWindows Vistaを含む)では、pagefile.sys という名前になっている。デフォルトの場所はWindowsのインストールされたパーティションのルートディレクトリである。Windowsでは任意のドライブの空き領域をページファイルとして使用できる。

ページングファイルのサイズには初期サイズと最大サイズがあり、ページングファイルが不足するとページングファイルは最大サイズまで拡張される。拡張されたページングファイルは再起動するまで小さくならない。

ページングファイルがあると、積極的なクリーニングにより物理メモリで足りる場合であってもページファイルへの書き出しが行われる。積極的なクリーニングは仮想記憶を実装するページ置換アルゴリズムの一つで、CPUの余剰時間を使ってページ内容をディスクに書き出しクリーンな状態にしておき、ページが必要になった時に短時間でページを再利用する手法である。勿論クリーンな状態のページ内容そのものが必要になった時には、ページファイル上のページ内容を無視するだけで良いので、オーバーヘッドは発生しない。

Windows XP以降ではページファイルを使用しないオプションが選択できる。もちろんこれは物理メモリの容量が十分に足りている場合にのみ選択すべきオプションである。ページファイルを使用しない場合、ほとんど使用されない常駐ソフトなどのデータをスワップアウトすることができなくなるので、キャッシュとして使える物理メモリの空き領域が減ってパフォーマンスが低下することがある。


ページファイルのフラグメンテーション

ページファイルは使っているうちにフラグメンテーションが発生し、性能に悪影響を与えると考える者もいる。これに対する助言としては、ページファイルのサイズを固定することでWindowsがそのサイズを変更できないようにするという対策がある。ただし、それによってアプリケーションが仮想メモリサイズ以上のメモリを要求した場合に問題が発生することを心配する人もいるだろう。そのような場合、メモリの確保に失敗するとメモリを要求したプログラムが動作を継続できなくなるだけである。OSがクラッシュすると誤解する人もいるが、Windowsカーネルはメモリープールを持っており、OS自体がクラッシュする事は無い。またページファイルが拡張されなければならないような急激なメモリ確保を要求した場合、そのメモリ確保要求は失敗する。ページファイルの拡張はシステム全体の統計から計算され、メモリ要求が来る前に事前に確保されている。

別の見方として、ページファイルが先頭から順にシーケンシャルにアクセスされることはないから、フラグメンテーションを防いでも意味がないと考える人もいる。もっとも、仮にページファイルがハードディスクの先端・終端トラックに断片化しているとすればヘッドシークによりスラッシングを引き起こしうる。いずれにしてもメモリを大量に使用するアプリケーションを使うならページファイルが大きいに越したことはないし、ディスク容量を余分に使用する以外に問題はない。

ページファイルは任意のドライブに作成する事ができる。これはUNIX同様スワップ専用のパーティション割り当てが行えるのに等しい。またページファイルはストライピングが行われるので複数のハードディスクドライブに小分けにしてページファイルを作成すると、ページング速度が向上する。

物理メモリ以上のメモリを常に使うような使い方をする場合、ページファイルのデフラグメンテーションをすることで性能が改善する可能性もある。しかし、根本的には物理メモリを追加する方が性能改善に役立つ。

Mac OSMac OS Xにおける仮想記憶

System 7から「仮想メモリ」として実装される。当時はコントロールパネルでメモリサイズ(メインメモリのサイズを加算した値)を指定し機能を入にすることで使用できるようになる。すると起動ディスクに隠しファイルとしてスワップファイルが作成される。スワップファイルは指定したメモリサイズの大きさとなり、これ以上は増えない。この頃の仮想メモリは使用しているかどうかでプログラムの動作が不安定になることがあった。そのため、プログラムのパッケージや説明書には仮想メモリの設定を確認させる記述が見られる。

Mac OS XではUNIX系をベースとしたことで仮想メモリは常に使用するようになっており、コンピュータの起動時から64MBのスワップファイルが1つ作成されている。場所は /private/var/vm/ 以下で、swapfilenという名前がつけられている(nは0からの数字)。容量が不足するとスワップファイルは自動的に追加される。swapfile1までは64MB、以降のスワップファイルのサイズは128MB、256MB...と8の倍数で増えるのが基本だが、メモリの最大容量・ハードディスクの空き容量の1/4・1GBのいずれか小さい方を選択し容量が決定する[1]。ひとつのスワップファイルが大きくなるのではなく複数のファイルが作成される。すなわちスワップファイルが4つなら64+64+128+256で合計512MBとなる。 スワップファイルの場所はコマンドライン操作などで他のデバイスに変更できる。

スワップファイルを削除するアプリケーションも存在し、これを用いなくとも削除できる(ただし削除後は再起動するのが望ましい)。また、一旦ログアウトしてからログインしなおすと再起動することなく削除できる。

Mac OSの仮想記憶は多重仮想記憶では無く、OSと全てのアプリケーション全体が単一レベルの仮想空間上で動作する様になっている。Mac OS Xでは多重仮想記憶がサポートされ、仮想空間はプロセス毎に資源が分離されている。この違いが、Mac OSとMac OS Xでの仮想記憶に対する信頼性の違いとなって現れている。

Template:節stub

LinuxとBSDにおけるスワップ制御

LinuxおよびBSD系オペレーティングシステムでは、ハードディスクのパーティションを丸ごとスワップに使用することが多い。通常のファイルをスワップファイルとして使うこともできるが、フラグメンテーション問題を回避して性能を維持するためにもパーティションの使用が推奨されている。また、スワップパーティションを使うと、スワップ領域をディスク内の最も高速アクセス可能な場所に配置できる。最近のハードディスクでは、先頭の方がよいとされている。

Linuxは32個のスワップデバイスをサポートし、それぞれに優先度を設定できる。オペレーティングシステムが物理メモリをスワップアウトする場合、最高優先度のデバイスの空き領域から使っていく。同じ優先度に複数のデバイスがある場合、それらはRAID 0と同様の使い方をされる。これによって並列的に複数のデバイスにアクセスするので性能が向上する。従って優先度の設定には注意が必要である。例えば、同じドライブ上の複数のスワップ領域を同じ優先度にするのは得策ではない。また、高速なデバイスを高優先度に設定するのが性能的に有利である。

Linuxシステムでスワップを追加するには、その前にスワップ領域を作成しなければならない。パーティションならば一般のパーティション作成ツールが使用できる。通常ファイルの場合、ddコマンドと /dev/zeroを使って内容がゼロのファイルを作ることができる。作成したスワップ領域は mkswap<tt> filename/device でフォーマットし、<tt>swaponおよびswapoffコマンドでON/OFFを制御する。

Microsoft Windowsとは違い、物理メモリに入りきらない場合のみ、スワップが利用される。これは積極的なクリーニングが実装されていないためで、ページングが開始された時システムは著しい速度低下を起こす。しかし、これは物理メモリが飽和状態を続けている場合さほど深刻では無い。メモリが飽和すればあまり利用されないページは自ずとハードディスクに追い出され、物理メモリには有用なページが残される様になる。

ビデオカード上のメモリをスワップ領域として使用する試みもある[2]。最近のビデオカードは128~256メガバイトのメモリを搭載しているものもあるが、ゲームでもしない限りそれを全部使用することはない。ビデオメモリはハードディスクよりずっと高速であり、スワッピング性能が劇的に向上する。

Linuxカーネル 2.6 において Con Kolivas が実験的な改善を行い、彼のサイトで公開している。"Swap Prefetch" と呼ばれるこの改善は、物理メモリに余裕がある場合、システムが何もしておらず性能への影響がないアイドル状態のときに、事前にスワップファイルの内容をプリフェッチ(事前に読み込んでおくこと)する機構である。これは性能向上に大きな効果がある。

脚注

Template:脚注ヘルプ<references />

参考文献

  • John L. Hennessy, David A. Patterson, Computer Architecture, A Quantitative Approach (ISBN 1-55860-724-2)

関連項目

Template:仮想化ar:ذاكرة افتراضية be-x-old:Віртуальная памяць ca:Memòria virtual cs:Virtuální paměť da:Virtuel hukommelse de:Virtuelle Speicherverwaltung en:Virtual memory es:Memoria virtual eu:Alegiazko memoria fa:حافظه مجازی fi:Näennäismuisti fr:Mémoire virtuelle gl:Memoria virtual he:זיכרון וירטואלי hi:वर्चुअल मेमोरी (आभासी स्मृति) hu:Virtuális memória id:Memori virtual it:Memoria virtuale ko:가상 메모리 lt:Virtualioji atmintis ms:Ingatan maya nl:Virtueel geheugen no:Virtuell hukommelse pl:Pamięć wirtualna pt:Memória virtual ru:Виртуальная память simple:Virtual memory sk:Virtuálna pamäť sl:Navidezni pomnilnik sv:Virtuellt minne tr:Sanal bellek uk:Віртуальна пам'ять vi:Bộ nhớ ảo zh:虚拟内存

個人用ツール