ページ(コンピュータのメモリ)

ページ、メモリページ、または仮想ページは仮想メモリの固定長連続ブロックであり、ページテーブル内の単一のエントリによって記述されます。これは、仮想メモリを使用するオペレーティングシステムにおけるメモリ管理の最小データ単位です。同様に、ページフレームは、オペレーティングシステムによってメモリページがマッピングされる物理メモリの最小固定長連続ブロックです。[ 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キャッシュでより多くのメモリを管理できるため、コストのかかるTLBミスを回避できます。

内部の断片化

プロセスが正確なページ数を必要とすることは稀です。そのため、最後のページは部分的にしか埋まらず、メモリがいくらか無駄になります。ページサイズが大きいほど、未使用の可能性のあるメモリ領域がメインメモリにロードされるため、メモリの無駄が大きくなります。ページサイズを小さくすると、割り当てに必要な実際のメモリ量に近くなります。

たとえば、ページ サイズが 1024 B であるとします。プロセスが 1025 B を割り当てる場合、2 つのページが使用されるため、未使用の領域は 1023 B になります (1 つのページが 1024 B を完全に消費し、もう 1 つのページが 1 B のみを消費します)。

ディスクアクセス

回転ディスクからの転送では、遅延の大部分はシークタイム、つまり読み取り/書き込みヘッドをディスクプラッター上に正しく配置するのにかかる時間によって発生します。そのため、複数の小さな転送を分割するよりも、大きなサイズのシーケンシャル転送の方が効率的です。同じ量のデータをディスクからメモリに転送する場合、多くの場合、ページ数が多いほど転送時間は短くなります。

プログラムでページサイズを取得する

ほとんどのオペレーティングシステムでは、プログラムが実行時にページサイズを検出できます。これにより、プログラムはメモリ割り当てをこのサイズに合わせて調整し、ページの内部断片化を全体的に削減することで、メモリをより効率的に使用できます。

Unix系オペレーティングシステム

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ベースのオペレーティング システム

Windows 9xWindows 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%向上することもあります)。同時に、小さな割り当てに対するメモリ使用量は適切なレベルに維持されます。

アーキテクチャ間のページサイズ[ 17 ]
建築最小ページサイズより大きなページサイズ
IA-32(32ビットx86[ 18 ]4 KBPSEモードでは4MiB  、 PAEモードでは2MiB [ 19 ]
x86-64 [ 18 ]4 KB2 MiB、1  GiB(CPUにPDPE1GBフラグがある場合のみ)
IA-64(アイタニウム[ 20 ]4 KB8 KiB、64 KiB、256 KiB、1 MiB、4 MiB、16 MiB、256 MiB [ 19 ]
パワーISA [ 21 ]4 KB64 KiB、16 MiB、16 GiB
SPARCリファレンスMMUを搭載したSPARC v8 [ 22 ]4 KB256 KB、16 KB
UltraSPARCアーキテクチャ2007 [ 23 ]8 KB64 KiB、512 KiB(オプション)、4 MiB、32 MiB(オプション)、256 MiB(オプション)、2 GiB(オプション)、16 GiB(オプション)
ARMv7 [ 24 ]4 KB64 KiB、1 MiB(「セクション」)、16 MiB(「スーパーセクション」)(特定の実装によって定義されます)
AArch64 [ 25 ]4 KB16 KiB、64 KiB、2 MiB、32 MiB、512 MiB、1 GiB
RISCV32 [ 26 ]4 KB 4 MiB(「メガページ」)
RISCV64 [ 26 ]4 KB 2 MiB(「メガページ」)、1 GiB(「ギガページ」)、512 GiB(「テラページ」、43ビット以上のアドレス空間を持つCPUのみ)、256 TiB(「ペタページ」、57ビット以上のアドレス空間を持つCPUのみ)、

Pentium ProおよびAMD Athlonから、x86プロセッサは標準の4KiBページに加えて4MiBページ(ページサイズ拡張と呼ばれる)( PAEを使用する場合は2MiBページ)をサポートしています。AMDの新しいAMD64プロセッサやIntelWestmere [ 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 VistaWindows Server 2008は、ラージページという名前で巨大ページをサポートしている。[ 32 ] Windows 2000Windows XPは内部的にラージページをサポートしているが、アプリケーションには公開していない。[ 33 ] Windowsでラージページを予約するには、システム管理者がユーザーに付与しなければならない対応する権限が必要である。Windowsではラージページをスワップアウトできないためである。Solarisはバージョン9から、 SPARCとx86でラージページをサポートしている。 [ 34 ] [ 35 ] FreeBSD 7.2-RELEASEはスーパーページ機能を備えている。[ 36 ] Linuxでは最近まで、巨大ページを使用するためにアプリケーションを変更する必要があったことに留意する。[ 31 ]透過的な巨大ページをサポートするLinuxカーネル、FreeBSD、 Solarisでは、アプリケーションは変更を必要とせずに自動的に巨大ページを活用します。[ 36 ]

参照

参考文献

  1. ^ Christopher Kruegel (2012年12月3日). 「オペレーティングシステム(CS170-08コース)」(PDF) . cs.ucsb.edu . 2016年8月10日時点のオリジナルよりアーカイブ(PDF) . 2016年6月13日閲覧.
  2. ^ Martin C. Rinard (1998年8月22日). 「オペレーティングシステム講義ノート、講義9. ページング入門」 . people.csail.mit.edu . 2016年6月1日時点のオリジナルよりアーカイブ。 2016年6月13日閲覧
  3. ^ 「仮想メモリ:ページとページフレーム」 . cs.miami.edu . 2012年10月31日. 2016年6月11日時点のオリジナルよりアーカイブ。 2016年6月13日閲覧
  4. ^ベルツァー、ジャック、ホルツマン、アルバート・G、ケント、アレン編 (1981)、「仮想記憶システム」、コンピュータサイエンスとテクノロジー百科事典、第14巻、CRCプレス、32ページ、ISBN 0-8247-2214-0
  5. ^風見、ダリウス(2019-01-11). 「RFC-11」365 RFC
  6. ^ Weisberg, P.; Wiseman, Y. (2009-08-10).仮想メモリに4KBのページサイズを使用するのは時代遅れ. 2009 IEEE International Conference on Information Reuse & Integration. CiteSeerX 10.1.1.154.2023 . doi : 10.1109/IRI.2009.5211562 . 
  7. ^limits.h  – ベース定義リファレンス、 The Single UNIX 仕様、バージョン 5、 The Open Group
  8. ^sysconf  – システムインタフェースリファレンス、 Single UNIX 仕様、バージョン5、 The Open Group
  9. ^sysconf(3)  –  Linuxライブラリ関数マニュアル
  10. ^sysconf(3)  –  DarwinmacOSライブラリ関数マニュアル
  11. ^sysconf(3C)  –  Solaris 11.4基本ライブラリ関数リファレンスマニュアル
  12. ^getconf  – シェルおよびユーティリティリファレンス、 The Single UNIX 仕様、バージョン5、 The Open Group
  13. ^getconf(1)  –  Linuxユーザーコマンドマニュアル
  14. ^getconf(1)  –  DarwinmacOSの一般コマンドマニュアル
  15. ^ 「GetSystemInfo関数」。Microsoft。2021年10月13日。
  16. ^ 「SYSTEM_INFO構造体」。Microsoft。2022年9月23日。
  17. ^ "Hugepages - Debian Wiki" . Wiki.debian.org. 2011年6月21日. 2014年2月6日閲覧
  18. ^ a b「Intel® 64 および IA-32 アーキテクチャー ソフトウェア開発マニュアル 第 3 巻 (3A、3B、3C、3D): システム プログラミング ガイド」(PDF)。2016 年 12 月。p. 4-2。
  19. ^ a b "Documentation/vm/hugetlbpage.txt" . Linuxカーネルドキュメント. kernel.org . 2014年2月6日閲覧
  20. ^ 「Intel Itanium アーキテクチャ ソフトウェア開発者マニュアル 第 2 巻: システム アーキテクチャ」(PDF)。2010 年 5 月。2 分 58 秒。
  21. ^ IBM Power Systemsパフォーマンス・ガイド:実装と最適化。IBM Redbooks。2013年2月。ISBN 978-0-7384-3766-8. 2014年3月17日閲覧
  22. ^ 「SPARCアーキテクチャマニュアル バージョン8」 1992年 249ページ。
  23. ^ 「UltraSPARCアーキテクチャ2007」(PDF) 2010年9月27日. p. 427.
  24. ^ 「ARMアーキテクチャリファレンスマニュアル ARMv7-AおよびARMv7-R版」 ARM 2014年5月20日 p. B3-1324.
  25. ^ 「Translation granule」 .アーキテクチャを学ぶ - AArch64メモリ管理. Arm . 2022年8月19日閲覧
  26. ^ a b Waterman, Andrew; Asanović, Krste ; Hauser, John (2021). RISC-V命令セットマニュアル 第2巻:特権アーキテクチャ(PDF) . pp.  79– 87.
  27. ^ 「Intel Xeon 5670:6つの改良されたコア」 AnandTech。2010年3月31日時点のオリジナルよりアーカイブ2012年11月3日閲覧。
  28. ^ 「汎用オペレーティングシステムにおける複数ページサイズのサポート」(PDF) . static.usenix.org . 2012年11月2日閲覧
  29. ^ Navarro, Juan; Iyer, Sitararn; Druschel, Peter; Cox, Alan (2002年12月).スーパーページのための実用的かつ透過的なオペレーティングシステムサポート(PDF) . 第5回Usenixオペレーティングシステム設計および実装シンポジウム.
  30. ^ 「ページ - dankwiki、ニック・ブラックのウィキ」 。 2023年6月17日閲覧
  31. ^ a b Corbet, Jonathan. 「2.6.38の透過的な巨大ページ」 LWN . 2011年3月2日閲覧
  32. ^ 「Large-Page Support」 . Microsoft Docs . 2018年5月8日.
  33. ^ 「Athlonプロセッサでページサイズ拡張を使用するとAGPプログラムがハングする可能性がある」 Support.microsoft.com、2007年1月27日。 2012年11月3日閲覧
  34. ^ 「Solarisオペレーティングシステムにおける複数のページサイズのサポート」(PDF)。Sun BluePrints Online。Sun Microsystems。2006年3月12日時点のオリジナル(PDF)からアーカイブ。 2008年1月19日閲覧
  35. ^ 「Solarisオペレーティングシステムにおける複数のページサイズのサポートに関する付録」(PDF)。Sun BluePrints Online。Sun Microsystems。2007年1月1日時点のオリジナル(PDF)からアーカイブ。 2008年1月19日閲覧
  36. ^ a b「FreeBSD 7.2-RELEASE リリースノート」 . FreeBSD Foundation . 2009年5月3日閲覧。
  37. ^「2.3.1 読み取り専用メモリ / 2.3.2 プログラムランダムアクセスメモリ」。MCS -4 アセンブリ言語プログラミングマニュアル - INTELLEC 4 マイクロコンピュータシステムプログラミングマニュアル(PDF) (暫定版)。米国カリフォルニア州サンタクララ:Intel Corporation。1973年12月。pp.  2-3 – 2-4。MCS -030-1273-1。2020年3月1日時点のオリジナルからアーカイブ(PDF) 。 2020年3月2日閲覧[…] ROMはさらにページに分割され、各ページは256バイトで構成されます。したがって、0から255までのアドレスはROMのページ0、256から511までのアドレスはページ1、というように続きます。[…] プログラムランダムアクセスメモリ (RAM) はROMと全く同じように構成されています。[…]
  38. ^ a b「1. はじめに:セグメントアライメント」。『8086ファミリユーティリティ - 8080/8085ベース開発システムユーザーズガイド』(PDF)。リビジョンE(A620/5821 6K DD版) 。米国カリフォルニア州サンタクララ:Intel Corporation。1982年5月 [1980、1978] 。p. 1-6。注文番号:9800639-04。2020年2月29日時点のオリジナルからアーカイブ(PDF) 。 2020年2月29日閲覧

さらに読む