シナリオを想像してみてください: 2 つのコアが同時に CaS を実行する場合。プロセッサは古い値を読み取り、新しい値を配置する必要があります。古い値は同じです。彼らが同時に読むとどうなりますか?それとも、他のコアが読み取れないように変数に何らかのロックがかけられていますか?
1 に答える
はい、ほとんどのアーキテクチャでは、各コアが Read-For-Ownership フローを試行します。これは、行を変更する目的で排他的に行を要求することを意味します。そのうちの 1 つが勝ち、要求元のコアにデータを送り返し、他の要求を何らかの方法でブロックまたはリサイクルします。正確な詳細は設計によって異なりますが、一般的には、勝利したコアがデータを消費し、それを新しい値にアトミックに変更することを期待できます (内部ロックを使用するため、プロセスに干渉することはできません)。新しいデータが書き戻されるか、内部的にキャッシュされます (変更された状態で)。
その時点で、他の要求が続行され、回線の所有権を取得しようとする可能性があります。この回線がまだ最初のコアに保持されている場合、変更されたデータをスヌープが読み取ることになります。その後、2 番目のコアは最初のコアと同じプロセスを繰り返すことができます。
より単純なシステムでは、このプロセス中にすべてのメモリ トランザクションを停止することで同じことを達成できますが (Egor が言及したように「バス ロック」)、パフォーマンスがひどいため、最近では非常にまれです。 variable が整列されておらず、データが 2 行に分かれています。
重要な部分 (CaS) は、理想的にはコア内で内部的に実行する必要があることに注意してください。ローカル キャッシュ ライン ロックは原子性を維持できます (ロックしている間、他の誰もそのラインを読み取ったり、所有権を取得したりできません)。コヒーレンシや原子性を失うことなく、他のメモリ アドレスにアクセスできます。