ページ、メモリページ、または仮想ページは、仮想メモリの固定長連続ブロックであり、ページテーブル内の単一のエントリによって記述されます。これは、仮想メモリを使用するオペレーティングシステムにおけるメモリ管理の最小データ単位です。同様に、ページフレームは、オペレーティングシステムによってメモリページがマッピングされる物理メモリの最小固定長連続ブロックです。[ 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 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%向上することもあります)。同時に、小さな割り当てに対するメモリ使用量は適切なレベルに維持されます。
| 建築 | 最小ページサイズ | より大きなページサイズ |
|---|---|---|
| IA-32(32ビットx86)[ 18 ] | 4 KB | PSEモードでは4MiB 、 PAEモードでは2MiB [ 19 ] |
| x86-64 [ 18 ] | 4 KB | 2 MiB、1 GiB(CPUにPDPE1GBフラグがある場合のみ) |
| IA-64(アイタニウム)[ 20 ] | 4 KB | 8 KiB、64 KiB、256 KiB、1 MiB、4 MiB、16 MiB、256 MiB [ 19 ] |
| パワーISA [ 21 ] | 4 KB | 64 KiB、16 MiB、16 GiB |
| SPARCリファレンスMMUを搭載したSPARC v8 [ 22 ] | 4 KB | 256 KB、16 KB |
| UltraSPARCアーキテクチャ2007 [ 23 ] | 8 KB | 64 KiB、512 KiB(オプション)、4 MiB、32 MiB(オプション)、256 MiB(オプション)、2 GiB(オプション)、16 GiB(オプション) |
| ARMv7 [ 24 ] | 4 KB | 64 KiB、1 MiB(「セクション」)、16 MiB(「スーパーセクション」)(特定の実装によって定義されます) |
| AArch64 [ 25 ] | 4 KB | 16 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プロセッサや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 ]
参照
- グラントテーブル
- ページフォールト
- ページテーブル
- メモリページング
- 仮想メモリ
- ゼロページ-プロセッサのアドレス空間の先頭にある(多くの場合256バイトの大きさ[ 37 ] [ 38 ] )メモリ領域
- ゼロページ(CP/M) -プログラムの開始時に256バイト[ 38 ]のデータ構造
参考文献
- ^ Christopher Kruegel (2012年12月3日). 「オペレーティングシステム(CS170-08コース)」(PDF) . cs.ucsb.edu . 2016年8月10日時点のオリジナルよりアーカイブ(PDF) . 2016年6月13日閲覧.
- ^ Martin C. Rinard (1998年8月22日). 「オペレーティングシステム講義ノート、講義9. ページング入門」 . people.csail.mit.edu . 2016年6月1日時点のオリジナルよりアーカイブ。 2016年6月13日閲覧。
- ^ 「仮想メモリ:ページとページフレーム」 . cs.miami.edu . 2012年10月31日. 2016年6月11日時点のオリジナルよりアーカイブ。 2016年6月13日閲覧。
- ^ベルツァー、ジャック、ホルツマン、アルバート・G、ケント、アレン編 (1981)、「仮想記憶システム」、コンピュータサイエンスとテクノロジー百科事典、第14巻、CRCプレス、32ページ、ISBN 0-8247-2214-0
- ^風見、ダリウス(2019-01-11). 「RFC-11」。365 RFC。
- ^ 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 .
- ^ – ベース定義リファレンス、 The Single UNIX 仕様、バージョン 5、 The Open Group
- ^ – システムインタフェースリファレンス、 Single UNIX 仕様、バージョン5、 The Open Group
- ^ – Linuxライブラリ関数マニュアル
- ^ – DarwinとmacOSライブラリ関数マニュアル
- ^ – Solaris 11.4基本ライブラリ関数リファレンスマニュアル
- ^ – シェルおよびユーティリティリファレンス、 The Single UNIX 仕様、バージョン5、 The Open Group
- ^ – Linuxユーザーコマンドマニュアル
- ^ – DarwinとmacOSの一般コマンドマニュアル
- ^ 「GetSystemInfo関数」。Microsoft。2021年10月13日。
- ^ 「SYSTEM_INFO構造体」。Microsoft。2022年9月23日。
- ^ "Hugepages - Debian Wiki" . Wiki.debian.org. 2011年6月21日. 2014年2月6日閲覧。
- ^ a b「Intel® 64 および IA-32 アーキテクチャー ソフトウェア開発マニュアル 第 3 巻 (3A、3B、3C、3D): システム プログラミング ガイド」(PDF)。2016 年 12 月。p. 4-2。
- ^ a b "Documentation/vm/hugetlbpage.txt" . Linuxカーネルドキュメント. kernel.org . 2014年2月6日閲覧。
- ^ 「Intel Itanium アーキテクチャ ソフトウェア開発者マニュアル 第 2 巻: システム アーキテクチャ」(PDF) 2010 年 5 月、2 分 58 秒。
- ^ IBM Power Systemsパフォーマンス・ガイド:実装と最適化。IBM Redbooks。2013年2月。ISBN 978-0-7384-3766-8. 2014年3月17日閲覧。
- ^ 「SPARCアーキテクチャマニュアル バージョン8」 1992年 249ページ。
- ^ 「UltraSPARCアーキテクチャ2007」(PDF) 2010年9月27日. p. 427.
- ^ 「ARMアーキテクチャリファレンスマニュアル ARMv7-AおよびARMv7-R版」 ARM 2014年5月20日 p. B3-1324.
- ^ 「Translation granule」 .アーキテクチャを学ぶ - AArch64メモリ管理. Arm . 2022年8月19日閲覧。
- ^ a b Waterman, Andrew; Asanović, Krste ; Hauser, John (2021). RISC-V命令セットマニュアル 第2巻:特権アーキテクチャ(PDF) . pp. 79– 87.
- ^ 「Intel Xeon 5670:6つの改良されたコア」 AnandTech。2010年3月31日時点のオリジナルよりアーカイブ。2012年11月3日閲覧。
- ^ 「汎用オペレーティングシステムにおける複数ページサイズのサポート」(PDF) . static.usenix.org . 2012年11月2日閲覧。
- ^ Navarro, Juan; Iyer, Sitararn; Druschel, Peter; Cox, Alan (2002年12月).スーパーページのための実用的かつ透過的なオペレーティングシステムサポート(PDF) . 第5回Usenixオペレーティングシステム設計および実装シンポジウム.
- ^ 「ページ - dankwiki、ニック・ブラックのウィキ」 。 2023年6月17日閲覧。
- ^ a b Corbet, Jonathan. 「2.6.38の透過的な巨大ページ」 LWN . 2011年3月2日閲覧。
- ^ 「Large-Page Support」 . Microsoft Docs . 2018年5月8日.
- ^ 「Athlonプロセッサでページサイズ拡張を使用するとAGPプログラムがハングする可能性がある」 Support.microsoft.com、2007年1月27日。 2012年11月3日閲覧。
- ^ 「Solarisオペレーティングシステムにおける複数のページサイズのサポート」(PDF)。Sun BluePrints Online。Sun Microsystems。2006年3月12日時点のオリジナル(PDF)からアーカイブ。 2008年1月19日閲覧。
- ^ 「Solarisオペレーティングシステムにおける複数のページサイズのサポートに関する付録」(PDF)。Sun BluePrints Online。Sun Microsystems。2007年1月1日時点のオリジナル(PDF)からアーカイブ。 2008年1月19日閲覧。
- ^ a b「FreeBSD 7.2-RELEASE リリースノート」 . FreeBSD Foundation . 2009年5月3日閲覧。
- ^「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と全く同じように構成されています。[…]
- ^ 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日閲覧。
さらに読む
- ダンダムディ、シヴァラマ・P. (2003). 『コンピュータの構成と設計の基礎』(第1版).シュプリンガー. pp. 740– 741. ISBN 0-387-95211-X。