仮想記憶
Linuxのユーザプロセスから見れば、大局的にはメモリはCPUキャッシュ (L1, L2, ...)、メインメモリ、ファイルの順に階層化されており、上位(CPUにより近い)メモリは下位メモリのキャッシュに過ぎない。実行可能なファイルや共有ライブラリのテキストセグメントやmmapで明示的にマップされる名前付きファイルに対して、スワップエリアはスタックやヒープを保持する名無しファイルである(データセグメントやBSSセグメントは読み出し専用の実行可能ファイルや共有ライブラリファイルからプロセス固有の読み書き可能な無名ファイルに展開・コピーされると考えられる)。もちろん、実際にはカーネルは性能維持のためにスワップエリアの使用とアクセスを最小限にするような最適化の努力を払う(メインメモリに余裕があればスワップエリアには書き出さず「キャッシュ(メインメモリ)」だけにしか情報が保持されない)。
2.6のLinuxカーネルではスワップファイルはスワップパーティションと同程度の性能である。カーネルはスワップファイルの存在するディスク上の位置を把握しており、バッファキャッシュやファイルシステムのオーバヘッドを回避して直接ディスクにアクセスする。レッドハットはスワップパーティションの使用を推奨している。スワップパーティションの場合、ディスク上の位置を決めることができるので、スループットが最も高い場所に置くことができる。一方スワップファイルは管理の柔軟性という点でスワップパーティションに優っている。例えば、スワップファイルは任意のドライブ上に置くことができ、どんな大きさにもでき、必要に応じた追加や変更が容易であるだけでなく、ネットワークを介して外部ホスト上のリモートファイルを使うことも可能である。
ただし、これは絶対必要な機能ではなく、OSによっては仮想空間全体をユーザー空間としている。
仮想記憶によってアプリケーションプログラマの仕事はずっと単純になる。アプリケーションが必要とするメモリ容量を気にする必要はなく、必要なサイズの主記憶が使えるように見え、仮想アドレス空間全体の好きな場所にデータを配置することができる。プログラマは主記憶と補助記憶の間でデータをやりとりするのを気にしなくてもよい。もちろん、プログラマが大量のデータを扱う際の性能を考慮しなければならない場合、アクセスするデータがなるべく近いアドレスに配置されるよう注意して、ある時点で必要なメモリ量を減らし不要なスワッピングを回避しなければならない。
仮想記憶はコンピュータ・アーキテクチャの重要な部分であり、その実装にはハードウェア的サポートがほぼ必須である。メモリ管理ユニット (MMU) と呼ばれる部分であり、性能の都合もありCPUに組込まれることも多い。1960年代までのメインフレームの大部分は、基本的には仮想記憶をサポートしていなかった。1960年代のメインフレームで例外といえるものを以下に挙げる。
Atlas Supervisor(Atlas)
MCP(バロース B5000)
MTS、TSS/360、CP/CMS(IBM System/360 Model 67)
Multics(GE 645)
TSOS(RCA Spectra 70/46)
1980年代のパーソナルコンピュータで仮想記憶をサポートした例として Apple Lisa がある。
1962年に世界で初めてページングをサポートしたコンピュータAtlasは、フェランティ、マンチェスター大学、Plesseyが共同開発した。このマシンには連想メモリがあり、1エントリに512ワード長のページが対応している。スーパーバイザは非同値割り込みを処理し、磁気コアメモリと磁気ドラムメモリ間のページ転送を管理する。特筆すべきは、世界初の仮想記憶システムであるにもかかわらず、難しさなどから後のシステムでも実現例のあまり多くない、プログラムに単一レベル記憶を提供していることである。