A、リオーダーシーン
クラスResortDemo { INT A = 0。 ブール・フラグ= FALSE。 公共ボイドライター(){ = 1。// 1 フラグ=真。// 2 } 公共ボイドリーダー(){ IF(フラグ){// 3 INT iは* =。// 4 ... } } }
二つのスレッドA及びB、最初に実行ライタ()メソッドは、Bは、次いで、リーダー()メソッドを実行するスレッド。操作の実行中、B 4スレッドA書き込み動作に共有変数の一組を見る能力をスレッド?
答えは次のとおりです。必ずしも表示されません。
操作1と操作2はデータの依存関係、コンパイラ、および2つのプロセッサは、リオーダリング動作しない可能性があるため、同様に、3及び操作4操作ないデータ依存性、コンパイラプロセッサは二つの重を動作させることができますソート。
第二に、トレースさ
でも、マルチコアCPUの処理性能を向上させる最大化するために、ハイパースレッディングテクノロジを使用するには、シングルコアからコンピューティングの性能、CPUのアップグレードを高めるために。CPUのアップグレードの使用率を最大化するために、CPUのタイムスライスを切り替えることで、CPUのキャッシュを増やし、オペレーティングシステムがプロセスを追加し、スレッド。
プロセッサとメモリ速度の間の矛盾に相互作用の優れたソリューションのキャッシュを保存するが、それは新しい問題、キャッシュ・コヒーレンシを紹介するので、それはまた、コンピュータシステムのより大きな複雑さをもたらしますことで。
第三に、キャッシュ・コヒーレンシ・プロトコル
同じデータがキャッシュメモリで見られる別のCPUで実行している別のスレッドがない場合は、同じ値が矛盾したキャッシュの問題になり、複数のCPUにキャッシュすることができます。一貫性のあるデータ・アクセスを実現するためには、各プロセッサがキャッシュにアクセスする際に、いくつかのプロトコルに従う必要があり、読み書き時のプロトコルに従って動作し、共通の合意MSI、MESI、MOSIなどがあります。最も一般的なのは、MESIプロトコルです。
次
あなたに簡単にMESIを説明します。
MESIキャッシュラインは、つまり、四つの状態を表し、
1. M(変更)は、現在のCPUのキャッシュにキャッシュのみ共有データを表します
変性状態、データ・キャッシュとメインメモリの数であり、すなわち
それは矛盾しています
2. E(排他)排他状態のみ、現在のデータ・キャッシュ、キャッシュを示し
CPUキャッシュと変更されません
3. S(共有)は、各データキャッシュのためのCPUのキャッシュとメインメモリの複数を表すデータ、及び一貫したデータであってもよいです
4. I(無効)キャッシュの有効期限が切れている表し
MESIプロトコルの場合、ビューの点から、CPUの読み込みと書き込みには、以下の原則に従います。
CPUは、読み出し要求:キャッシュはM、E、Sの状態を読み取ることができるで、CPUのIステータスだけメインメモリからデータを読み取ることができます。
CPUの書き込み要求:彼らは書き込むことができます前に、キャッシュがM、E状態です。書き込みのS状態の場合は、書き込みの前に無効に他のCPUのキャッシュラインが必要です。
第四に、並べ替えの理由
MESIキャッシュ・コヒーレンシ・プロトコルを実現することができますが、だけでなく、いくつかの問題があります。
理由、CPU上図とバッファstoreBuffersの導入に基づきます。CPU0はstorebufferesに直接共有データ、書き込みデータを書き込む際に無効化メッセージが送信され、その処理を継続しながら、
他指令。当收到其他所有 CPU 发送了 invalidate acknowledge 消息时,再将 store bufferes 中的数据数据存储至 cache line中。最后再从缓存行同步到主内存。
这个时候,我们再来看上述标题一中的重排序场景。
class ResortDemo { int a = 0; boolean flag = false; public void writer() { a = 1; //1 flag = true; //2 } Public void reader() { if (flag) { //3 int i = a * a; //4 …… } } }
動作を行う場合、S-> MからAの状態は、この場合には、Aが変更されたスレッドは、直ちに第2の操作の実施後、他のCPUスレッドを無効にする非同期通知を送信し、その後、第一storebuffersに書き込まれます。
この時点で、あなたはまだstorebuffers 1に変更される可能性があり、メインメモリに提出されていません。それは、メインメモリに提出される場合は、わかりません。
したがって、スレッドBが読み取りメソッドを呼び出し、表示されるフラグの変化を参照するが、変化を見ることができない、とがあるかもしれない並べ替え現象。