私が理解していることから、同期されたキーワードはローカルスレッドキャッシュをメインメモリと同期します。volatile キーワードは、基本的にアクセスのたびに常にメイン メモリから変数を読み取ります。もちろん、メイン メモリへのアクセスはローカル スレッド キャッシュよりもはるかにコストがかかるため、これらの操作にはコストがかかります。ただし、CAS 操作は低レベルのハードウェア操作を使用しますが、それでもメイン メモリにアクセスする必要があります。では、CAS 操作はどのように高速化されるのでしょうか?
2 に答える
重要な要因は、あなたが述べているとおりだと思います-CASメカニズムは、最小限のキャッシュフラッシュと競合解決を可能にする低レベルのハードウェア命令を使用します。
他の 2 つのメカニズム (synchronization
およびvolatile
) は、すべての異なるアーキテクチャでより一般的に利用できる、異なるアーキテクチャ トリックを使用します。
CAS 命令は、ほとんどの最新のアーキテクチャで何らかの形で利用できますが、アーキテクチャごとに異なる実装があります。
Brian Goetzからの興味深い引用(おそらく)
操作の相対速度は、ほとんど問題になりません。関連するのは、ロックベースのアルゴリズムとノンブロッキング アルゴリズムのスケーラビリティの違いです。また、1 コアまたは 2 コアのシステムで実行している場合は、そのようなことを考えるのをやめてください。
ノンブロッキング アルゴリズムは、ロックベースのアルゴリズムよりも「クリティカル セクション」が短いため、一般的にスケーラビリティに優れています。
CAS は必ずしもメモリにアクセスする必要はないことに注意してください。
最新のアーキテクチャのほとんどは、同時にデータにアクセスするスレッドが 1 つしかない場合に、CPU がショートカットを実行できるようにするMESIなどのキャッシュ コヒーレンシ プロトコルを実装しています。この場合、従来の非同期メモリ アクセスと比較したオーバーヘッドは非常に低くなります。
ただし、同じ値に対して多くの同時変更を行う場合、キャッシュはまったく役に立たず、すべての操作でメイン メモリに直接アクセスする必要があります。この場合、異なる CPU キャッシュを同期するためのオーバーヘッドとメモリ アクセスのシリアル化により、パフォーマンスが大幅に低下する可能性があります (これはキャッシュ ピンポンとも呼ばれます)。ロックベースのアプローチ。
したがって、アトミックに切り替えればすべての問題が解決すると単純に思い込まないでください。アトミックの大きな利点は、ロックフリー (誰かが常に進行する) またはウェイトフリー (全員が一定数のステップ後に終了する) 実装の進行保証です。ただし、これは多くの場合、生のパフォーマンスとは直交しています。待機のないソリューションは、ロックベースのソリューションよりも大幅に遅くなる可能性がありますが、状況によっては、進行を保証するためにそれを受け入れることもできます。