ページ、メモリページ、または仮想ページは、仮想メモリの固定長連続ブロックであり、ページテーブル内の単一のエントリによって記述されます。これは、仮想メモリを使用するオペレーティングシステムにおけるメモリ管理の最小データ単位です。同様に、ページフレームは、オペレーティングシステムによってメモリページがマッピングされる物理メモリの最小固定長連続ブロックです。[ 1 ] [ 2 ] [ 3 ]
メインメモリとハードディスクドライブなどの補助記憶装置間のページ転送は、ページングまたはスワッピングと呼ばれます。 [ 4 ]
コンピュータのメモリは、情報をより速く見つけることができるようにページに分割されています。
この概念は、印刷された本のページ数に例えて名付けられました。例えば、読者が本の5,000番目の単語を見つけたい場合、最初の単語から数えることができます。これは時間のかかる作業です。読者が各ページに何語あるかのリストを持っていれば、はるかに早く作業できます。このリストから、5,000番目の単語がどのページにあるのか、そしてそのページの単語数を数えればよいのかを判断できます。本のページあたりの単語数のリストは、コンピュータのファイルシステムのページテーブルに似ています。[ 5 ]
ページサイズは通常、プロセッサアーキテクチャによって決定されます。従来、システム内のページサイズは4,096バイトなど、均一なサイズでした。しかし、プロセッサの設計では、その利点から、複数のページサイズ(場合によっては同時)が許容されることが多くなっています。最適なページサイズを選択する際には、いくつかの点を考慮する必要があります。[ 6 ]
ページサイズが小さいシステムでは、より多くのページが使用されるため、より多くのスペースを占めるページテーブルが必要になります。例えば、2 32の仮想アドレス空間が4 KiB(2 12バイト)のページにマッピングされている場合、仮想ページ数は2 20 = (2 32 / 2 12 ) となります。しかし、ページサイズを32 KiB(2 15バイト)に増やすと、必要なページ数は2 17ページのみになります。マルチレベルページングアルゴリズムは、ページテーブルをさらに小さなテーブルに分割することで、各プロセスに大きなページテーブルを割り当てるメモリコストを削減し、ページテーブルを効率的にページングします。
メモリへのアクセスはすべて仮想アドレスから物理アドレスにマッピングする必要があるため、ページテーブルを毎回読み取るのは非常にコストがかかります。そのため、非常に高速なキャッシュであるトランスレーション・ルックアサイド・バッファ(TLB)がよく使用されます。TLBのサイズには制限があり、特定の要求を満たすことができない場合(TLBミス)、正しいマッピングを行うためにページテーブルからマッピングを取得する必要があります(アーキテクチャに応じて、ハードウェア、ファームウェア、またはソフトウェアのいずれかを使用)。ページサイズが大きいほど、同じサイズのTLBキャッシュでより多くのメモリを管理できるため、コストのかかるTLBミスを回避できます。
プロセスが正確なページ数を必要とすることは稀です。そのため、最後のページは部分的にしか埋まらず、メモリがいくらか無駄になります。ページサイズが大きいほど、未使用の可能性のあるメモリ領域がメインメモリにロードされるため、メモリの無駄が大きくなります。ページサイズを小さくすると、割り当てに必要な実際のメモリ量に近くなります。
たとえば、ページ サイズが 1024 B であるとします。プロセスが 1025 B を割り当てる場合、2 つのページが使用されるため、未使用の領域は 1023 B になります (1 つのページが 1024 B を完全に消費し、もう 1 つのページが 1 B のみを消費します)。
回転ディスクからの転送では、遅延の大部分はシークタイム、つまり読み取り/書き込みヘッドをディスクプラッター上に正しく配置するのにかかる時間によって発生します。そのため、複数の小さな転送を分割するよりも、大きなサイズのシーケンシャル転送の方が効率的です。同じ量のデータをディスクからメモリに転送する場合、多くの場合、ページ数が多いほど転送時間は短くなります。
ほとんどのオペレーティングシステムでは、プログラムが実行時にページサイズを検出できます。これにより、プログラムはメモリ割り当てをこのサイズに合わせて調整し、ページの内部断片化を全体的に削減することで、メモリをより効率的に使用できます。
Unix系sysconf()システムでは、システム関数[ 7 ] [ 8 ] [ 9 ] [ 10 ] [ 11 ]を使用することがあります。これは、 Cプログラミング言語で書かれた次の例で示されています。
#include <stdio.h> #include <unistd.h> /* sysconf(3) */int main ( void ) { printf ( "このシステムのページサイズは%ldバイトです。\n " , sysconf ( _SC_PAGESIZE )); /* _SC_PAGE_SIZEもOKです。 */0を返す; }多くのUnix系システムでは、コマンドラインユーティリティをgetconf使用することができます。[ 12 ] [ 13 ] [ 14 ] たとえば、getconf PAGESIZEはページサイズをバイト単位で返します。
Windows 9xやWindows NTファミリーなどのWin32ベースのオペレーティングシステムでは、システム関数GetSystemInfo()[ 15 ] [ 16 ]が使用される場合がありますkernel32.dll。
#include <stdio.h> #include <windows.h>int main ( void ) { SYSTEM_INFO si ; GetSystemInfo ( & si );printf ( "このシステムのページサイズは%uバイトです。\n " , si . dwPageSize );0を返す; }一部の命令セットアーキテクチャは、標準ページサイズよりも大幅に大きいページを含む、複数のページサイズをサポートできます。使用可能なページサイズは、命令セットアーキテクチャ、プロセッサの種類、および動作(アドレッシング)モードによって異なります。オペレーティングシステムは、アーキテクチャでサポートされているサイズから1つ以上のサイズを選択します。すべてのプロセッサが定義されているすべての大きなページサイズを実装しているわけではないことに注意してください。この大きなページ(Linuxでは「ヒュージページ」 、FreeBSDでは「スーパーページ」 、Microsoft WindowsおよびIBM AIXの用語では「ラージページ」と呼ばれます)のサポートにより、「両方の長所を活かす」ことが可能になり、大きな割り当てに対するTLBキャッシュへの負荷が軽減されます(速度が最大15%向上することもあります)。同時に、小さな割り当てに対するメモリ使用量は適切なレベルに維持されます。
Pentium ProおよびAMD Athlonから、x86プロセッサは標準の4KiBページに加えて4MiBページ(ページサイズ拡張と呼ばれる)( PAEを使用する場合は2MiBページ)をサポートしています。AMDの新しいAMD64プロセッサやIntelのWestmere [ 27 ]以降のXeonプロセッサなどの新しいx86-64プロセッサは、ロングモードで1GiBページを使用できます。IA -64は4KiBから256MiBまでの8つの異なるページサイズをサポートしており、他のアーキテクチャにも同様の機能があります。
大容量ページは、現代のほとんどのパーソナルコンピュータに搭載されているプロセッサで利用可能であるにもかかわらず、大規模アプリケーション(大規模サーバーや計算クラスタに代表されるアプリケーション)やオペレーティングシステム自体以外では、一般的には使用されていません。通常、大容量ページを使用するには、昇格された権限、大容量割り当てを行うアプリケーションの協力(通常はオペレーティングシステムに大容量ページを要求するフラグの設定)、または管理者による手動設定が必要です。オペレーティングシステムは、多くの場合、場合によっては設計上、大容量ページをディスクにページアウトできません。
しかし、SGI IRIXは複数のページサイズを汎用的にサポートしています。個々のプロセスがヒントを提供すると、オペレーティングシステムは特定のアドレス空間領域で可能な最大のページサイズを自動的に使用します。[ 28 ]その後の研究では、プリエンプティブ予約、オポチュニスティックプロモーション、投機的デモーション、フラグメンテーション制御を通じて、変更されていないアプリケーションで複数のページサイズを混在させて使用するための透過的なオペレーティングシステムサポートが提案されました。[ 29 ]
Linuxは2.6シリーズからhugetlbfsファイルシステム経由でいくつかのアーキテクチャ上で巨大ページをサポートしてきた[ 30 ]が、hugetlbfs2.6.38からはファイルシステムなしでもサポートされている。[ 31 ] Windows Server 2003 (SP1以降)、Windows Vista、Windows Server 2008は、ラージページという名前で巨大ページをサポートしている。[ 32 ] Windows 2000とWindows XPは内部的にラージページをサポートしているが、アプリケーションには公開していない。[ 33 ] Windowsでラージページを予約するには、システム管理者がユーザーに付与しなければならない対応する権限が必要である。Windowsではラージページをスワップアウトできないためである。Solarisはバージョン9から、 SPARCとx86でラージページをサポートしている。 [ 34 ] [ 35 ] FreeBSD 7.2-RELEASEはスーパーページ機能を備えている。[ 36 ] Linuxでは最近まで、巨大ページを使用するためにアプリケーションを変更する必要があったことに留意する。[ 31 ]透過的な巨大ページをサポートするLinuxカーネル、FreeBSD、 Solarisでは、アプリケーションは変更を必要とせずに自動的に巨大ページを活用します。[ 36 ]
[…] ROMはさらにページに分割され、各ページは256バイトで構成されます。したがって、0から255までのアドレスはROMのページ0、256から511までのアドレスはページ1、というように続きます。[…] プログラムランダムアクセスメモリ (RAM) はROMと全く同じように構成されています。[…]