Prezentace se nahrává, počkejte prosím

Prezentace se nahrává, počkejte prosím

Synchronizace – čtenáři – písaři. více konzumentů více producentů konzument neodebírá data z paměti čtení se může provádět souběžně zápis vylučuje čtení.

Podobné prezentace


Prezentace na téma: "Synchronizace – čtenáři – písaři. více konzumentů více producentů konzument neodebírá data z paměti čtení se může provádět souběžně zápis vylučuje čtení."— Transkript prezentace:

1 Synchronizace – čtenáři – písaři

2 více konzumentů více producentů konzument neodebírá data z paměti čtení se může provádět souběžně zápis vylučuje čtení a naopak ale od každého může být více instancí kategorické vyloučení

3 roomEmpty.wait() writedata() roomEmpty.signal()

4 mutex.wait() readers = readers + 1 if readers == 1 roomempty.wait() mutex.signal() readdata() mutex.wait() readers = readers – 1 if readers == 0 roomEmpty.signal() mutex.signal()

5 poslední odejde a zhasne lock() unlock() vzor lightswitch písaři stárnou pokud stále přichází čtenáři, je potřeba zajistit, aby se dostalo i na písaře v algoritmu je implicitně zavedená priorita velmi zrádné – není vidět na první pohled

6 turnstile.wait() roomEmpty.wait() writedata() turnstile.signal() roomEmpty.signal()

7 turnstile.wait() turnstile.signal() mutex.wait() readers = readers + 1 if readers == 1 roomempty.wait() mutex.signal() readdata() mutex.wait() readers = readers – 1 if readers == 0 roomEmpty.signal() mutex.signal()

8 na písaře se rozhodně dostane ale nevíme přesně kdy zavedli jsme do algoritmu jinou implicitní prioritu plánovač zde nemůže pomoci nový požadavek pokud čeká písař, už nesmí vstoupit žádný další čtenář implicitní prioritu lze dále zvýšit

9 noReaders.wait() mutex1.wait() readers = readers + 1 if readers == 1: noWriters.wait() mutex1.signal() noReaders.signal() readdata() mutex1.wait() readers = readers - 1 if readers == 0: noWriters.signal() mutex1.signal()

10 mutex2.wait() writers = writers + 1 if writers == 1: noReaders.wait() mutex2.signal() noWriters.wait() writedata() noWriters.signal() mutex2.wait() writers = writers - 1 if writers == 0: noReaders.signal() mutex2.signal()

11 omezené zdroje (různého) druhu pro pokračování jsou potřeba alespoň 2 zdroje je nutné zabránit stárnutí a uváznutí musí pokračovat více jak jedno vlákno – je nutné zachovat efektivitu zdroj může být obsazen pouze jedním procesem

12 forks = array[0..cnt] of sem(1) function get_forks(i) fork(i).wait() fork(i+1 % cnt).wait() function put_forks(i) fork(i).signal() fork(i+1 % cnt).signal()

13 forks = array[0..cnt] of sem(1) function get_forks(i) room.wait() fork(i).wait() fork(i+1 % cnt).wait() function put_forks(i) room.signal() fork(i).signal() fork(i+1 % cnt).signal()

14 nesymetrické řešení jedno z vláken je levé testování zda je možné pokračovat více typů zdrojů

15

16 producent je jeden a nic nedělá pokud je buffer prázdný, konzument požádá o naplnění producent naplní buffer na maximum konzumenti začnou konzumovat kuchař a žrouti synchronizace výstupu

17 while (true) bufferEmpty.wait() fillbuffer(size) cnt == size bufferFull.signal()

18 while (true) mutex.wait() if (cnt == 0) bufferEmpty.signal() bufferFull.wait() cnt =- 1 d = getData() mutex.signal() processData(d)

19 celá řada modifikací např. delete – update – insert – select kategorické vyloučení je náchylné ke stárnutí vlákno čekající na více semaforů je náchylné k uváznutí je nutné stanovit si pravidla je potřeba snažit se o maximální efektivitu stárnutí není jen problém plánovače


Stáhnout ppt "Synchronizace – čtenáři – písaři. více konzumentů více producentů konzument neodebírá data z paměti čtení se může provádět souběžně zápis vylučuje čtení."

Podobné prezentace


Reklamy Google