1GB大容量ページ - 書き込みは1GBブロックで発生しますか?

1GB大容量ページ - 書き込みは1GBブロックで発生しますか?

私は巨大なページサイズとデータが実際にRAMに書き込まれる方法との関係を理解し​​ようとしています。

プロセスが1GBの大容量ページを使用するとどうなりますか?書き込みは1GBチャンク単位で発生しますか?私の家は完全に間違っていると思いますか?

答え1

メモリ書き込みのブロックサイズ定義が複数あります。次のように考えることができます。

  • 店舗幅ガイドライン(保存バイト、保存ワード...)、通常1、2、4、8、または16。
  • 隠れ家ライン、通常16または64バイト(キャッシュレベルによってライン幅が異なる場合があります)
  • メモリバス、ソフトウェアから直接観察することはできません。
  • より合理的な感情があるかもしれません。

これらのどれもページサイズには関係ありません。

ページサイズはページの属性です。メモリ管理ユニット。 MMUの翻訳仮想アドレス(プログラムで使用)実際の住所(メモリの物理的な位置を指定します)。仮想アドレスを物理アドレスに変換する手順は次のとおりです。

  • 最初のレベル記述子テーブルのアドレスを探します。
  • 仮想アドレスの最も高いビットを抽出し、それを最初のレベル記述子テーブルのインデックスとして使用します。
  • このインデックスからL1記述子をデコードし、補助記述子テーブルのアドレスを生成します。
  • 仮想アドレスからより多くのビットが抽出され、補助記述子テーブルへのインデックスとして使用されます。
  • このインデックスからL2記述子をデコードしてページ開始アドレスを生成します。ページは、MMU テーブルのエントリによって記述される物理的に連続したメモリ単位です。
  • 仮想アドレスの残りのビットをページ開始アドレスとしてマスクして物理アドレスを得る。

一般的な32ビットアーキテクチャには2つのテーブルレベルがあり、一般的な64ビットアーキテクチャには3つのレベルがあります。 Linuxはレベル4までサポートしています。

一部のCPUアーキテクチャは、特定のページのサイズを増やし、間接参照レベルを下げることをサポートしています。これによりアクセスが速くなり、ページテーブルのサイズが小さくなりますが、メモリ割り当ての柔軟性が低下します。ほとんどのアプリケーションでは、時間利得がわずかですが、小さなページの柔軟性を利用できない一部のパフォーマンスに敏感なアプリケーション(データベースなど)では、時間利得が体感されることがあります。大きなページ通常の数字よりも少ないレベルで、それに応じてより大きなページです。

巨大なページを使用するソフトウェアはしばしばこれを具体的に要求します(フラグを介してmmap、参照)。仮想アドレス空間のページサイズはどのように決定されますか?詳細は)。この最初のリクエストの後、ページサイズを知ったり気にする必要はありません。特に、メモリアクセスはMMUによって処理される。アクセスに関するソフトウェアはありません。

答え2

Hugepagesはメモリブロックに書き込むのではなく、割り当てに使用されます。

通常、アプリケーションに大量のメモリが必要な場合は、大量の「ページ」を割り当てる必要があります。ページは単に物理メモリの一部です。通常、このブロックはほんの数KBです。したがって、アプリケーションが複数のページにわたって大量のメモリ集約型タスクを実行している場合、カーネルはこれらすべての仮想メモリページを物理メモリに変換する必要があり、これは高価です。

これを最適化するために、カーネルはデフォルトでデフォルトのページサイズより大きい割り当てであるhugepagesを提供します。したがって、数千ページを割り当てるのではなく、数ページだけを割り当てます。読み取りと書き込みはまだ読み取りまたは書き込みのサイズです。アプリケーションが巨大なページに10バイトの文字列を書き込んでいても、それはまだ10バイトの書き込みです。

関連情報