2017-08-10 3 views
3

私は、同期化は、単一のコアプロセッサでセマフォを使用して簡単に行うことができると理解します。しかし、マルチコアがある場合、複数のプロセスがクリティカルセクションに同じの時刻()を入力したい場合は、それらのすべてがクリティカルセクションに入るか、または1つだけが勝ちますか?勝者のプロセスはどの基準で勝利するのですか?マルチプロセッサシステムでの同期

答えて

0

セマフォは、1つのシステム内のスレッドに対して信号化を行う方法の1つに過ぎません。セマフォを1つまたはマルチコアCPUで使用することができますが、その使用には影響しません。

ここで質問をしましょう。クリティカルセクションがあり、複数のスレッドがそのエリアに入ることを望むなら、それらはそのエリアにすべて行きます。あなたは、メインスレッド(例えば)やそれらを起動する他のスレッドが、それらの間にある程度の時間間隔を置いていることを理解する必要があります(カップルnsのまわりの非常に小さな時間スペース)。 だから我々はシグナル化を使用しています。なぜなら、「勝者」は望んでおらず、ほとんどの場合、スレッドはその重要なセクションで望ましくない変更を加えることができるからです。

単一のコアシステムでは、異なるトレッドが割り当てられたタイムスロットを通じてコアを共有しなければならないため、ただ並行したプロセススケジューリング(TaskSchedulerを介した偽並列処理)しか実現できません。

+0

お返事ありがとうございます。実際には、スレッドではないプロセスについて話しています。だから、いくつかの異なるプロセスのために、彼らはお互いに独立している、我々はスレッドに適用されたようにこれらのプロセスの間にわずかな時間差を作ることはできません。 –

1

2つのコアがクリティカルセクションに同時に入力しようとすると、両方のコアがロックされたリードモディファイライト操作を使用して同時にメモリ内のセマフォに書き込もうとします。コアが書き込みを完了するためには、キャッシュはセマフォを含むキャッシュラインへの排他的アクセスを獲得しなければならない。これにより、他のコアはラインをInvalidとしてマークします。キャッシュプロトコルは、1つのコアだけが排他アクセスを獲得し、そのコアがクリティカルセクションに入ることを保証します。

一方、セマフォにも書き出しようとしているもう一方のコアは、キャッシュラインへの排他的アクセスが必要なため、待機する必要があります。最初のコアが書き込み操作を終了するとすぐに、もう一方のコアは排他アクセスを取得し、その読み取り - 変更 - 書き込みを完了できます。しかし、リード・モディファイ・ライトの結果、セマフォがビジーであることを知らせるので、セマフォが解放されたことを検出するまでクリティカル・セクションに入ることはできません。

1

複数のコアが存在する場合でも、セマフォ(またはミューテックス、またはその他のほとんどの同期プリミティブ)はまったく同じように動作します。指定された数のスレッドだけがセマフォに入ることができます。シングルプロセッサマシンでのみ動作するのであれば、セマフォーは貧弱です!

この作業を行うためには複数のメカニズムが必要ですが、私は高度な見方をしようとします。

なお、メモリは異なるコア間で共有されています。共有メモリを使用してコアを同期させる方法を理解する簡略化されたIMOの便利な方法はCMPXCHG instructionです。この命令は、アトミックに(以下の詳細を参照)、メモリアドレスを比較して設定することができます。また、メモリアドレスに比較していた値がある場合は、ゼロフラグを1に設定します。 、lockが0

である場合にのみ、このコードは、複数のコアで実行することができます1へlockの値を設定します。コードは、論理的に次の操作を行うループ

wait: 
mov eax, 0 
mov ecx, 1 
lock cmpxchg [address of lock], ecx 
jne wait 
// We now own the lock 

は、次のコードを考えてみましょうcmpxchgのアトミック性は、1つのコアだけが勝つことを保証します。

各コアに独自のキャッシュがあると状況がより複雑になります(通常の場合と同様)。個々のキャッシュでは、各コアに独自のメモリビューがあるため、これらのメモリビューが一貫していることを保証するように注意する必要があります。簡単な答えは、データが変更されたときにキャッシュに通知して、他のキャッシュが必要に応じてそのコピーを無効にしたり更新できるようにすることで可能になることです。これについての詳細は、スヌーピングとMESIプロトコルを参照してください。

コアが同じ物理チップ上にある場合、それらはすべてメモリバスと競合しており、コア間で共有するメカニズムがあります(たとえば調停メカニズム、LOCK命令も参照してください)。

+0

cmpxchgには2つのオペランドがあります。さて、実際には3つですが、eaxは暗黙的です。 – prl

関連する問題