Ich verstehe, dass die Synchronisation einfach mit einem Semaphor in einem Single-Core-Prozessor durchgeführt werden kann. Aber wo haben wir Multi-Cores, wenn mehrere Prozesse in den kritischen Abschnitt Zeitpunkt gleichzeitig eingeben wollen, tritt alle von ihnen in den kritischen Abschnitt oder nur einer gewinnt? Der Gewinner-Prozess gewinnt für welche Kriterien?Synchronisation in Multiprozessorsystemen
Antwort
Semaphore ist nur eine Möglichkeit, Signalisierung über Threads in einem System zu machen. Sie können Semaphore in einer oder mehreren CPUs verwenden, die keinen Einfluss auf seine Verwendung haben.
Jetzt zurück auf Ihre Frage. Wenn Sie einen kritischen Abschnitt haben und mehrere Threads in diesen Bereich wollen, werden sie alle in diesen Bereich gehen. Sie müssen verstehen, dass der Haupt-Thread (zum Beispiel) oder ein anderer Thread, der sie startet, einige Zeitabstände zwischen ihnen macht (sehr, sehr kleiner Zeitabstand um paar ns). Deshalb verwenden wir Signalisierung, weil wir nicht "Gewinner" wollen und andererseits in fast jedem Fall Gewinde können unerwünschte Änderungen in diesem kritischen Abschnitt machen.
In einem Single-Core-System können Sie nur eine simultane Prozessplanung erreichen (eine falsche Parallelität über einen TaskScheduler), da sich verschiedene Laufstreifen den Kern über zugewiesene Zeitfenster teilen müssen.
Wenn zwei Kerne gleichzeitig versuchen, in den kritischen Abschnitt einzudringen, versuchen beide gleichzeitig, mit einer gesperrten Lese-Modifizier-Schreib-Operation in den Semaphor im Speicher zu schreiben. Damit ein Kern den Schreibvorgang abschließen kann, muss der Cache exklusiven Zugriff auf die Cache-Zeile erhalten, die den Semaphor enthält. Dies zwingt den anderen Kern, die Zeile als ungültig zu markieren. Das Caching-Protokoll stellt sicher, dass nur ein Kern Exklusivzugriff erhalten kann und dieser Kern in den kritischen Abschnitt eintritt.
Währenddessen muss der andere Kern, der auch versucht, in den Semaphor zu schreiben, warten, weil er immer noch exklusiven Zugriff auf die Cache-Zeile benötigt. Sobald der erste Kern seine Schreiboperation beendet, erhält der andere Kern Exklusivzugriff und kann seinen Lese-Modifizier-Schreibvorgang abschließen. Aber das Ergebnis des read-modify-write sagt ihm, dass der Semaphor beschäftigt ist, so dass er den kritischen Abschnitt nicht betreten kann, bis er feststellt, dass der Semaphor freigegeben wurde.
Auch wenn mehrere Kerne vorhanden sind, funktioniert ein Semaphor (oder ein Mutex oder die meisten anderen Synchronisationsprimitiven) genau gleich - nur die angegebene Anzahl von Threads kann in den Semaphor eintreten. Es wäre in der Tat ein schlechter Semaphor, wenn es nur auf Single-Prozessor-Maschinen funktionieren würde!
Es gibt mehrere Mechanismen, die erforderlich sind, damit dies funktioniert, und ich werde versuchen, einen Überblick zu geben.
Beachten Sie, dass der Speicher immer noch zwischen den verschiedenen Kernen geteilt wird. Eine vereinfachte, aber IMO nützliche Weise, um zu verstehen, wie man Kerne mit Shared Memory synchronisiert, ist die CMPXCHG
instruction. Diese Anweisung kann atomar (siehe weiter unten) eine Speicheradresse vergleichen und einstellen. Es setzt auch das Null-Flag auf 1, wenn die Speicheradresse den Wert hatte, mit dem Sie verglichen haben.
Betrachten Sie den folgenden Code ein:
wait:
mov eax, 0
mov ecx, 1
lock cmpxchg [address of lock], ecx
jne wait
// We now own the lock
Der Code logisch folgende Schleifen tun: kann den Wert von lock
-1 nur, wenn lock
0.
Dieser Code von mehreren Kernen ausgeführt werden, und die Atomarität von cmpxchg
garantiert, dass nur ein Kern gewinnt.
Die Situation wird komplizierter, wenn jeder Kern seinen eigenen Cache hat (wie es heutzutage meistens der Fall ist). Bei einzelnen Caches hat jeder Kern seine eigene Sicht auf den Speicher, so dass darauf geachtet werden muss, dass diese Speicheransichten konsistent sind. Die kurze Antwort ist, dass dies geschehen kann, indem die Caches sich gegenseitig benachrichtigen, wenn Daten geändert werden, so dass andere Caches ihre Kopie ungültig machen oder ihre Kopie bei Bedarf aktualisieren können. Sehen Sie sich Snooping und das MESI-Protokoll an, um weitere Details zu diesem Thema zu erhalten.
Beachten Sie, dass, wenn die Kerne auf dem gleichen physischen Chip sind, sie alle für den Speicherbus konkurrieren und es gibt Mechanismen für die gemeinsame Nutzung zwischen den Kernen (z. B. Schiedsverfahren; siehe auch die LOCK
Anweisung).
cmpxchg hat zwei Operanden. Nun, eigentlich drei, aber eax ist implizit. – prl
- 1. Java - Verwendung von flüchtigen nur in Multiprozessorsystemen sinnvoll?
- 2. Synchronisation in abstrakte Klasse
- 3. Synchronisation in Manchester-Codierung
- 4. CountDownLatch Synchronisation
- 5. Threading/Synchronisation
- 6. Java Synchronisation
- 7. Synchronisation in Vektoren in Java
- 8. hashtable und Synchronisation in Java
- 9. Thread-Synchronisation in SQL sicherstellen?
- 10. Unerwartete Kerne Synchronisation in pcntl_fork()
- 11. Synchronisation in Threads für Java
- 12. Synchronisation zwischen Befehlspuffern in Vulkan
- 13. Inner Synchronisation auf das gleiche Objekt wie die äußere Synchronisation
- 14. Singleton Synchronisation C++
- 15. SQL 2012 Synchronisation
- 16. .net onpaint vertikale Synchronisation
- 17. Synchronisation mit Master-Datenbank
- 18. Multiplayer-Spiel-Synchronisation
- 19. Einheit harte Echtzeit-Synchronisation
- 20. Eigenschaft/Felder Thread-Synchronisation
- 21. SymmetricDS Zweiweg-Synchronisation Doppeleinsatz
- 22. Synchronisation zwischen zwei Aufgaben
- 23. SonarLint Synchronisation mit Sonarqube
- 24. Javascript Event Synchronisation
- 25. Synchronisation mit JSONObjectRequest (Android)
- 26. Mutli-Player Spiel Synchronisation
- 27. Unity Compute Shader Synchronisation
- 28. Synchronisation Getter und Setter
- 29. Thread-Synchronisation und Elementfunktion
- 30. Lotus Notes Synchronisation
Danke für die Antwort. Eigentlich erzähle ich über Process nicht Thread. Für mehrere verschiedene Prozesse sind sie voneinander unabhängig, wir können nicht einen winzigen Zeitunterschied zwischen diesen Prozessen machen, wie Sie das auf Threads angewendet haben. –