CPUとMESIキャッシュ・コヒーレンシを並べ替えます

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が読み取りメソッドを呼び出し、表示されるフラグの変化を参照するが、変化を見ることができない、とがあるかもしれない並べ替え現象。

おすすめ

転載: www.cnblogs.com/minikobe/p/12123661.html