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