Monitory, semafory, čtenáři/písaři
Zkouškový pattern
Zadání často chce krátkou definici P/V, monitoru, wait/signal, nebo klasický pseudokód pro readers-writers či producer-consumer. U monitoru se hodně kontroluje, jestli wait uvolní monitor.
Oficiální slidy
- Synchronizace, str. 33 až str. 36 - semafor,
P/V, čítač a fronta. - Synchronizace, str. 41 až str. 46 - producent/konzument přes semafory.
- Synchronizace, str. 53 až str. 56 - readers/writers a férovější varianta.
- Synchronizace, str. 64 až str. 68 - monitor, podmínkové proměnné,
wait/signal. - Synchronizace, str. 69 až str. 72 - implementace monitor/semafor a bounded buffer monitorem.
Semafor
Operace:
P(S):
if S > 0: S = S - 1
else blokuj proces ve frontě S
V(S):
if fronta S není prázdná: probuď jeden proces
else S = S + 1P a V musí být atomické.
Minimální odpověď: semafor je sdílený čítač s atomickými operacemi P a V; používá se k vyloučení nebo počítání dostupných zdrojů.
Monitor
Monitor zapouzdřuje sdílený stav a procedury. V monitoru je v jednom okamžiku aktivní nejvýše jeden proces. Podmínkové proměnné mají operace:
wait(c): proces se zablokuje na podmínce a uvolní monitor.signal(c): probudí jeden proces čekající na podmínce.
Minimální odpověď: monitor dává vzájemné vyloučení automaticky; podmínkové proměnné řeší čekání na stav uvnitř monitoru.
Čtenáři/písaři s předností čtenářů
Typická idea:
semaphore mutex = 1
semaphore wrt = 1
int readcount = 0
reader:
P(mutex)
readcount++
if readcount == 1: P(wrt)
V(mutex)
read()
P(mutex)
readcount--
if readcount == 0: V(wrt)
V(mutex)
writer:
P(wrt)
write()
V(wrt)Producent-konzument
Standardní semafory:
empty = Nfull = 0mutex = 1
Producent: P(empty), P(mutex), insert, V(mutex), V(full).
Konzument: P(full), P(mutex), remove, V(mutex), V(empty).
Monitor ze semaforů
Když se ptají obecně, stačí popsat princip:
- binární semafor chrání vstup do monitoru;
- čekání na podmínce musí uvolnit monitor;
signalpřesune/probudí čekající proces podle zvolené sémantiky;- je potřeba ošetřit frontu čekajících procesů.
Mini-drill
- Proč musí být
PaVatomické? - Co přesně udělá
wait(c)v monitoru? - Proč readers-writers s předností čtenářů může vyhladovět písaře?
- Jaké tři semafory stačí pro producer-consumer s bufferem velikosti
N?
Vyřešené příklady z termínů
Monitor, wait, signal
Zdroj: term-0-pretermin-a
Zadání: vysvětlit princip monitoru, zejména instrukce signal a wait, ilustrovat obrázkem.
Řešení:
- Monitor zapouzdřuje sdílený stav a procedury.
- V monitoru je v jednom okamžiku aktivní nejvýše jeden proces.
wait(c)zablokuje proces na podmínkové proměnnéca uvolní monitor.signal(c)probudí jeden proces čekající nac, pokud nějaký existuje.- Obrázek stačí kreslit jako monitor s frontou vstupu a frontami podmínkových proměnných.
Čtenáři/písaři s předností čtenářů
Zdroj: term-1-radny-b
Zadání: řešit readers-writers se semafory a předností čtenářů.
Řešení:
mutexchrání proměnnoureadcount.wrtblokuje písaře i první/poslední čtenářskou změnu.- První čtenář zamkne
wrt, poslední čtenář ho odemkne. - Písař jen
P(wrt), write, V(wrt). - Nevýhoda: při trvalém příchodu čtenářů může písař hladovět.
Producer-consumer
Zdroj: student-doc-digest
Zadání: klasický producent-konzument.
Řešení:
empty = Npočítá volná místa.full = 0počítá obsazená místa.mutex = 1chrání samotný buffer.- Producent:
P(empty), P(mutex), insert, V(mutex), V(full). - Konzument:
P(full), P(mutex), remove, V(mutex), V(empty).
Kde se to objevuje
Podle sjednocených termínových souborů v archivu:
- term-0-pretermin-a
- term-2-prvni-opravny
- term-1-radny-c
- term-1-radny-b
- term-1-radny-a
- term-1-radny-c
- term-3-druhy-opravny
- term-1-radny-c
- term-1-radny-b
- term-3-druhy-opravny
- term-2-prvni-opravny
- term-2-prvni-opravny
- term-1-radny-b
- term-1-radny-a
Chyby
waitv monitoru musí uvolnit monitor.signalnení totéž co semaforovéV.- U readers-writers s předností čtenářů může hladovět písař; pokud zadání říká neřešit hladovění, je to v pořádku.
- U producer-consumer nezaměnit pořadí
empty/full.