メモリシリーズの学習 (4): キャッシュと書き込みバッファの概要

序文

キャッシュとは、CPUとメインメモリの間にある少量の超高速スタティックメモリSRAM(スタティックRAM)、つまりDRAM(ダイナミックRAM、ダイナミックメモリ)のダイレクトアドレッシングアクセスです。

科学技術の発展と生産技術の向上に伴い、高性能プロセッサのキャッシュ容量はますます大きくなり、ステージ数も増加し、システムのパフォーマンスが大幅に向上します。

1 キャッシュと書き込みバッファの概要

1.1 キャッシュの動作原理

キャッシュを備えたコンピュータの場合、CPU はメモリ アクセスを実行する必要があるとき、まず必要なデータがキャッシュにあるかどうかを確認します。それが存在する場合、待機状態を挿入することなく、その中のデータに直接アクセスできます。これは高速ヒットと呼ばれる最良のケースです。

CPUが必要とする情報がCacheに存在しない場合、メインメモリへのアクセスに切り替える必要があり、速度が遅いため挿入して待つ必要があり、この状態を高速ミスと呼びます。

CPU がメイン メモリにアクセスすると、次のキャッシュ ヒットを保証するために、最適化原則に従ってストレージ情報が同時にキャッシュに書き込まれます。

したがって **、同じデータがメイン メモリとキャッシュに同時に格納される可能性があります**。同様に、最適化アルゴリズムに従って、キャッシュ内の使用頻度の低いデータの一部を削除できます

従来のソケット アーキテクチャは通常、2 レベルのバッファ構造を採用しています。つまり、1 レベル キャッシュ (L1 キャッシュ) は CPU に統合され、2 レベル キャッシュ (L2 キャッシュ) はマザーボードにインストールされ、L2 キャッシュはスロット I アーキテクチャでは CPU と同じ回路内にあり、ボード上ではコア速度またはコア速度の半分で動作し、ソケット下のシステム FSB で動作する L2 キャッシュよりも高速であり、最大化することができます。メイン周波数が高いことのメリット もちろん、キャッシュプロセスの要件も高くなります。

  • CPU はまず L1 キャッシュでデータを探し、見つからない場合は L2 キャッシュで探します。

  • データが L2 キャッシュにある場合、コントローラーはデータの送信中に L1 キャッシュを変更します。

  • データが L1 キャッシュにも L2 キャッシュにもない場合、キャッシュ コントローラーはメイン メモリからデータを取得し、CPU にデータを提供し、同時に 2 レベル キャッシュを変更します。

  • K6-Ⅲは非常に特殊で、64KB L1キャッシュ、256KBフルコアスピードL2キャッシュ、オリジナルのマザーボード上のキャッシュは実際にはL3キャッシュです。

関連するテストによると:

512K 2MB L3 キャッシュが役割を果たすと、システムのパフォーマンスが2% ~ 10% 向上します。

トライレベルは、PC システムの出現以来、高速 CPU と低速メモリの間のボトルネックを解決するための最も詳細で複雑なソリューションとなっており、さらに、キャッシュの将来の開発方向も大容量です。

メインメモリキャッシュストレージシステムでは、すべての命令とデータはメインメモリに保存され、キャッシュはメインメモリ内のプログラムブロックとデータブロックの一部のコピーにすぎず、ブロックベースのキャッシュにすぎません。保管方法。

キャッシュとメイン メモリはブロックに分割され、各ブロックは複数のバイトで構成されます。

前述のプログラム局所性の原則から、キャッシュ内のプログラム ブロックとデータ ブロックにより、ほとんどの場合、CPU がアクセスするコンテンツがキャッシュ内に存在し、キャッシュ内の読み取りおよび書き込み操作が行われることがわかります。 CPU は主に CPU とキャッシュの間で実行されます。

CPU がメモリにアクセスするとき、CPU はアクセス単位のアドレスをアドレス バスによってキャッシュ コントローラ内のメイン メモリ アドレス レジスタ MAR に送信し、メイン メモリ - キャッシュ アドレス変換機構は MA からアドレスを取得し、ユニットの内容がキャッシュに格納されているかどうかを判定します。 コピーが既にキャッシュに存在していればヒットします。ヒットした場合は、直ちにアクセスアドレスをキャッシュ上のアドレスに変換し、キャッシュにアクセスします。

ここに画像の説明を挿入

  • メモリ バンクは複数のストレージ ユニットで構成され、ストレージ ユニットは複数のストレージ エレメントで構成されます。
  • ストレージ バンク ----ストレージ ユニット (バイナリ文字列の文字列を格納) ----ストレージ エレメント (0/1 を格納)
  • ストレージユニット: バイナリコードの文字列を保存します。
  • メモリワード: メモリセル内のバイナリコード
  • ストレージワード長: ストレージユニット内のバイナリコードビット数。
  • メモリセルはアドレスによってアドレス指定されます
  • MAR: メモリ アドレス レジスタ。ストレージ ユニットの数を反映します。ストレージ バンクのアドレス (ストレージ ユニットの番号) が保存され、ストレージ ユニットの数が反映されます。したがって、MAR のビット数はストレージ ユニットの数に関係します。
  • MDR: メモリ データ レジスタ。ストレージ ワード長 (ストレージ ユニット長) を反映します。CPUに送信するデータ、メモリバンクに保存するデータ、またはメモリバンクから取り出したばかりのデータを保存します。このレジスタの長さはメモリ位置の長さと同じです。

CPUがアクセスしようとするコンテンツがキャッシュにない場合、つまりミスの場合、CPUはメインメモリに直接アクセスし、この記憶単位を含むデータブロック全体(ブロックデータのアドレス情報を含む)を転送します。これにより、将来のメモリへのいくつかのアクセスをキャッシュへのアクセスに変換できます。

キャッシュ メモリがいっぱいの場合、置換制御ユニットの制御の下、特定の置換アルゴリズム/戦略に従って、キャッシュ内の元の情報がこの情報で置換される必要があります。

面接中に golang でキャッシュ管理アルゴリズムを書くように頼まれたのを覚えています、ははは。

したがって、システム効率を向上させるためには、キャッシュ ヒット率を高める必要があり、キャッシュ ヒット率の向上は、キャッシュ イメージ方式やキャッシュ リフレッシュ アルゴリズムなどの一連の要因に依存します。キャッシュ内のコンテンツは、メイン メモリ内の一部と一致している必要があります。つまり、メイン メモリ内のコンテンツがキャッシュにロードされた後に変更された場合、キャッシュ内のイメージもそれに応じて変更される必要があります。 CPUはキャッシュの内容を変更し、メインメモリの内容も変更する必要があります。

1.2 アドレスマッピング方法

いわゆるアドレス マッピング方法とは、キャッシュ内のコンテンツがメイン メモリのどの部分のコピーであるかを決定する方法を指します。つまり、メイン メモリのアドレスをキャッシュにマッピングするには、特定の関数を適用する必要があります。

何らかの方法で情報をキャッシュにロードした後、プログラムを実行する際には、メインメモリのアドレスをキャッシュのアドレスに変換する必要があり、この変換プロセスをアドレス変換と呼びます。

アドレス マッピング方法では、通常、ダイレクト マッピング、フル アソシエイティブ マッピング、およびグループ アソシエイティブ マッピングの 3 つのタイプが使用されます。

1-直接映像

メインメモリの各アドレスをキャッシュ内の指定したアドレスにマッピングする方式をダイレクトイメージ方式と呼びます。ダイレクト イメージ モードでは、メイン メモリ内のストレージ ユニットのデータはキャッシュ内の 1 つの場所にのみ転送でき、メイン メモリ内の別のストレージ ユニットのデータもこの場所に転送されると競合が発生します。 。アドレスマッピングの方法は、キャッシュのサイズに応じてメインメモリ空間を分割し、各領域の同じブロック番号をキャッシュ内の同じブロック位置にマッピングする方法が一般的です。一般に、キャッシュは 2N ブロック、メインメモリは 2MB ブロックに分割され、メインメモリとキャッシュ内のブロックの対応関係は、j = i mod 2N の写像関数で表すことができます。式中の j はキャッシュ内のブロック番号、i はメイン メモリ内のブロック番号です。

直接マッピングは最も単純なアドレス マッピング方法であり、アドレス変換速度が速く、他の 2 つのマッピング方法のような置換戦略を必要としません。ただし、このようにブロック競合が発生する可能性は高く、プログラムが競合する 2 つのブロック内のデータに前後にアクセスすると、その時点ではキャッシュ内に他の空きブロックがあったとしても、キャッシュのヒット率は急激に低下します。 、固定アドレス画像の関係で適用できません。

2- 完全に連想的な画像

メイン メモリ内のすべてのワード ブロックをキャッシュ内の任意のワード ブロック位置にマッピングできます。この方法は完全連想マッピングと呼ばれます。このように、ブロック競合はキャッシュ内のすべてのブロックがいっぱいの場合にのみ発生するため、ブロック競合の確率は低く、高いキャッシュ ヒット率を達成できますが、その実装は非常に複雑です。ブロック内のデータにアクセスする場合、ブロック アドレスがキャッシュ ブロック テーブル内のすべてのアドレス タグと比較され、ヒットしたかどうかが判断されます。データ ブロックを転送する場合、比較的複雑な置換問題があります。つまり、データ ブロックをキャッシュ内のどこに転送するか、キャッシュ内のどのデータをメイン メモリから転送するかを決定する必要があります。高速化を実現するには、すべての比較と置換をハードウェアで実装する必要があります。

3セット連想画像

グループ連想マッピングは、直接マッピングと完全連想マッピングの間の妥協点です。この方法では、記憶領域をいくつかのグループに分割します。各グループは直接イメージであり、グループ内の各ブロックは完全連想イメージです。上記 2 つのマッピング方法を一般化したもので、グループのサイズが 1、つまりキャッシュ領域を 2N 個のグループに分割した場合は直接マッピングとなり、グループのサイズが全体のサイズの場合は直接マッピングになります。キャッシュを使用すると、完全な連想マッピングになります。グループアソシアティブ方式は、ブロックのヒット判定や置換アルゴリズムがフルアソシアティブ方式より簡単で、ブロック競合の確率がダイレクトマッピングよりも低く、ヒット率もダイレクトマッピングとフルアソシアティブマッピングの中間に位置します。

1.3 キャッシュ書き込み方式の原理の簡単な紹介

キャッシュのヒット率を向上させる最善の方法は、CPU が最近使用した命令とデータをキャッシュに保存することです。キャッシュがいっぱいになった場合、比較的長期間使用されなかったデータを削除して、キャッシュの効率を向上させることができます。 。キャッシュ内のデータとメイン メモリ内のデータの一貫性を維持するために、CPU が読み取りおよび書き込みプロセス中にキャッシュ内の新しいデータを失い、データが誤って読み取られることを防ぎ、データが確実にキャッシュに保存されるようにします。キャッシュ上の更新処理は上書きによって消えてしまうのではなく、キャッシュ上のデータ更新をタイムリーかつ正確にメインメモリに反映する必要があります。これがキャッシュ書き込み処理です。キャッシュの書き込み方式には、通常、次の 3 種類があります。スルー、バッファライトスルー、ライトバックの3つのキャッシュ書き込み方式を比較して紹介します。

1 - ライトスルーシステム

CPU がキャッシュに書き込むとき、同時にメイン メモリにもデータを書き込むため、キャッシュの内容がメイン メモリの内容とまったく同じであることが保証されます。この方法はより直感的でシンプルで信頼性が高くなりますが、キャッシュが更新されるたびにメイン メモリに書き込む必要があり、これはシステム バスを介して行われる必要があるため、バスが頻繁に動作し、システム速度に影響します。

2バッファ直接書き込み(Post Wirte)システム

ライトスルー方式によるバス速度への影響の問題を解決するため、メインメモリのデータ書き込み時にバッファ領域を追加します。メインメモリに書き込まれるデータがバッファにラッチされると、CPU はメインメモリへのデータの書き込みを待たずに次のサイクルの演算を実行できます。これは、一方向のワンショット キャッシュをメイン メモリに追加することと比較されます。たとえば、キャッシュにデータがすでに存在する読み取りサイクルを書き込みサイクルの直後に続けることができるため、ライトスルー システムによって引き起こされる動作遅延を回避できますが、このバッファには一度書き込まれたデータしか保存できません。 2 つの連続した書き込み操作が発生しても、CPU はまだ待機する必要があります。

3ライトバックシステム

最初の 2 つの書き込みモードでは、システムはキャッシュに書き込みながらメイン メモリにも書き込みます。実際、これはバス帯域幅を占有し、貴重な実行時間を無駄にするだけでなく、場合によっては不必要であり、追加の基準を追加することでデータを更新する必要があるかどうかを判断できます。ライトバック システムは、キャッシュ内の各データ ブロックのフラグ フィールドに更新ビットを追加することで、メイン メモリの不必要な書き込み操作を解決します。たとえば、キャッシュ内のデータが CPU によって更新されたが、メイン メモリ内では更新されていない場合、更新ビットは 1 に設定されます。CPU は新しいコンテンツをキャッシュに書き込むたびに、まずキャッシュ内のデータ ブロックの更新ビットをチェックします。更新ビットが 0 の場合、データは直接キャッシュに書き込まれます。この項目の内容は次のとおりです。メイン メモリ内の対応する場所に書き込まれた後、新しいデータがキャッシュに書き戻されます。

ライトスルー システムと比較して、ライトバック システムでは、多くの場合頻繁に発生する不必要な即時ライトバック操作が節約されます。キャッシュが更新されても、新しいデータに置き換えられなければ、すぐにメインメモリに書き込む必要はありません。つまり、メイン メモリへの実際の書き込み回数は、CPU によって実際に実行される書き込みサイクル数よりも少ない可能性がありますが、ライトバック システムの構造はより複雑であり、キャッシュも余分な容量を使用する必要があります。フラグを保存します。ライトバック システムの効率が高いため、最新のキャッシュのほとんどはこの方法で動作します。

1.4 ライトスルーとライトバックについて

1- ディスク操作の場合

ライトスルーとは、書き込み操作でキャッシュがまったく使用されず、データが常にディスクに直接書き込まれることを意味します。書き込みキャッシュをオフにすると、読み取り操作のためにキャッシュを解放できます (キャッシュは読み取り操作と書き込み操作で共有されます)。 。ライトバックとは、データがディスクに直接書き込まれるのではなく、まずキャッシュに書き込まれ、その後、コントローラーがキャッシュ内のディスクに書き込まれていないデータをディスクに書き込むことを意味します。書き込み操作が大幅に高速化されます。したがって、書き込みパフォーマンスが向上します。ただし、ディスクの負荷が軽い場合は、通常、ライトバック (ライト キャッシュ) 方式の方が高速です。負荷が高い場合、データがキャッシュに書き込まれるたびに、すぐにディスクに書き込んでキャッシュを解放し、新たに書き込むデータを保存する必要があります。このとき、データを直接ディスクに書き込むと、コントローラはより高速で動作します。そのため、負荷が高い場合、先にキャッシュにデータを書き込むとスループットが低下します。

2- CPU内部のキャッシュバッファモードの場合

ライトスルーとライトバックですが、前者は1つずつ順番に書き込むのに対し、後者はデータをバッファにある程度蓄えてから同じ位置に一度に書き出す方式です。例: エレベーターがあり、先入れ先出しの原則、つまりライトスルーモードの場合、最初の人は 3 階に行き、2 人目は 2 階に行き、3 人目も行きます。 3 階に行く場合、このエレベーターは最初に 3 階に来て、次に 2 階に行き、次に 3 階に行かなければなりません。しかし、ライトバック モードで、エレベーターが最初に 2 階に行って 2 人目を送り出し、次に 3 階に行って 1 人目と 3 人目を送り出すと、効率は明らかに大幅に高くなります。初期のキャッシュにはライトスルー モードのみがありましたが、現在はすべてのキャッシュがライトバック モードを使用しています。

3- その他の説明

  • ライトスルー: 書き込み時に、キャッシュとメモリ内のデータを同期して更新します。
  • ライトバック: キャッシュは書き込み時に更新されますが、メモリ内のデータは必ずしも同期的に更新されるわけではありません。キャッシュが一定のレベルに達した場合にのみ、キャッシュ内のデータはメモリにフラッシュされるか、キャッシュ コマンドによって更新されます。自動的に更新されません。
  • キャッシュ ラインの意味は、命令がメモリから 4 バイトを読み取るだけでよいと想定することですが、一般的に言えば、次の命令はこれら 4 バイトの後のデータを読み取る可能性が高いため、一般的なハードウェアはキャッシュに入るデータをさらに読み取ります。 64 バイトなどの場合、この 64 バイトがキャッシュ ラインになります。また、キャッシュ ライン内のデータが CPU によって長期間アクセスされなかった場合、このキャッシュ ラインが選択されてスワップアウトされる可能性があり、このとき、キャッシュ内の変更された情報をメモリに書き戻す必要があります。

1.5 キャッシュ置換戦略

キャッシュにはメモリと同様に、読み取り操作と書き込み操作という 2 つの基本操作があります。CPU が読み取り操作コマンドを発行するとき、生成するメイン メモリ アドレスに応じて 2 つの状況に分けられます。1 つは、必要なデータがすでにキャッシュ内にある場合、その後はキャッシュに直接アクセスしてキャッシュから情報を読み取るだけでよい場合です。はい、もう 1 つは、必要なデータがキャッシュにロードされていないことです。CPU がメイン メモリから情報を読み取る必要がある場合、キャッシュ置換部分は、アドレスの記憶内容をデータ バスからコピーします。メインメモリをキャッシュに移します。キャッシュ内の対応する位置がすでにワード ブロックで占められている場合は、古いワード ブロックを削除する必要があります。一般的な置換戦略は 2 つあります。

1- 先入れ先出しポリシー (FIFO)

FIFO (先入れ先出し) 戦略は、最初に転送されたキャッシュ ブロックを常に置き換えるので、各ブロックの使用状況を常に記録する必要がなく、実装が容易です。欠点は、循環プログラムを含むブロックなど、頻繁に使用されるブロックが最も古いブロックであるため、置き換えられる可能性があることです。

2- 最も最近使用されていないポリシー (LRU)

LRU (Least Recent Used) 戦略は、現在の最近のキャッシュ内で最も使用頻度の低い情報ブロックを置き換えることであり、この置き換えアルゴリズムでは、キャッシュ内のブロックの使用状況を常に記録する必要があります。LRU の平均ヒット率は FIFO よりも高く、グループ関連イメージモードではパケット容量が増加すると LRU のヒット率も高くなります。

1.6 キャッシュ使用の必要性

いわゆるキャッシュとは、CPUとメインメモリであるDRAMの間に位置する高速なキャッシュメモリで、通常はSRAMで構成される小規模ながらアクセスの速いメモリです。現在、コンピュータで使用されている主記憶装置は、安価で大容量という特徴を持つDRAMですが、情報を記憶するためにコンデンサを使用しているため、アクセス速度を上げることが難しく、CPUはメモリにアクセスする必要があります。メインメモリは命令を実行するたびに 1 回以上実行されますが、読み書きの速度は CPU の速度に比べてはるかに遅いため、速度を一致させるためには、CPU の命令サイクルにのみ待機状態を挿入できます。 CPU が待機状態にあると、システムの実行効率が大幅に低下します。SRAMはCPUと同じ製造プロセスを採用しているため、DRAMに比べてアクセス速度は速いものの、容量が大きく、消費電力が高く、価格も高いため、すべてのメモリをSRAMで構成することは不可能であり、その必要性もありません。そこで、速度とコストの矛盾を解決するために、メインメモリとCPUの間に比較的容量の小さいSRAMを高速キャッシュメモリとして搭載する、階層処理という手法が考案されました。 。キャッシュを使用すると、メインメモリの内容の一部のコピー(メモリイメージと呼ばれます)がキャッシュに保存され、CPUがデータの読み書きを行う際には、まずキャッシュにアクセスします(キャッシュの速度が同等であるため) CPU の要求に応じて、CPU はゼロ待ち状態で待つことができます(次の命令の実行が完了します)。キャッシュ内に CPU が必要とするデータがない場合に限ります(これは「ミス」と呼ばれます。それ以外の場合は、 (「ヒット」と呼ばれます)、CPU はメインメモリにアクセスします。現在、大容量キャッシュにより、CPU アクセスのキャッシュヒット率が 90% ~ 98% と高く、CPU のデータアクセス速度が大幅に向上し、システムパフォーマンスが向上します。

1.7 キャッシュの使用可能性

多数の典型的なプログラムの分析結果から、比較的短期間に、プログラムによって生成されたアドレスがメモリの論理アドレス空間の狭い範囲に集中することが多いことがわかります。多くの場合、命令はシーケンシャルに実行されるため、命令アドレスの分布は連続的であり、また、ループプログラム部分やサブルーチン部分は繰り返し実行する必要があるため、必然的にこれらのアドレスへのアクセスが集中する傾向があります。間に合うように。データの集中傾向は命令ほど明らかではありませんが、配列へのアクセスやワークユニットの選択により、メモリアドレスが相対的に集中する可能性があります。ローカル範囲内のメモリアドレスには頻繁にアクセスし、この範囲外のアドレスにはあまりアクセスしないこの現象をプログラムアクセスの局所性といいます。プログラムの局所性の原理によれば、メイン メモリと CPU の間にキャッシュを設定し、実行中の命令のアドレスに近い命令またはデータをメイン メモリから CPU がキャッシュにロードすることは完全に実現可能です。一定期間使用します。

  • https://blog.csdn.net/weixin_43627118/article/details/105188281
  • 「組込みシステムLinuxカーネル開発実戦」

おすすめ

転載: blog.csdn.net/weixin_45264425/article/details/132309902