Forum: PC-Programmierung Deadlock bei MultiCore-Systemen vermeiden


von Jakob (Gast)


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

von Hans M. (hansilein)


Lesenswert?

seit dem 386 gibt es
BTC  Bit test and complement
BTR  Bit test and reset
BTS  Bit test and set

http://en.wikipedia.org/wiki/X86_instruction_listings

von Jakob (Gast)


Lesenswert?

Es geht aber doch um MulitCORE nicht um Multithreading.
Was passiert denn wenn beide Cores zur IDENTISCHEN Zeit BTC,... 
aufrufen?

von Hans M. (hansilein)


Lesenswert?


von Jakob (Gast)


Lesenswert?

ahh, ok.
Wenn also CORE1 gerade LOCK ausgeführt, und CORE2 ebenfalls gerade LOCK 
ausführt, wer gewinnt dann?
Gabs bei den 386ern schon MultiCore- Prozessoren?
Wenn ja, muss es bei synchron laufenden Cores nicht zwangsläufig ein 
Ausschlussverfahren "in Hardware" geben?

Danke schonmal für die Antworten

von (prx) A. K. (prx)


Lesenswert?

Jakob schrieb:

> Was passiert denn wenn beide Cores zur IDENTISCHEN Zeit BTC,...
> aufrufen?

Wenn man es richtig macht: Einer gewinnt, der andere dreht Runden.

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

von (prx) A. K. (prx)


Lesenswert?

Jakob schrieb:

> Gabs bei den 386ern schon MultiCore- Prozessoren?

Nein, aber das dazu gehörende Bus-Locking gab es bereits anno 8086 in 
Form des LOCK Prefix, denn Multiprozessorsysteme hatte Intel bereits 
damals beim Multibus vorgesehen.

von Jakob (Gast)


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?

von (prx) A. K. (prx)


Lesenswert?

Jakob schrieb:

> Wenn ja, muss es bei synchron laufenden Cores nicht zwangsläufig ein
> Ausschlussverfahren "in Hardware" geben?

Jein. Hardware-Support ja, aber es geht auch ohne Busblockade durch die 
entsprechenden Befehle, wie sie bei x86 üblich ist. Ein Beispiel dafür, 
wie es ohne geht, bietet ARM mit den LDREX/STREX Befehlen.

von (prx) A. K. (prx)


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.

von (prx) A. K. (prx)


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.

von (prx) A. K. (prx)


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.

von (prx) A. K. (prx)


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.

von Jakob (Gast)


Lesenswert?

Danke für die ausführlichen Antworten.

Guten Abend!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.