Upload
carney
View
59
Download
0
Embed Size (px)
DESCRIPTION
Paralelní programování. Synchronizační vzory – bariéra. Synchronizační vzory – mutex. kolik semaforů? jaká počáteční hodnota?. Synchronizační vzory – mutex. kritická sekce acquire = wait, release = signal multiplex?. Synchronizační vzory – multiplex. semafor zámek - PowerPoint PPT Presentation
Citation preview
Paralelní programování
Synchronizační vzory – bariéra
Synchronizační vzory – mutex
• kolik semaforů?• jaká počáteční hodnota?
Mach Šebestováa1 count = count + 1 b1 count = count + 1
Synchronizační vzory – mutex
• kritická sekce• acquire = wait, release = signal• multiplex?
Mach Šebestovámutex(1)
a1 mutex.acquire() b1 mutex.acquire()
a2 count = count + 1 b2 count = count + 1
a3 mutex.release() b3 mutex.release()
Synchronizační vzory – multiplex
• semafor <> zámek• token, místnost, povolenka, permanentka• symetrické
Mach Šebestovámutex(n)
a1 mutex.acquire() b1 mutex.acquire()
a2 count = count + 1 b2 count = count + 1
a3 mutex.release() b3 mutex.release()
Dežo v mutexu
Synchronizační vzory – bariéra• symetrické rendezvous pro libovolný počet
vláken• všechna vlákna musí počkat až projdou bodem
setkání• po příchodu posledního vlákna mohou všichni
pokračovat dál• realizace
• n vláken• poslední vlákno otevře bariéru
Synchronizační vzory – bariéra
mutex.wait()count = count + 1
mutex.signal()
if count == nbarrier.signal()
barrier.wait() kdy funguje?kdy nefunguje?
Bariéra – turniket
mutex.wait()count = count + 1
mutex.signal()
if count == nbarrier.signal()
barrier.wait()barrier.signal()
Synchronizační vzory – bariéra• praktické využití
• pracovní vlákna• po dokončení práce se výsledky spojí• rozdá se nová práce
• spouští se v cyklu• potřebujeme bariéru, kterou lze znovu použít• wait v kritické sekci (uvnitř mutexu) je
nepoužitelný• turniket – bod, kterým vlákna prochází po
jednom, ale bez zdržení
Deadlock - drobná chybka
mutex.wait()count = count + 1if count == n
barrier.signal()barrier.wait()
barrier.signal()mutex.signal()
Bariéra – další (ne)řešení
mutex.wait()count = count + 1
mutex.signal()
if count == nturnstile.signal()
turnstile.wait()turnstile.signal()
mutex.wait()count = count – 1
mutex.signal()
if count == 0turnstile.wait();
problem?
Bariéra – další řešení
mutex.wait()count = count + 1if count == n
turnstile2.wait()turnstile.signal()
mutex.signal()
turnstile.wait()turnstile.signal()/* process */mutex.wait()
count = count – 1if count == 0
turnstile.wait();turnstile2.signal();
mutex.signal()
turnstile2.wait()turnstile2.signal();
počáteční hodnoty?
Bariéra – další řešení
mutex.wait()count = count + 1if count == nturnstile.signal(n)
mutex.signal()
turnstile.wait()/* process */mutex.wait()
count = count – 1if count == 0turnstile2.signal(n);
mutex.signal()
turnstile2.wait()