2017-08-10 5 views
3

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

0

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.

+0

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. –

1

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.

1

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).

+0

cmpxchg hat zwei Operanden. Nun, eigentlich drei, aber eax ist implizit. – prl