このコードは、単純に 2MB のバッファをループし、0
その各バイトに書き込み、各書き込みの実行にかかる時間を計算し、作成に必要な最短時間と最長時間を示す最低基準点と最高基準点 (min
および) を更新します。max
それぞれ書きます。
このプログラムが CPU で実行されている唯一のプログラムであり、実行中に非同期イベント (ハードウェア割り込みまたはタイマー割り込み) が発生しないと仮定すると、このプログラムは、バイト幅のメモリへの書き込みを行う公称時間と、 TLB ミス例外やページ フォールト例外の処理に必要な最大時間。
TLB ミス例外は、MMU に TLB エントリがないメモリにプログラムがアクセスしようとしたときにコアが取る例外です。MMU は、コア アベニューとメモリー レーンの交差点にいる警察官であり、交通を本来あるべき場所に誘導します。OK、それは恐ろしいアナロジーです。MMU (メモリ管理ユニット) には 2 つの主な目的があります。1) 仮想メモリ アクセスを適切な物理メモリ アドレスにルーティングすること、および 2) 読み取り専用、読み取り-書き込み、読み取り-実行、実行専用などの権限を適用して、競合する属性を持つ仮想メモリ領域 (またはマップされていない仮想メモリ領域) への浮遊ポインタ アクセスはトラップされ、メモリ アクセス例外 (Linux の SIGSEGV など) が発生します。TLB エントリは、現在物理メモリにロードされている仮想メモリ ページまたはページ グループのアクセス許可を MMU に通知する、MMU 内のハードウェア レジスタのセットです。ただし、MMU には無数の TLB エントリがあるわけではありません。メモリのすべてのページの属性を記述するには、TLB エントリがほとんどありません。そのため、プロセスのアドレス空間から正当なアドレスにアクセスしようとすると、それが存在するページを記述する現在の TLB エントリがない場合、TLB ミス例外が発生します。次に、TLB ミス例外ハンドラは、適切な TLB エントリのデータをメイン メモリからフェッチし、それを MMU の TLB エントリに書き込みます。MMU には、TLB ミス例外ハンドラーにどの TLB エントリを使用するかを伝えるためのメカニズムが組み込まれている場合もあります...おそらく、使用頻度が最も低いエントリです。
ページ フォールトは TLB ミス例外に似ていますが、この場合、その仮想メモリ ページの内容が物理メモリ内にさえないという点が異なります...まったく存在しない可能性があります (メモリの新しくマップされたページ)、またはプログラムがある時点で必要な仮想メモリの別のページのために、限られた物理メモリにスペースを作るために、以前にディスクにスワップアウトされている可能性があります。通常、TLB ミス例外は非常に高速ですが (それでもパフォーマンスに影響します)、ディスク ストレージは通常、ディスクから (SSD からでも!) ページをプルする必要がある場合、ページ フォールト例外はパフォーマンスに大きな影響を与える可能性があります。メモリ アクセスよりも 1 桁遅い (またはさらに悪い!)。このため、CPU をビジー状態にしておくには、これは便利です。オペレーティング システムのページ フォールト例外ハンドラーは、多くの場合、現在実行中のプロセスを別のプロセス (「準備完了」状態にあるプロセス) の実行を優先してスワップ アウトさせ、ディスクをいっぱいにするためにディスクからデータを受信するまで待ちます。要求された仮想メモリ ページ。
ここで、この「テスト コード」とその結果の有効性に戻ります。
このテストは、への呼び出しでメモリ ページを事前に割り当てない OS+ランタイムに依存しますmalloc(N)
。これはおそらく典型的な動作だと思います。ランタイムが大量のメモリを割り当て、割り当てたアドレス範囲を認識していても、そのメモリの実際のページは、プログラムが特定のページのアドレスに実際にアクセス (読み取りまたは書き込み) するまで、OS によって割り当てられないことがよくあります。ページは多くのプラットフォームで 4KB ですが、新しい Intel Pentium 派生製品の 4MB ページのように、さらに大きくなる可能性もあります。
したがって、プラットフォームのページ サイズが 4KB (4096 バイト) であると仮定すると、プログラムが 2MB の割り当てられたスペースを0
一度に 1 バイトずつ書き込んでいくと、これらの 4KB ページのうち 1024 ページを通過することになります。したがって、これらの書き込みのうち 4193280 回は「できるだけ速く」発生するはずです (TLB ミスまたはページ フォールト例外をトリガーすることなく)。また、そのうち最大 1024 個が TLB ミスやページ フォールト例外をトリガーします。そのため、「最小」時間は、書き込まれたアドレスが既にロードされた仮想メモリ ページにあり、その TLB エントリが現在 MMU にある場合に、書き込みを実行できる最速の時間を示します。「最大」時間は、おそらく物理メモリにまだマップされていないページに存在するアドレスへの書き込みを実行するための最悪の時間を与えます (そして、ページ フォールト例外をトリガーし、
基礎となるハードウェアのいくつかの特性を明らかにするためにその結果に依存している場合、このテストには 2 つの問題があります。 -「バックグラウンドで」受信および処理されるスライスおよびネットワーク パケット (実行中のプロセスを中断する可能性があります)。そして... 2) 2MB のテスト バッファは、新しい Intel プロセッサの MMU の 4MB のページ サイズほど大きくありません。オペレーティング システムが 4KB ページと 4MB ページのどちらを使用するかを決定する条件が何であるかはわかりません。したがって、これはシステムの要因である場合とそうでない場合があります。min
とmax
が互いに同じ桁数である場合、4MB ページのシステムを使用している可能性が高いことに注意してくださいmin
。max
1 桁以上の違いがある場合、その違いが完全に TLB ミスとページ フォールト例外に起因するとは限りません。おそらくこれが、著者が、コードが「パフォーマンスへの影響を示す可能性がある...」という声明で少しヘッジした理由です (強調を追加)。