paralelní programování

15
Paralelní programování Synchronizace – složitější vzory

Upload: quasim

Post on 06-Jan-2016

30 views

Category:

Documents


2 download

DESCRIPTION

Paralelní programování. Synchronizace – složitější vzory. Synchronizační vzory – fronta. máme dva druhy vláken pokračovat smí jen v párech 2 varianty smí pokračovat v párech danou činnost může vyvíjet n vláken současně ale budou stejné počty stejných typů musí pokračovat v párech - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Paralelní programování

Paralelní programování

Synchronizace – složitější vzory

Page 2: Paralelní programování

Synchronizační vzory – fronta• máme dva druhy vláken• pokračovat smí jen v párech• 2 varianty

• smí pokračovat v párech• danou činnost může vyvíjet n vláken současně• ale budou stejné počty stejných typů

• musí pokračovat v párech• tj. danou činnost smí vyvíjet pouze dvě vlákna současně

Page 3: Paralelní programování

Smí pokračovat v párech

menQueue.signal()womenQueue.wait()marry()

womenQueue.signal()menQueue.wait()marry()

Page 4: Paralelní programování

Musí pokračovat v párech – muž

mutex.wait()if women > 0

women = women – 1womenQueue.signal()

elsemen = men + 1mutex.signal()menQueue.wait()

marry()marriageDone.wait()mutex.signal()

Page 5: Paralelní programování

Musí pokračovat v párech – žena

mutex.wait()if men > 0

men = men – 1menQueue.signal()

elsewomen = women + 1mutex.signal()womenQueue.wait()

marry()marriageDone.signal()

Page 6: Paralelní programování

Synchronizační problémy

• typické úlohy• pro řešení se používají synchronizační vzory

• rendez-vous, bariéra, turniket, fronta

Page 7: Paralelní programování

Producent – konzument

• více producentů• více konzumentů• sdílená paměť – buffer• konzument odebírá data z paměti

• k paměti může přistupovat pouze jeden• čtení i zápis je exkluzivní

data = obtainData()buffer.push(data)

data = buffer.popprocessData(data)

Page 8: Paralelní programování

Producent

data = obtainData()mutex.wait()

buffer.push(data)items.signal()

mutex.signal()

Page 9: Paralelní programování

Konzument

items.wait()mutex.wait()

data = buffer.pop()mutex.signal()processData(data)

Page 10: Paralelní programování

Producent 2

data = obtainData()mutex.wait()

buffer.push(data)mutex.signal()items.signal()

změna?

Page 11: Paralelní programování

Konzument

mutex.wait()items.wait()data = buffer.pop()

mutex.signal()processData(data)

problém?

Page 12: Paralelní programování

Producent – konzument – konečný

• Reálně má buffer konečnou kapacitu• v případě producent2 ani neznáme aktuální

obsazení bufferu• pokud je buffer plný, musí producenti čekat na

uvolnění• pokud je buffer prázdný, musí konzumenti čekat na

naplnění

Page 13: Paralelní programování

Producent

data = obtainData()spaces.wait()mutex.wait()

buffer.push(data)mutex.signal()items.signal()

Page 14: Paralelní programování

Konzument

items.wait()mutex.wait()

data = buffer.pop()mutex.signal()spaces.signal()processData(data)

Page 15: Paralelní programování