カーネルがどのようにデータをLLCまたはL3キャッシュに入れるかを詳しく知りたいです。カーネルでキャッシュを使用する方法に関する情報を検索してみましたが、多くの結果がページキャッシュまたはバッファキャッシュについての話ですが、この質問にはメインメモリの上のキャッシュについてのみ記載されています。
orを使用してカーネルコンテキストでワークセットまたはデータ構造(30MB kmalloc
)を生成するとしますvmalloc
。私の考えでは、カーネルのメモリ違反を防ぐための保護や追加の最適化など、さまざまなプロセスがある可能性があります。これは使用法malloc
やmmap
ユーザーコンテキストとは異なります。
したがって、ユーザーモードでuser library()を使用して同じサイズのワークセット(30 MB)を作成すると、ワークセットがmalloc
このデータにアクセスするときにパフォーマンスが変わることが予想されます。
質問
1.カーネルはLLCキャッシュをどのように使用しますか?
2. mallocを使ってメモリを割り当てるとパフォーマンスは異なりますか?
答え1
LLCは単に」最後のレベルのキャッシュ正確にどのレベルのキャッシュであるかは、アーキテクチャによって大きく異なります。
キャッシュはほとんどカーネルとは独立して行われます。 asmレベルでもL3キャッシュをはじめ、CPUメモリキャッシュを運用できる機能がないか、非常に少ない。これを処理することがカーネルの使命であれば、おそらく疑わしいでしょう。
Intel(AMD)CPUには次のものがあります。地下鉄レジスタは、カーネルがキャッシュ機能のメモリ範囲を表示する方法に影響を与える可能性があります。最新のIntel CPUには、次の機能もあります。分割L3 キャッシュは次のように調整できます。ツール(カーネル 4.10 から始まる)。1
カーネルAPIにはmalloc()
機能がありません。kmalloc()
デフォルトではmalloc()
あり、vmalloc()
常にバイトではなくページを割り当てます。カーネル仮想マシンは主にページを処理し、本質的により効率的なmalloc類似機能のためのkmalloc()
ラッパーに過ぎません。vmalloc()
カーネルアルゴリズムには、キャッシュ環境でより良い調整を可能にするさまざまな最適化がありますが、主に低いキャッシュレベルを処理します(たとえば、同じページまたはキャッシュラインで同時プロセス/カーネルスレッドが機能する可能性が最小限に抑えられる場合は、より良い)。 )。これを使用すると、vmalloc()
マルチCPU環境でキャッシュを処理するのに大いに役立ちます。
カーネルは主にCで書かれており、メモリアドレスを処理し、キャッシュはCPUメモリ処理メカニズムによって透過的に処理されます。
1 ありがとうスティーブンジッタ貴重なアドバイスをしてください。