Deadlock bei MultiCore-Systemen vermeiden

Gast #2518698
Lesenswert?

Hi Leute,
wie wird denn bei einem Multicore-System ein Deadlock vermieden, wenn 
von mindestens zwei Cores zu exakt identischen Zeit die selbe 
Mutexe/Semaphore genommen werden möchte?
Das muss doch eigentlich vom Prozessor unterstützt werden, oder gibt es 
sowas wie Atomare Zugriffe, die alle anderen Cores lahmlegen?

Gruß
Jakob
Gast #2518767
Lesenswert?

A. K. schrieb:
> Ich nehme an, der Prozessor, um den es geht, ist streng geheim. Und das
> Betriebssystem ist handgehäkelt.

Nein ich bereite mich auf eine Prüfung vor =) Also keine geheime 
Hardware.

A. K. schrieb:
>Wenn man es richtig macht: Einer gewinnt, der andere dreht Runden.

1. Das bedeuted, der MultiCore wird zum SingleCore, oder?
2. Wie du schon sagst, einer gewinnt. Diese Entscheidung trifft aber die 
Hardware, richtig?
#2518781
Lesenswert?

Jakob schrieb:

> 1. Das bedeuted, der MultiCore wird zum SingleCore, oder?

Nein. Ein konkurrierender Core kann sich auch entschliessen, in der 
Wartezeit Hemdchen zu häkeln, statt Däumchen zu drehen. Ausserdem sind 
nur diejenigen Cores betroffen, die justament gleichzeitig um die 
Semaphore konkurrieren, der Rest kriegt rein garnix davon mit.

> 2. Wie du schon sagst, einer gewinnt. Diese Entscheidung trifft aber die
> Hardware, richtig?

Nicht wirklich. Es gewinnt der, der beim Semaphoren-Request als Erster 
durch Ziel geht, alle anderen die in der kritischen Zeit die Sema wollen 
kriegen signalisiert, dass die belegt ist. Die Hardware muss nur dafür 
sorgen, dass eine solche Semaphoren-Sequenz überhaupt möglich ist.
#2518798
Lesenswert?

Jakob schrieb:

> wie wird denn bei einem Multicore-System ein Deadlock vermieden,

Die Verwendung von einzelnen Semas/Mutexen sorgt nur dann für einen 
Deadlock, wenn derjenige, der sie grad besitzt, sie nicht wieder 
freigibt.

Zu einem Deadlock kommt es beispielsweise, wenn ein Thread nacheinander 
2 Mutexe an sich zieht, bei der zweiten scheitert, und dort wartet bis 
sie frei wird. Wenn das ein zweiter Thread das Gleiche tut, nur in 
umgekehrter Reihenfolge, dann hat jeder seine Mutex und wartet ewig auf 
die andere.
#2518806
Lesenswert?

Jakob schrieb:

> Das muss doch eigentlich vom Prozessor unterstützt werden, oder gibt es
> sowas wie Atomare Zugriffe, die alle anderen Cores lahmlegen?

Wenn wir mal ganz archaisch von einem einzelnen Bus ausgehen, dann löst 
sich das beispielsweise über einen ununterbrechbaren read-write 
Buszyklus (z.B. 68000, x86). Oder eben über die andere Methode mit 
speziellen Load- und Store-Befehlen, die ohne ununterbrechbare Buszyklen 
auskommt (ARM, PowerPC).

Bei heutigen Multicores mit Caches, Bus-Crossbars und Point-to-Point 
Bussen wird der tatsächliche Ablauf etwas komplexer.
#2518822
Lesenswert?

Jakob schrieb:

> Wenn also CORE1 gerade LOCK ausgeführt, und CORE2 ebenfalls gerade LOCK
> ausführt, wer gewinnt dann?

Wenn damit der LOCK Präfix bei x86 gemeint ist: Wenn es nur einen Bus 
gibt, dann kann ihn stets auch nur einer verwenden. Derjenige, dem die 
Busarbitrierung eines Multimaster-Busses den Vorrang eingeräumt hat, der 
zieht seinen gelockten Befehl durch. Der andere wartet die paar Takte 
bis der Bus wieder frei ist und streitet danach erneut um den Bus.

Das ist mit oder ohne LOCK gleich. Der einzige Unterschied ist, dass mit 
LOCK mehrere Buszyklem am Stück durchlaufen, ohne dass ein anderer 
Busmster reinrutschen kann.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren