ホームページ  >  記事  >  入社してキャッシュとは何かを理解した

入社してキャッシュとは何かを理解した

嵌入式Linux充电站
嵌入式Linux充电站転載
2023-07-31 16:03:381665ブラウズ


##まえがき

実際はこんな感じです。リーダーが引き継ぎました。perf ハードウェア パフォーマンス監視タスクがあります。perf を使用するプロセス中に、コマンド perf list を入力すると、次の情報が表示されました。

入社してキャッシュとは何かを理解した
My taskこれらのキャッシュを作成することです。イベントは通常どおりカウントできますが、重要なのは、これらの

missesloads が何を意味するのかわからないということです。

両方ともキャッシュであることしかわかりませんが、これらの名前は非常に似ています。違いは何ですか?

そのため、キャッシュについて学ぶ必要があると感じ、そこからキャッシュやパフォーマンスなどについての理解が始まりました。

以下は、私がキャッシュについて勉強していたときにまとめた基本的な概念的知識であり、基礎層やキャッシュを理解していない人にも役立つと思います。

私はかつてたくさんの質問をしながらこのガイドを進めてきたため、基本的には質問と回答の形式で皆さんをガイドします。

1. キャッシュとは何ですか?

まず、CPU はメモリに直接アクセスせず、最初にキャッシュを経由する必要があることを知っておく必要があります。

原因: CPU内のデータはレジスタに格納されており、レジスタへのアクセス速度は非常に速いですが、レジスタの容量は小さいです。メモリ容量は多いですが、速度は遅いです。

CPU とメモリ間の速度と容量の問題を解決するために、キャッシュ Cache が導入されます。

キャッシュは CPU とメイン メモリの間にあります。CPU がメイン メモリにアクセスするとき、まずキャッシュにアクセスして、キャッシュにそのようなデータがあるかどうかを確認します。ある場合は、キャッシュからデータを CPU に返します; キャッシュにデータがない場合は、メイン メモリに再度アクセスします。

2. マルチレベル キャッシュのストレージ構造

一般的に言えば、キャッシュは複数ありますが、 、つまりマルチレベルキャッシュですが、なぜですか?

理由: CPU アクセス キャッシュも非常に高速です。しかし、速度と容量を完全に両立させることはできず、CPU がキャッシュにアクセスする速度と CPU がレジスタにアクセスする速度が同じであれば、キャッシュは非常に高速であるが、容量は非常に小さいことを意味します。小さなキャッシュ容量ではニーズを満たすことができないため、マルチレベル キャッシュが導入されました。

マルチレベル キャッシュは、キャッシュを複数のレベル L1、L2、L3 などに分割します。

  • #速度に応じて、L1 > L2 > L3 の順になります。

  • #ストレージ容量に応じて、L3 > L2 > L1 の順になります。

#L1 は CPU に最も近く、L3 はメイン メモリに最も近いです。 入社してキャッシュとは何かを理解した

通常、L1 は命令キャッシュ (

ICache

) とデータ キャッシュ (DCache) に分割され、L1 キャッシュは CPU 専用であり、それぞれCPU L1キャッシュあり。

#3. 「ヒット」と「ハズレ」とは何を意味しますか? Hit

: CPU がアクセスするデータがキャッシュにキャッシュされます。これを「ヒット」といいます。つまり

cache hitMissing

: CPU がアクセスするデータがキャッシュにキャッシュされていないことを「欠落」、つまり

キャッシュ ミスといいます。

4. キャッシュラインとは何ですか?

キャッシュ ライン: キャッシュ ライン。キャッシュは多くの等しいブロックに均等に分割され、各ブロックのサイズは キャッシュ ラインと呼ばれます。 ###。

キャッシュ ラインは、キャッシュとメイン メモリ間のデータ転送の最小単位でもあります。

CPU が 1 バイトのデータをロードしようとすると、キャッシュが見つからない場合、キャッシュ コントローラーはキャッシュ ライン サイズのデータ​​をメイン メモリからキャッシュに一度にロードします。たとえば、キャッシュ ラインのサイズは 8 バイトです。 CPU が 1 バイトを読み取る場合でも、キャッシュが失われた後、キャッシュはメイン メモリから 8 バイトをロードして、キャッシュ ライン全体を埋めます。

#CPU がキャッシュにアクセスするときのアドレス エンコーディングは、通常、タグ、インデックス、オフセットの 3 つの部分で構成されます。

入社してキャッシュとは何かを理解した
  • ##tag
    (タグフィールド) : キャッシュラインにキャッシュされたデータのアドレスがプロセッサのアドレス指定アドレスと一致するかどうかを判断するために使用されます。
  • -
index

(インデックスフィールド): アドレスがキャッシュ内のどの行にあるかインデックスを付けて検索するために使用されます。

offset
  • (offset)
    : キャッシュライン内のオフセット。キャッシュ ラインの内容は、ワードまたはバイトでアドレス指定できます。キャッシュ ラインとタグ、インデックス、オフセットなどの関係は、図に示すとおりです。
    入社してキャッシュとは何かを理解した

    #5. キャッシュは仮想アドレスにアクセスしますか?それとも物理アドレスにアクセスしますか?

    CPU がメモリに直接アクセスするのではなく、CPU が仮想アドレスを発行し、それが MMU によって物理アドレスに変換され、その後データが送信されることがわかっています。物理アドレスに従ってメモリからフェッチされます。

    それでは、キャッシュは仮想アドレスにアクセスしているのでしょうか、それとも物理アドレスにアクセスしているのでしょうか?

    回答: 必ずしもそうとは限りません。これは、仮想アドレス、物理アドレス、または仮想アドレスと物理アドレスの組み合わせのいずれかになります。

    ハードウェア設計ではキャッシュを整理するさまざまな方法があるため:

    • VIVT仮想キャッシュ: インデックス仮想アドレスのタグと仮想アドレスのタグ。
    • PIPT物理キャッシュ: 物理アドレスのインデックス、物理アドレスのタグ。
    • VIPT物理的にタグ付けされた仮想キャッシュ: 仮想アドレスのインデックス、物理アドレスのタグ。

    # 6. 曖昧さとエイリアシングの問題とは何ですか?

    曖昧さ (同音異義語 ): 同じ仮想アドレスが異なる物理アドレスに対応します

    エイリアス (alias): 複数の仮想アドレスが同じ物理アドレスにマッピングされます (複数の仮想アドレスはエイリアスと呼ばれます)。

    たとえば、上記の VIVT メソッドにはエイリアスの問題があります。VIVT、PIPT、VIPT のどれが優れていますか?

    PIPT は、インデックスとタグの両方が物理アドレスを使用するため、実際には理想的です。 ソフトウェア レベルでは、あいまいさやエイリアスの問題を回避するためのメンテナンスは必要ありません。

    VIPT のタグは物理アドレスを使用しているため、あいまいさの問題はありませんが、インデックスは仮想アドレスであるため、 にはエイリアスの問題も発生する可能性があります

    VIVT メソッドには、曖昧さとエイリアシングの問題が存在します。

    実際、現在ハードウェアで使用されているのは基本的に PIPT または VIPT です。 VIVT は問題が多すぎて、歴史になり、誰も使わなくなりました。さらに、PIVT 法は欠点だけで利点がなく、遅いだけでなく、曖昧性やエイリアシングの問題も存在するため存在しません。

    キャッシュの構成、曖昧さおよびエイリアスの問題は、比較的大きなコンテンツです。ここで知っておく必要があるのは、キャッシュによってアクセスされるアドレスは、仮想アドレス、物理アドレス、または仮想アドレスと物理アドレスの組み合わせのいずれかである可能性があるということだけです。また、組織化方法が異なると、曖昧さやエイリアスの問題が発生します。

    #7. キャッシュ割り当て戦略?

    は、キャッシュミスが発生したときにキャッシュがどのように割り当てられるかを示します。

    読み取り割り当て: CPU がデータを読み取るとき、キャッシュ がありません。この場合、キャッシュ ライン キャッシュが割り当てられます。 . メインメモリから読み取られたデータ。 デフォルトでは、cache は読み取り割り当てをサポートします。

    書き込み割り当て: CPU 書き込みデータ キャッシュ が欠落している場合、書き込み割り当て戦略が考慮されます。書き込み割り当てをサポートしていない場合、書き込み命令はメイン メモリ データを更新するだけで終了します。書き込み割り当てがサポートされている場合、最初にメイン メモリから キャッシュ ライン にデータをロードし (最初に読み取り割り当てを実行するのと同じ)、次に キャッシュ ライン のデータを更新します。

    8. キャッシュ更新戦略?

    は、キャッシュがヒットしたときに書き込み操作でデータを更新する方法を示します。

    書き込みパススルー: CPU がストア命令を実行し、キャッシュがヒットすると、キャッシュ内のデータを更新し、メイン メモリ内のデータも更新します。 キャッシュとメインメモリ内のデータは常に一貫しています

    Writeback: CPUstore 命令を実行し、cache データにヒットした場合にのみ cache## を更新します。で #。そして、各 キャッシュ ライン には、データが変更されたかどうかを記録するための bit ビットがあり、これは ダーティ ビット と呼ばれます。 ダーティビットを設定します。メイン メモリ内のデータは、キャッシュ ライン が置換されるか、明示的な clean 操作が実行される場合にのみ更新されます。したがって、 メイン メモリ内のデータは未変更のデータである可能性がありますが、変更されたデータは キャッシュ内にあります。 キャッシュとメインメモリ内のデータが不整合である可能性があります。

    最後に

    キャッシュ、TLB、MESI、メモリ整合性モデルなどについて本当に習得するには、沈降と要約が必要なものです。

    しかし、多くの人はこれを使用しないかもしれません。パフォーマンスの問題が発生し、キャッシュ ヒット率を改善する必要がある場合にのみ、この知識の重要性がわかります。

    この記事で取り上げた知識について、キャッシュの基礎知識をマインドマップにまとめました。

    入社してキャッシュとは何かを理解した



#

以上が入社してキャッシュとは何かを理解したの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事は嵌入式Linux充电站で複製されています。侵害がある場合は、admin@php.cn までご連絡ください。