54

アセンブリ言語レベルの命令セット アーキテクチャでは、比較とスワップなどの操作が提供されます。ただし、チップがこれらの保証をどのように提供できるかはわかりません。

私が想像するように、命令の実行は

  1. メモリから値をフェッチする
  2. 値を比較する
  3. 比較に応じて、別の値をメモリに保存する可能性があります

最初のコアがメモリアドレスをフェッチした後、新しい値を設定する前に、別のコアがメモリアドレスにアクセスするのを妨げているのは何ですか? メモリコントローラはこれを管理しますか?

編集: x86 の実装が秘密である場合は、プロセッサ ファミリがそれをどのように実装しているかを知りたいです。

4

4 に答える 4

39

これは、software.intel.com の記事で、ユーザー レベルのロックにほとんど光を当てていません。

ユーザーレベルのロックには、プロセッサのアトミック命令を利用してメモリ空間をアトミックに更新することが含まれます。アトミック命令では、命令でロック プレフィックスを使用し、デスティネーション オペランドをメモリ アドレスに割り当てます。次の命令は、現在の Intel プロセッサでロック プレフィックスを使用してアトミックに実行できます: ADD、ADC、AND、BTC、BTR、BTS、CMPXCHG、CMPXCH8B、DEC、INC、NEG、NOT、OR、SBB、SUB、XOR、XADD、およびXCHG。[...] ほとんどの命令では、ロック プレフィックスを明示的に使用する必要があります。ただし、xchg 命令では、命令にメモリ アドレスが含まれる場合にロック プレフィックスが暗示されます。

Intel 486 プロセッサの時代には、バスのロックをアサートするためにロック プレフィックスが使用され、パフォーマンスが大幅に低下しました。Intel Pentium Pro アーキテクチャ以降、バス ロックはキャッシュ ロックに変換されます。最新のアーキテクチャでは、ロックがキャッシュ不可能なメモリに存在する場合、またはロックがキャッシュ ラインを分割するキャッシュ ライン境界を超えて拡張されている場合、ロックは依然としてバス上でアサートされます。これらのシナリオはどちらもありそうにないため、ほとんどのロック プレフィックスは、はるかに安価なキャッシュ ロックに変換されます。

では、別のコアがメモリ アドレスにアクセスするのを妨げているのは何でしょうか? キャッシュ コヒーレンシ プロトコルは、キャッシュ ラインのアクセス権を既に管理しています。そのため、コアがキャッシュ ラインへの (一時的な) 排他的アクセス権を持っている場合、他のコアはそのキャッシュ ラインにアクセスできません。そのキャッシュラインにアクセスするには、他のコアが最初にアクセス権を取得する必要があり、それらの権利を取得するためのプロトコルには現在の所有者が関与します。実際、キャッシュ コヒーレンシ プロトコルは、他のコアがキャッシュ ラインにサイレント アクセスするのを防ぎます。

ロックされたアクセスが単一のキャッシュ ラインにバインドされていない場合、事態はさらに複雑になります。ページ境界を越えたロックされたアクセスなど、あらゆる種類の厄介なコーナーケースがあります。Intel は詳細を明らかにしておらず、ロックを高速化するためにあらゆる種類のトリックを使用している可能性があります。

于 2013-02-07T21:10:56.520 に答える
4

これの実装例は、プロセッサが実際にアトミック操作を完了するために使用される追加の命令を持つLL/SCです。メモリ側はキャッシュの一貫性です。最も一般的なキャッシュ コヒーレンシ プロトコルの 1 つは、MESI プロトコルです。.

于 2013-02-07T21:10:40.997 に答える
3

キャッシュ コヒーレンシ プロトコルだけでは、アトミック操作を実装するには不十分です。アトミックインクリメントを実装したいとしましょう。以下は、関連する手順です

  1. キャッシュからレジスタに値をロードする
  2. レジスタにロードされた値をインクリメントする
  3. 更新された値をキャッシュに保存します

したがって、上記の 3 つの命令をアトミックに実装するには、まず、必要な値を含むキャッシュラインへの排他的アクセスを取得する必要があります。排他アクセスを取得したら、「ストア」操作が完了するまで、このキャッシュラインへの排他アクセスを放棄しないでください。これは、アトミック命令を実行する CPU が、その間、このキャッシュラインのキャッシュ コヒーレンシ プロトコル メッセージに応答してはならないことを意味します。これがどのように実装されているかの詳細には悪魔がいますが、少なくともそれは私たちにメンタルモデルを与えてくれます

以下は、アトミック命令について linus torvalds が言及したものです。

アトミック命令は、ストア バッファーをバイパスするか、少なくともそうであるかのように動作します。実際にはストア バッファーを使用する可能性がありますが、ロードの前にストア バッファーと命令パイプラインをフラッシュし、後で排出されるのを待ち、キャッシュラインをロックします。それらはロードの一部として取得し、ストアの一部として解放します。これはすべて、その間にキャッシュラインが消えないようにするためであり、これが行われている間、他の誰もストア バッファの内容を見ることができないようにするためです。

于 2017-05-07T23:59:30.370 に答える
0

メモリ コントローラは、異なるプロセッサのメモリとキャッシュの一貫性を維持することのみを担当します。CPU1 のメモリに書き込むと、CPU2 はそのキャッシュから他のものを読み取ることができなくなります。両方が同じデータを操作しようとしていることを確認するのは、その責任ではありません。ロックおよびアトミック操作を使用する低レベルの命令がいくつかあります。これらは OS レベルでメモリの小さなチャンクを操作してミューテックスやセマフォなどを作成するために使用されます。これらは文字通り 1 バイトまたは 2 バイトのメモリであり、アトミックな同期操作を実行する必要があります。次に、アプリケーションはこれの上に構築され、より大きなデータ構造とリソースに対して操作を実行します。

于 2013-02-07T18:33:17.667 に答える