コンテキストスイッチのキャッシュコンテンツはどうなりますか?


50

マルチコアプロセッサで、コンテキストキャッシュがそのキャッシュで発生すると、コアのキャッシュ(L1など)の内容はどうなりますか?

動作はアーキテクチャに依存していますか、それともすべてのチップメーカーが従う一般的な動作ですか?

回答:


42

それはプロセッサ(プロセッサシリーズだけでなく、モデルごとに異なる可能性があります)とオペレーティングシステムの両方に依存しますが、一般的な原則があります。プロセッサがマルチコアであるかどうかは、この側面に直接影響しません。同じプロセスが複数のコアで同時に実行され(マルチスレッドの場合)、プロセス間でメモリを共有できるため、コンテキストスイッチで何が起こってもキャッシュの同期は避けられません。

プロセッサがキャッシュ内のメモリ位置を検索するときに、MMUがある場合、その位置の物理アドレスまたは仮想アドレスのいずれかを使用できます(両方を組み合わせることもありますが、ここでは実際には関係ありません)。

物理アドレスを使用すると、どのプロセスがアドレスにアクセスするかは関係なく、コンテンツを共有できます。そのため、コンテキストの切り替え中にキャッシュコンテンツを無効にする必要はありません。2つのプロセスが同じ物理ページを異なる属性でマップする場合、これはMMUによって処理されます(MPU(メモリ保護ユニット)として機能します)。物理的にアドレス指定されたキャッシュの欠点は、MMUがプロセッサとキャッシュの間に座っている必要があるため、キャッシュの検索が遅いことです。L1キャッシュはほとんど物理的なアドレスではありません。高レベルのキャッシュがあります。

同じ仮想アドレスは、異なるプロセスの異なるメモリ位置を示すことができます。したがって、仮想的にアドレス指定されたキャッシュでは、プロセッサとオペレーティングシステムが連携して、プロセスが適切なメモリを見つけるようにする必要があります。一般的な手法がいくつかあります。オペレーティングシステムによって提供されるコンテキスト切り替えコードは、キャッシュ全体を無効にする可能性があります。これは正しいですが、非常にコストがかかります。一部のCPUアーキテクチャでは、キャッシュラインにASID(アドレススペース識別子)、MMUによっても使用されるプロセスIDのハードウェアバージョン用のスペースがあります。これにより、キャッシュエントリが異なるプロセスから効果的に分離され、同じページをマップする2つのプロセスが同じ物理ページの一貫性のないビューを持つことになります(通常、共有ページを示す特別なASID値があり、ただし、これらがマップされているすべてのプロセスで同じアドレスにマップされていない場合は、フラッシュする必要があります。オペレーティングシステムが、異なるプロセスが重複しないアドレススペースを使用するように注意する場合(仮想メモリを使用する目的の一部は無効になりますが、場合によっては実行できます)、キャッシュラインは有効なままです。

MMUを搭載したほとんどのプロセッサには、TLBも搭載されています。TLBは、仮想アドレスから物理アドレスへのマッピングのキャッシュです。TLBは、物理アドレスが指定されたキャッシュを検索する前に参照され、可能な場合は物理アドレスが迅速に決定されます。多くの場合、キャッシュラインのオフセットを決定するビットとページを決定するビットの間のアドレスの中間ビットから候補キャッシュラインを特定できるため、プロセッサはTLBルックアップが完了する前にキャッシュルックアップを開始する場合があります。キャッシュヒットがある場合、仮想アドレスキャッシュはTLBをバイパスしますが、ミスの場合、プロセッサはキャッシュのクエリ中にTLBルックアップを開始できます。

TLB自体は、コンテキスト切り替え中に管理する必要があります。TLBエントリにASIDが含まれている場合は、そのままにしておくことができます。オペレーティングシステムは、ASIDの意味が変わった場合(プロセスが終了したなど)にのみTLBエントリをフラッシュする必要があります。TLBエントリがグローバルである場合、別のコンテキストに切り替えるときに無効にする必要があります。


2
非常に有益です。実際のアーキテクチャでこれがどのように行われるかの例を追加できれば、さらに良いでしょう。
JohnTortugo 14

2
@JohnTortugo私が書いたことは、ARMv7でできること(スマートフォンのCPUなど)(MMU処理コードを書いた唯一のアーキテクチャ)にかなり密接に対応しています。x86のような他のプラットフォームもかなり似ていると思いますが、それらについて書くことはできませんでした。実際のプラットフォームに関する具体的な情報を探している場合、コンピューターサイエンスは適切なサイトではありません。StackOverflowまたはElectrical EngineeringまたはEmbedded(提案)で尋ねることができます。
ジル 'SO-悪であるのをやめる' 14

10

キャッシュは通常、コンテキストスイッチを無視します。アクセスされるメモリアドレスのシーケンスのみが、どのキャッシュラインが置き換えられるかを決定します。

置換ポリシーは通常、製造元と特定のマイクロアーキテクチャに依存するヒューリスティックです。問題は、ヒューリスティックが将来を予測できないことです。どのアドレス、したがってキャッシュラインが次にアクセスされます。

ヒューリスティックは、LRU(最近使用されたものではない)のような単純なものです。しかし、最新のCPUでは、ヒューリスティックはより複雑です。

見てみましょうインテル®64およびIA-32アーキテクチャー・ソフトウェア・デベロッパーズ・マニュアル第3巻第11章では、メモリー・キャッシュとキャッシュ制御機構を説明します。AMDは、AMD64 Architecture Programmer's Manual Volume 2:System programmingの第7章にこれを記載しています。ARMベースのCPUの場合、PDFは登録済みのお客様のみが利用できるようです。


最初の段落の参照をお願いできますか?または、リンクされたドキュメントはこの問題を参照していますか?
ラファエル

動作は、キャッシュが物理的または仮想的にアドレス指定されているかどうかに大きく依存します。置換ポリシーはここでは関係ありません。ARMの場合、プロセッサテクニカルマニュアルに情報があります。たとえば、Cortex-A9のL1(最新世代の携帯電話で入手できるもの)ですが、非パブリックアーキテクチャのリファレンスマニュアルがないと理解が難しい場合があります
ジル「SO-悪であるのをやめる」

1
@Raphael私が「典型的に」書いたのは、私が遭遇したプロセッサでは、キャッシュ自体がスレッド、プロセス、コンテキストなどに関する知識を持っていないためです。メモリアクセスに反応するだけです。コンテキストスイッチでデータキャッシュがフラッシュされ、命令キャッシュが無効化された場合、キャッシュではなくこのアクションをトリガーするのはOSです。別のOSをインストールすると、この動作が変わる可能性があります。
ウリ

@Gillesかつて短い答えをしようとして、仮想メモリについて書かないことにしました。これはOSに直接関係するからです。また、考慮すべきタイムスケールもあります。キャッシュの内容は無効になっているがまったく変更されていない可能性があるため、「何も変更しない」とコンテキスト切り替えから次のメモリアクセスまでの時間の答えになります。
ウリ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.