コンピュータ オペレーティングシステムにおいて、メモリページングは、プログラムが使用する物理メモリが非連続であることを可能にするメモリ管理方式です。 [1]これにより、メモリの断片化の問題を回避し、断片化を軽減するために圧縮が必要になることもありません。
ページングは、アドレス空間の合計サイズがシステムの物理メモリを超えることを可能にするために、ページフレームの割り当てと解放、および二次記憶装置へのページの格納と二次記憶装置からのページの取得という関連技術[a]と組み合わせられることがよくあります。 [2]歴史的な理由から、この技術はスワッピングと呼ばれることもあります。
仮想記憶と組み合わせると、ページング仮想記憶と呼ばれます。この方式では、オペレーティングシステムは二次記憶装置から同じサイズのブロック(ページ)単位でデータを取得します。ページングは、現代のオペレーティングシステムにおける仮想記憶実装の重要な部分であり、二次記憶装置を使用することで、プログラムが利用可能な物理メモリのサイズを超えることを可能にします。
論理アドレスを物理アドレスに効率的に変換するには、ハードウェアによるサポートが必要です。そのため、ページングメモリ機能は通常、メモリ管理ユニット(MMU)またはメモリ保護ユニット(MPU)を介してCPUにハードワイヤードされており、オペレーティングシステムのカーネル内の特権システムコードによって個別に有効化されます。例えば、 x86 命令セットアーキテクチャ(ISA)を実装したCPUでは、メモリページングはCR0制御レジスタを介して有効化されます。
1960年代、スワッピングは初期のメモリ管理技術でした。プログラム全体またはセグメント全体がランダムアクセスメモリ(RAM)からディスクまたはドラムに「スワップアウト」(または「ロールアウト」)され、別のプログラムがスワップイン(または「ロールイン」)されました。[3] [4]スワップアウトされたプログラムは現在の状態を保ちますが、RAMが別のプログラムによって使用されている間は実行が中断されます。スワップアウトされたセグメントを持つプログラムは、そのセグメントが必要になるまで実行を継続できますが、そのセグメントが必要になると、スワップインされるまで実行が中断されます。
プログラムには、異なるタイミングで同じメモリを占有する複数のオーバーレイが含まれる場合があります。オーバーレイはRAMを二次記憶装置にページングする方法ではなく[a]、単にプログラムのRAM使用量を最小限に抑えるものです。その後のアーキテクチャではメモリセグメンテーションが採用され、個々のプログラムセグメントが二次記憶装置とRAM間で交換される単位となりました。セグメントとは、プログラムのコードセグメント全体、データセグメント、あるいは場合によっては他の大規模なデータ構造を指します。これらのセグメントはRAM上に常駐する際に連続している必要があり、断片化を解消するために追加の計算と移動が必要でした[5]。
フェランティのアトラスとマンチェスター大学で開発されたアトラススーパーバイザ[6](1962)は、メモリページングを実装した最初のシステムでした。その後のページングをサポートする初期のマシンとそのオペレーティングシステムとしては、IBM M44/44XとそのMOSオペレーティングシステム(1964年)、[7] SDS 940 [8]とバークレータイムシェアリングシステム(1966年)、修正されたIBMシステム/360モデル40とCP-40オペレーティングシステム(1967年)、IBMシステム/360モデル67とTSS/360、CP/CMS、ミシガンターミナルシステム(MTS)などのオペレーティングシステム(1967年)、 RCA 70/46とタイムシェアリングオペレーティングシステム(TSOS)(1967年)、GE 645とMultics(1969年)、BBN設計のページングハードウェアとTENEXオペレーティングシステムが追加されたDEC PDP-10(1969年)などがあります。
これらのマシン、およびメモリページングをサポートする後継マシンは、ページアドレスレジスタのセットまたはメモリ内ページテーブル[d]のいずれかを使用して、プロセッサがRAM内の任意のページを、一見連続した論理アドレス空間として操作できるようにしました。これらのページは、二次記憶装置[a]とRAM間で交換される単位となりました。
プロセスがRAM内のページフレームに現在マップされていないページを参照しようとすると、プロセッサはこの無効なメモリ参照をページフォールトとして扱い、プログラムからオペレーティングシステムに制御を移します。オペレーティングシステムは以下を実行する必要があります。
すべてのページフレームが使用中の場合、オペレーティングシステムは、プログラムが現在必要としているページのために再利用するページフレームを選択する必要があります。追い出されたページフレームが、プログラムによってデータを保持するために動的に割り当てられたものである場合、またはRAMに読み込まれた後にプログラムによって変更された場合(つまり、「ダーティ」状態になった場合)、そのページは解放される前に二次記憶装置に書き出されなければなりません。その後、プログラムが追い出されたページを参照すると、別のページフォールトが発生し、そのページをRAMに再度読み込まなければなりません。
オペレーティング システムが再利用するページ フレームを選択する方法、つまりページ置換アルゴリズムは、効率に影響します。オペレーティング システムは、通常、最近最も使われていない(LRU) アルゴリズム、またはプログラムのワーキング セットに基づくアルゴリズムを使用して、すぐに必要になる可能性が最も低いページ フレームを予測します。応答性をさらに高めるために、ページング システムはすぐに必要になるページを予測し、プログラムが参照する前にそれらのページを事前に RAM にロードし、長期間参照されていないページからページ フレームを盗んで使用可能にします。システムによっては、セキュリティを侵害するデータ漏洩を回避するために新しいページをクリアしたり、デバッグを容易にするためにインストール時に定義された値またはランダムな値にページを設定したりします。
純粋なデマンドページングを使用する場合、ページは参照された場合にのみロードされます。メモリマップドファイルからのプログラムは、RAM上にページが存在しない状態で実行を開始します。プログラムがページフォールトをコミットすると、オペレーティングシステムは必要なページをファイル(メモリマップドファイル、ページングファイル、またはページデータを含むスワップパーティションなど)からRAMにコピーします。
一部のシステムでは、ページが実際に要求されるまで待機してから RAM にロードする、 デマンド ページングのみを使用します。
他のシステムでは、RAM に存在しないページのうち、すぐに必要になる可能性が高いページを推測し、そのページが要求される前に RAM にプリロードすることで、レイテンシを削減しようとします。(これは多くの場合、現在 RAM に存在するページのうち、すぐに必要になる可能性が低いページを推測し、それらをストレージにプリライトするプリクリーニングと組み合わせて行われます。)
ページフォールトが発生すると、先行ページングシステムは参照されているページだけでなく、すぐに参照される可能性のある他のページも読み込みます。単純な先行ページングアルゴリズムでは、まだ必要でなくても、次の数ページを読み込みます(参照の局所性を用いた予測)。これはCPUのプリフェッチ入力キューに似ています。スワッププリフェッチは、十分な空きページがある場合、最近スワップアウトされたページをプリフェッチします。[9]
プログラムが終了すると、ユーザーが同じプログラムを再度実行する場合に備えて、オペレーティング システムはページの解放を遅らせることがあります。
一部のシステムではアプリケーションヒントが許可されており、アプリケーションはページを利用可能にすることを要求し、遅延なく続行することができます。
空きページキューは、割り当て可能なページフレームのリストです。このキューが空にならないようにすることで、ページフォールトの処理に必要な計算量を最小限に抑えることができます。一部のオペレーティングシステムは、最近参照されていないページを定期的に検索し、ページフレームを解放して空きページキューに追加します。このプロセスは「ページスチール」と呼ばれます。一部のオペレーティングシステム[e]はページ回収をサポートしています。つまり、プログラムがスチールされたページを参照してページフォールトを起こした場合、オペレーティングシステムはこれを検出し、RAMに内容を読み込むことなくページフレームを復元します。
オペレーティングシステムは定期的にダーティページを事前消去することがあります。つまり、変更されたページがさらに変更される可能性があっても、それを二次記憶装置[a]に書き戻すことです。これにより、新しいプログラムの起動時や新しいデータファイルのオープン時に新しいページフレームを取得するために必要な消去処理の量が最小限に抑えられ、応答性が向上します。(Unixオペレーティングシステムは定期的にsyncを使用してすべてのダーティページを事前消去します。Windowsオペレーティングシステムは「変更ページ書き込み」スレッドを使用します。)
一部のシステムではアプリケーションヒントが許可されており、アプリケーションはページのクリアまたはページアウトを要求して、遅延なく続行することができます。
初期化が完了すると、ほとんどのプログラムは、プログラムが必要とするメモリの総量に比べて少ない数のコードページとデータページで動作します。最も頻繁にアクセスされるページはワーキングセットと呼ばれます。
ワーキングセットがシステム全体のページ数のわずかな割合を占める場合、仮想記憶システムは最も効率的に動作し、ページフォールトの解決に費やされる計算量はごくわずかです。ワーキングセットが大きくなるにつれて、ページフォールトの解決は管理可能な範囲に留まりますが、その増加が臨界点に達するとフォールト数は急増し、その解決にかかる時間がプログラム本来の計算時間を圧倒します。この状態はスラッシングと呼ばれます。スラッシングは、巨大なデータ構造を扱うプログラムで発生します。巨大なワーキングセットは継続的なページフォールトを引き起こし、システムの速度を大幅に低下させるからです。ページフォールトを解決するには、すぐに二次記憶装置から再読み込みが必要になるページを解放する必要がある場合があります。[a]「スラッシング」は仮想記憶システム以外の文脈でも使用されます。例えば、コンピューティングにおけるキャッシュの問題や、ネットワークにおける「シリー・ウィンドウ・シンドローム」などです。
VAXプロセッサでは最悪のケースが発生する可能性があります。ページ境界を越える単一のMOVL命令では、ソースオペランドが変位遅延アドレッシングモードを使用し、オペランドアドレスを含むロングワードがページ境界を越え、デスティネーションオペランドが変位遅延アドレッシングモードを使用し、オペランドアドレスを含むロングワードがページ境界を越え、ソースとデスティネーションの両方がページ境界を越える可能性があります。この単一の命令は10ページを参照します。すべてのページがRAM上にない場合は、各ページごとにページフォールトが発生します。各フォールトが発生するたびに、オペレーティングシステムは広範なメモリ管理ルーチンを実行する必要があり、他のプロセスのページをディスクに書き込んだり、アクティブプロセスのページをディスクから読み取ったりするなど、複数のI/Oが発生する可能性があります。オペレーティングシステムがこのプログラムに10ページを割り当てることができない場合、ページフォールトを修正すると、命令に必要な別のページが破棄され、命令を再開すると再びフォールトが発生します。
過剰なページングを減らしてスラッシング問題を解決するには、同時に実行するプログラム数を減らすか、コンピューターの RAM の量を増やすことで、プログラムごとに使用可能なページ数を増やすことができます。
マルチプログラミングまたはマルチユーザー環境では、コードとデータが別々のページに記述された同じプログラムを、多くのユーザーが実行することがあります。RAMの使用量を最小限に抑えるため、すべてのユーザーがプログラムの単一のコピーを共有します。各プロセスのページテーブルは、コードに対応するページが単一の共有コピーを指し、データに対応するページがプロセスごとに異なる物理ページを指すように設定されています。
異なるプログラムが同じライブラリを使用する場合もあります。メモリ容量を節約するため、共有ライブラリは物理メモリに1つのコピーのみがロードされます。同じライブラリを使用するプログラムは、同じページ(ライブラリのコードとデータを含むページ)にマッピングされる仮想アドレスを持ちます。プログラムがライブラリのコードを変更する場合、コピーオンライト方式が使用されるため、必要な場合にのみメモリが割り当てられます。
共有メモリは、プログラム間の効率的な通信手段です。プログラムはメモリ内のページを共有し、書き込みと読み取りを行うことでデータを交換できます。
ページングをサポートした最初のコンピュータは、1963年にフェランティ、マンチェスター大学、プレッシーによって共同開発されたスーパーコンピュータ「アトラス」 [ 10] [11] [12]であった。このマシンは、512ワードのページごとに1つのエントリを持つ連想メモリ(連想メモリ)を備えていた。スーパーバイザ[13]は、非等価割り込み[f]を処理し、コアとドラム間のページ転送を管理することで、プログラムに1階層のストア[14]を提供した。
ページングは、1990年のWindows 3.0以降、Microsoft Windowsの機能です。Windows 3.xは、スワップファイルとして使用するために、またはという名前の隠しファイルを作成します。このファイルは通常ルートディレクトリにありますが、他の場所(通常はWINDOWSディレクトリ)に存在する場合もあります。このファイルのサイズは、システムのスワップ領域のサイズ(コントロールパネル→「仮想メモリ」の「拡張」でユーザーが選択した設定)によって異なります。ユーザーがこのファイルを移動または削除すると、次回Windowsを起動したときにブルースクリーンが表示され、「永続スワップファイルが壊れています」というエラーメッセージが表示されます。ユーザーは、ファイル(存在しない場合でも)を削除するかどうかを選択するように求められます。
386SPART.PARWIN386.SWP
Windows 95、Windows 98、Windows Meも同様のファイルを使用しており、その設定はコントロールパネル → システム → パフォーマンスタブ → 仮想メモリにあります。Windowsはページファイルのサイズを物理メモリの1.5倍から自動的に設定し、必要に応じて物理メモリの3倍まで拡張します。物理メモリの少ないシステムでメモリを大量に消費するアプリケーションを実行する場合は、これらのサイズをデフォルトよりも高い値に手動で設定することをお勧めします。
Windows NTファミリでページングに使用されるファイルはですpagefile.sys。ページファイルのデフォルトの場所は、Windowsがインストールされているパーティションのルートディレクトリです。Windowsは、ページファイル用に利用可能なドライブの空き領域を使用するように構成できます。ただし、システムがブルースクリーンオブデスの後にカーネルダンプまたは完全メモリダンプを書き込むように構成されている場合は、ブートパーティション(つまり、Windowsディレクトリを含むドライブ)にページファイルが存在する必要があります。Windowsは、ページングファイルをメモリダンプの一時ストレージとして使用します。システムを再起動すると、Windowsはページファイルからメモリダンプを別のファイルにコピーし、ページファイルで使用されていた領域を解放します。[15]
Windowsのデフォルト設定では、ページファイルは必要に応じて初期割り当てを超えて拡張できます。これが徐々に進むと、ページファイルが大きく断片化され、パフォーマンスの問題を引き起こす可能性があります。[16]これを回避するための一般的なアドバイスは、Windowsがページファイルを拡張しないように、単一の「ロックされた」ページファイルサイズを設定することです。しかし、ページファイルはいっぱいになった場合にのみ拡張され、デフォルト設定では物理メモリの総量の150%になります。[17]したがって、ページファイルが拡張されるには、ページファイルでバックアップされた仮想メモリの総需要がコンピュータの物理メモリの250%を超える必要があります。
ページファイルの拡張時に発生する断片化は一時的なものです。拡張された領域が使用されなくなると(次回の再起動時、あるいはそれより早く)、追加のディスク領域割り当てが解放され、ページファイルは元の状態に戻ります。
Windows アプリケーションが物理メモリとページ ファイルの合計サイズよりも多くのメモリを要求した場合、ページ ファイル サイズのロックによって問題が発生する可能性があり、メモリ割り当て要求が失敗して、アプリケーションやシステム プロセスが失敗する可能性があります。また、ページ ファイルが順番に読み書きされることはまれなので、完全に順番にページ ファイルを読み書きすることによるパフォーマンス上の利点はごくわずかです。ただし、ページ ファイルが大きいと、通常、メモリを大量に消費するアプリケーションを使用でき、ディスク領域の使用が増える以外にペナルティはありません。ページ ファイルの断片化自体は問題にならないかもしれませんが、可変サイズのページ ファイルの断片化によって、時間の経過とともにドライブ上に断片化されたブロックがいくつか作成され、他のファイルも断片化されるようになります。このため、割り当てられたサイズがすべてのアプリケーションのニーズに対応できる大きさであれば、固定サイズの連続したページ ファイルの方が適しています。
必要なディスク容量は、より新しい仕様のシステム(例えば、750 GBのディスクドライブに6 GBの固定サイズのページファイルを持つ3 GBのメモリを搭載したシステム、または6 GBのメモリと16 GBの固定サイズのページファイル、そして2 TBのディスク容量を持つシステム)であれば簡単に割り当てることができます。どちらの例でも、ページファイルが最大まで拡張された状態では、システムはディスク容量の約0.8%を使用します。
Windowsシステムが慢性的に総物理メモリ量よりもはるかに多くのメモリを使用している場合、パフォーマンスを向上させるためにページファイルのデフラグが推奨されることもあります。 [18]この考え方は、一時的な拡張効果を除けば、ページファイルは時間の経過とともに断片化されないという事実を無視しています。一般的に、ページファイルアクセスに関連するパフォーマンスの問題は、物理メモリを増設することでより効果的に解決できます。
Unixシステムやその他のUnix系オペレーティングシステムでは、物理RAMがいっぱいになった場合にディスク領域をRAMに置き換える動作を「スワップ」という用語で表現します。[19]これらのシステムの中には、ハードディスクのパーティション全体をスワップ専用にするのが一般的です。これらのパーティションはスワップパーティションと呼ばれます。多くのシステムには、データドライブとは別に、スワップパーティションのみを含むスワップ専用のハードドライブがあります。スワップ専用のハードドライブは「スワップドライブ」または「スクラッチドライブ」または「スクラッチディスク」と呼ばれます。これらのシステムの中には、スワップパーティションへのスワップのみをサポートするものもあれば、ファイルへのスワップもサポートするものもあります。
Linuxカーネルは、事実上無制限の数のスワップバックエンド(デバイスまたはファイル)をサポートし、バックエンドの優先順位の割り当てもサポートしています。カーネルが物理メモリからページをスワップアウトする際、空き領域を持つ最も優先順位の高いバックエンドを使用します。複数のスワップバックエンドに同じ優先順位が割り当てられている場合、それらはラウンドロビン方式( RAID 0ストレージレイアウトに似ています)で使用され、基盤となるデバイスに効率的に並列アクセスできる限り、パフォーマンスが向上します。[20]
エンドユーザーの観点から見ると、Linuxカーネルバージョン2.6.x以降のスワップファイルは、スワップパーティションとほぼ同等の速度です。ただし、スワップファイルは基盤となるファイルシステム上で連続的に割り当てられる必要があるという制限があります。スワップファイルの性能を向上させるため、カーネルは基盤となるデバイス上のスワップファイルの配置場所のマップを保持し、直接アクセスすることでキャッシュをバイパスし、ファイルシステムのオーバーヘッドを回避します。[21] [22]回転磁気媒体デバイスであるHDD上にスワップパーティションを配置する場合、スワップパーティションを使用する利点の1つは、連続したHDD領域に配置できることです。これにより、データスループットが向上し、シークタイムも短縮されます。しかし、スワップファイルの管理上の柔軟性は、スワップパーティションの利点を上回る場合があります。例えば、スワップファイルはマウントされた任意のファイルシステム上に配置でき、任意のサイズに設定でき、必要に応じて追加または変更できます。しかし、スワップパーティションはそれほど柔軟ではありません。パーティション管理ツールやボリューム管理ツールを使用せずに拡張することはできず、これらのツールは様々な複雑さと潜在的なダウンタイムをもたらします。
SwappinessはLinuxカーネルパラメータであり、空きメモリでメモリ割り当て要求を満たすことができない場合に、システムページキャッシュからページを削除するのではなく、ランタイムメモリからスワップアウトする割合を制御する。Swappinessは0から200までの値に設定できる。[23]低い値を設定すると、カーネルはページキャッシュからページを追い出すことを優先し、高い値を設定すると、「コールド」メモリページをスワップアウトすることを優先する。デフォルト値は0である。高い値に設定すると、コールドページをスワップインする必要がある場合(例えば、アイドル状態だったプログラムと対話する場合)、レイテンシが高くなる可能性がある。一方、低い値(0でも)に設定すると、キャッシュから追い出されたファイルを再度読み込む必要がある場合にレイテンシが高くなる可能性があるが、コールドページをスワップバックする必要が少なくなるため、対話型プログラムの応答性は向上する。また、スワップはランダム書き込みを多く伴うためHDDの速度をさらに低下させる可能性があるが、 SSDにはこの問題はない。確かにデフォルト値はほとんどのワークロードでうまく機能しますが、予想されるタスクを実行するデスクトップやインタラクティブシステムでは設定を下げ、バッチ処理やインタラクティブ性の低いシステムでは設定を上げる必要があるかもしれません。[24]60
システムメモリが現在のタスクに対して著しく不足し、メモリアクティビティの大部分が低速スワップを経由する場合、CPUがアイドル状態であっても、システムは実質的にタスクを実行できなくなる可能性があります。すべてのプロセスがスワップを待機している場合、システムはスワップデス状態にあるとみなされます。[25] [26]
スワップの死は、メモリのオーバーコミットの設定ミスによって発生する可能性があります。[27] [28] [29]
「スワッピング・トゥ・デス」問題の最初の記述は、Xサーバーに関連しています。Xサーバーがキー入力に応答するために使用するコードまたはデータがメインメモリに存在しない場合、ユーザーがキー入力を行うと、サーバーは1つ以上のページフォールトを発生させ、キー入力を処理する前にそれらのページをスワップから読み込まなければならず、キー入力への応答が遅くなります。これらのページがメモリに残っていない場合、次のキー入力を処理するために再度フォールト処理を行わなければならず、他のタスクは正常に実行されているにもかかわらず、システムは実質的に応答しなくなります。[30]
macOSは複数のスワップファイルを使用します。デフォルト(Apple推奨)のインストールでは、スワップファイルはルートパーティションに配置されますが、別のパーティションまたはデバイスに配置することも可能です。[31]
AmigaOS 4.0では、RAMの割り当てと物理メモリのデフラグメンテーションのための新しいシステムが導入されました。このシステムも、デフラグできないフラットな共有アドレス空間を使用しています。これは、スラブ割り当てとスワップを可能にするページングメモリに基づいています。ページングはAmigaOS 4.1で実装されました。物理メモリが使い果たされると、システムがロックする可能性があります。[32] スワップメモリは有効/無効を切り替えることができ、ユーザーは物理RAMのみを使用するように選択できます。
仮想記憶オペレーティングシステムのバッキングストアは、通常、RAMよりも桁違いに低速です。例えばハードディスクは、読み取りまたは書き込みが開始されるまでに数ミリ秒の遅延が発生します。そのため、可能な限りスワッピングを減らすか、完全に排除することが望ましいです。一部のオペレーティングシステムでは、カーネルの決定に影響を与える設定が提供されています。
/proc/sys/vm/swappinessDisablePagingExecutiveカーネル モード コードとデータがページ アウトの対象となるかどうかを制御するレジストリ設定が提供されています。多くのUnix 系オペレーティング システム ( AIX、Linux、Solarisなど) では、パフォーマンスを向上させるために、スワップ領域に複数のストレージ デバイスを並行して使用できます。
一部の古い仮想メモリオペレーティングシステムでは、プログラムが実行時データ用のメモリを割り当てる際に、スワップバックアップストアの領域が予約されます。オペレーティングシステムベンダーは通常、スワップ領域をどの程度割り当てるべきかに関するガイドラインを発行しています。
ページングは、プロセスが使用するアドレスのサイズ (プロセスの「仮想アドレス空間」または「論理アドレス空間」) を、特定のコンピュータに実際にインストールされているメイン メモリの量 (物理アドレス空間) と異なるようにする 1 つの方法です。
ほとんどのシステムでは、プロセスの仮想アドレス空間のサイズは利用可能なメインメモリよりもはるかに大きくなります。[35]例えば:
真のnビットアドレッシングを備えたコンピュータには、2 n 個のアドレス指定可能なRAMユニットが搭載されている場合があります。例えば、4GBのメモリを搭載し、物理アドレス拡張(PAE)を備えていない32ビットx86プロセッサが挙げられます。この場合、 プロセッサは搭載されているRAMのすべてをアドレス指定でき、それ以上の アドレス指定はできません。
しかし、この場合でも、ページングを使用することで、物理メモリよりも多くの仮想メモリをサポートできます。例えば、多くのプログラムが同時に実行される場合、それらのプログラムがシステムにインストール可能な物理メモリよりも多くの物理メモリを必要とすることがありますが、そのすべてを一度にRAMに格納する必要はありません。ページングシステムは、どのメモリを二次記憶装置に割り当てるかを効率的に決定し、インストールされているRAMを最大限に活用します。
さらに、オペレーティングシステムは、搭載されているRAMの制限を超えてサイズが大きくなる可能性のあるファイルなど、より大きなメモリを必要とするプログラムにサービスを提供する場合があります。ファイルのすべてをプロセスのアドレス空間に同時にマッピングすることはできませんが、オペレーティングシステムはファイルの領域をアドレス空間にマッピングし、別の領域をマッピングする必要がある場合はマッピング解除することを許可する場合があります。
Magic-1、[35] 、一部のPDP-11マシン、物理アドレス拡張(PAD)を備えた32ビットx86プロセッサを搭載したシステムなど、一部のコンピュータでは、プロセスの仮想アドレス空間よりも大きなメインメモリを備えています。この場合、単一のプロセスは仮想アドレス空間よりも多くのメインメモリを使用できないため、ページングの大きな利点が失われます。このようなシステムでは、二次的な利点を得るためにページング技術がよく使用されます。
仮想アドレス空間の累計サイズは、依然として、使用可能な二次ストレージの量によって制限されます。