paralelní programování
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 PresentationTRANSCRIPT
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• tj. danou činnost smí vyvíjet pouze dvě vlákna současně
Smí pokračovat v párech
menQueue.signal()womenQueue.wait()marry()
womenQueue.signal()menQueue.wait()marry()
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()
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()
Synchronizační problémy
• typické úlohy• pro řešení se používají synchronizační vzory
• rendez-vous, bariéra, turniket, fronta
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)
Producent
data = obtainData()mutex.wait()
buffer.push(data)items.signal()
mutex.signal()
Konzument
items.wait()mutex.wait()
data = buffer.pop()mutex.signal()processData(data)
Producent 2
data = obtainData()mutex.wait()
buffer.push(data)mutex.signal()items.signal()
změna?
Konzument
mutex.wait()items.wait()data = buffer.pop()
mutex.signal()processData(data)
problém?
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í
Producent
data = obtainData()spaces.wait()mutex.wait()
buffer.push(data)mutex.signal()items.signal()
Konzument
items.wait()mutex.wait()
data = buffer.pop()mutex.signal()spaces.signal()processData(data)