私は、同期化は、単一のコアプロセッサでセマフォを使用して簡単に行うことができると理解します。しかし、マルチコアがある場合、複数のプロセスがクリティカルセクションに同じの時刻()を入力したい場合は、それらのすべてがクリティカルセクションに入るか、または1つだけが勝ちますか?勝者のプロセスはどの基準で勝利するのですか?マルチプロセッサシステムでの同期
答えて
セマフォは、1つのシステム内のスレッドに対して信号化を行う方法の1つに過ぎません。セマフォを1つまたはマルチコアCPUで使用することができますが、その使用には影響しません。
ここで質問をしましょう。クリティカルセクションがあり、複数のスレッドがそのエリアに入ることを望むなら、それらはそのエリアにすべて行きます。あなたは、メインスレッド(例えば)やそれらを起動する他のスレッドが、それらの間にある程度の時間間隔を置いていることを理解する必要があります(カップルnsのまわりの非常に小さな時間スペース)。 だから我々はシグナル化を使用しています。なぜなら、「勝者」は望んでおらず、ほとんどの場合、スレッドはその重要なセクションで望ましくない変更を加えることができるからです。
単一のコアシステムでは、異なるトレッドが割り当てられたタイムスロットを通じてコアを共有しなければならないため、ただ並行したプロセススケジューリング(TaskSchedulerを介した偽並列処理)しか実現できません。
2つのコアがクリティカルセクションに同時に入力しようとすると、両方のコアがロックされたリードモディファイライト操作を使用して同時にメモリ内のセマフォに書き込もうとします。コアが書き込みを完了するためには、キャッシュはセマフォを含むキャッシュラインへの排他的アクセスを獲得しなければならない。これにより、他のコアはラインをInvalidとしてマークします。キャッシュプロトコルは、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
命令も参照してください)。
cmpxchgには2つのオペランドがあります。さて、実際には3つですが、eaxは暗黙的です。 – prl
- 1. マルチプロセッサシステム上のPOSIXスレッド
- 2. Linuxカーネル:マルチプロセッサシステムのschedule()関数
- 3. はなぜマルチプロセッサシステムでは、私は他のプロセッサは、マルチプロセッサシステムにおける共有データに到達することができますので、割り込みが無効になっている場合でも、我々はマルチプロセッサシステムの同期</p> <p>ためのスピンロックを実装することを理解しました
- 4. 非同期イベントの同期
- 5. Azureのオフライン同期APIでのローカル同期ストアの初期化
- 6. cコールの同期はコマンドの同期と同じですか?
- 7. nodejsで非同期に同期する
- 8. シングルステートメントでの同期?
- 9. 非同期/同期ループNode.js
- 10. リクエストレスポンモデル/同期/非同期/イベントドリブン
- 11. 非同期ソケットと同期
- 12. RxJSとの非同期アクションの同期
- 13. 同期と非同期のアクティビティ
- 14. 非同期関数の同期例外
- 15. 同期コードの非同期実行
- 16. ベクトル(同期)のArrayList(非同期)
- 17. 同期非同期入力の処理
- 18. 非同期ループ内の非同期メソッド
- 19. 非同期メソッドの非同期メソッド
- 20. 同期対非同期データベースへのアクセス
- 21. リアルタイムアプリケーションの非同期対同期ソケットサーバー
- 22. C#での非同期シリアルポート呼び出しの同期クラスライブラリ
- 23. 非同期メソッドでの非同期ライブラリメソッドの使用
- 24. 同期呼び出し内での非同期タスクの実行
- 25. ApiControllerでの非同期初期化
- 26. コアデータのManagedObjectContext.ExecuteFetchRequestを非同期で非同期にする方法
- 27. バックボーンのトリガー()は同期または非同期ですか?
- 28. 同期コレクションで同期化 - >パフォーマンスの問題
- 29. 別の同期メソッド内で同期メソッドを参照する
- 30. アンドロイドの同期と非同期は何ですか?
お返事ありがとうございます。実際には、スレッドではないプロセスについて話しています。だから、いくつかの異なるプロセスのために、彼らはお互いに独立している、我々はスレッドに適用されたようにこれらのプロセスの間にわずかな時間差を作ることはできません。 –