私は巨大なページサイズとデータが実際にRAMに書き込まれる方法との関係を理解しようとしています。
プロセスが1GBの大容量ページを使用するとどうなりますか?書き込みは1GBチャンク単位で発生しますか?私の家は完全に間違っていると思いますか?
ベストアンサー1
メモリ書き込みのブロックサイズ定義が複数あります。次のように考えることができます。
- 店舗幅ガイドライン(保存バイト、保存ワード...)、通常1、2、4、8、または16。
- 幅隠れ家ライン、通常16または64バイト(キャッシュレベルによってライン幅が異なる場合があります)
- 幅メモリバス、ソフトウェアから直接観察することはできません。
- より合理的な感情があるかもしれません。
これらのどれもページサイズには関係ありません。
ページサイズはページの属性です。メモリ管理ユニット。 MMUの翻訳仮想アドレス(プログラムで使用)実際の住所(メモリの物理的な位置を指定します)。仮想アドレスを物理アドレスに変換する手順は次のとおりです。
- 最初のレベル記述子テーブルのアドレスを探します。
- 仮想アドレスの最も高いビットを抽出し、それを最初のレベル記述子テーブルのインデックスとして使用します。
- このインデックスからL1記述子をデコードし、補助記述子テーブルのアドレスを生成します。
- 仮想アドレスからより多くのビットが抽出され、補助記述子テーブルへのインデックスとして使用されます。
- このインデックスからL2記述子をデコードしてページ開始アドレスを生成します。ページは、MMU テーブルのエントリによって記述される物理的に連続したメモリ単位です。
- 仮想アドレスの残りのビットをページ開始アドレスとしてマスクして物理アドレスを得る。
一般的な32ビットアーキテクチャには2つのテーブルレベルがあり、一般的な64ビットアーキテクチャには3つのレベルがあります。 Linuxはレベル4までサポートしています。
一部のCPUアーキテクチャは、特定のページのサイズを増やし、間接参照レベルを下げることをサポートしています。これによりアクセスが速くなり、ページテーブルのサイズが小さくなりますが、メモリ割り当ての柔軟性が低下します。ほとんどのアプリケーションでは、時間利得がわずかですが、小さなページの柔軟性を利用できない一部のパフォーマンスに敏感なアプリケーション(データベースなど)では、時間利得が体感されることがあります。大きなページ通常の数字よりも少ないレベルで、それに応じてより大きなページです。
巨大なページを使用するソフトウェアはしばしばこれを具体的に要求します(フラグを介してmmap
、参照)。仮想アドレス空間のページサイズはどのように決定されますか?詳細は)。この最初のリクエストの後、ページサイズを知ったり気にする必要はありません。特に、メモリアクセスはMMUによって処理される。アクセスに関するソフトウェアはありません。