paralelní programování

Post on 06-Jan-2016

30 Views

Category:

Documents

2 Downloads

Preview:

Click to see full reader

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

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)

top related