zzh

zzh

volatileは可視性を保証することを理解する

現在の CPU アーキテクチャでは、可視性を実現するために、volatile 修飾された変数の読み書きに障壁を追加しています。

invalidQueue、storeBuffer、および可視性

CPU の下層では、複数のコア CPU 間のキャッシュの一貫性を実現するために、主に MESI プロトコルを使用しています(詳細は関連する情報を参照してください)。MESI では、効率的な処理を実現するために、invalidQueue と storeBuffer という 2 つのデータ構造が導入されています。まず、CPU では、共有変数(複数のコア CPU が所有する変数)のみが可視性の問題を持つ可能性があります。例えば、CPU0 と CPU1 が変数 x をそれぞれのキャッシュで所有している場合、ある時点で CPU0 が x を変更すると、CPU0 は CPU1 に対応するキャッシュ行を無効状態にすることを通知します。具体的には、CPU0 は効率的な処理のために、変更値を storeBuffer に格納し、同時に CPU1 に通知を開始します。一方、CPU1 は対応する無効メッセージを invalidQueue に格納し、その後 CPU0 に処理が完了したことを通知します。CPU0 は応答を受け取った後、storeBuffer から対応する変更値をキャッシュにフラッシュします。これが MESI プロトコルによって複数のコア CPU 間のキャッシュの一貫性が保証される部分です。ここで問題があることに気付くでしょう。なぜなら、CPU0 は変更値をメインメモリにフラッシュしていないため、CPU1 も対応する無効操作を実行していないからです(無効操作を実行しない場合、CPU1 はまだキャッシュの値を取得し続けます。無効になった後に対応する値をメインメモリから取得するようになります)。したがって、volatile 修飾子は、CPU0 が変更値をキャッシュにフラッシュすると同時にメインメモリにフラッシュし、CPU1 が x を読み取る際には invalidQueue のすべてのメッセージを実行することで、複数のコア CPU 間の可視性を保証します。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。