Broadcast, FIFO, kauzalita, ABCAST
Zkouškový pattern
Zadání bývá jedna ze tří forem: napsat algoritmus FIFO broadcastu, rozhodnout vlastnosti v diagramu, nebo vysvětlit synchronizovatelnost přes korunu. Hodnotí se hlavně přesné rozlišení FIFO, kauzality a atomicity.
Oficiální slidy
- Komunikace, str. 13 - FIFO, kauzální a úplné uspořádání zpráv.
- Komunikace, str. 14 - třídy broadcastu: Reliable, FIFO, Causal, Atomic.
- Komunikace, str. 15 - algoritmus FIFO všesměrového vysílání.
- Komunikace, str. 17 - relace kauzality pro causal broadcast.
- Komunikace, str. 22 - ABCAST algoritmus a rozhodnuté priority.
- Komunikace, str. 32 až str. 34 - koruna a synchronizovatelnost; diagramy kontroluj v PRL2526_Komunikace.pdf.
Vizualizace a drill stránky
- FIFO broadcast: sekvence a buffer
- Kauzalita: happened-before
- Broadcast vlastnosti: FIFO, kauzalita, atomicita
- Koruna a synchronizovatelnost
Pojmy
- FIFO broadcast: zprávy od stejného odesílatele jsou každému příjemci doručeny ve stejném pořadí, v jakém byly odeslány.
- Kauzální broadcast: pokud
m1 -> m2v relaci happened-before, všichni doručím1předm2. - Atomic broadcast/ABCAST: všichni správní příjemci doručí zprávy ve stejném globálním pořadí.
- Synchronizovatelnost: asynchronní průběh lze reprezentovat synchronním, pokud splňuje podmínky dané komunikační strukturou, často se zkouší přes “korunu”.
Minimální odpověď
- FIFO řeší pořadí zpráv od stejného odesílatele.
- Kauzalita řeší happened-before, tedy lokální pořadí, send/receive a tranzitivitu.
- Atomicita řeší stejné globální pořadí doručení u všech procesů.
- Porušení hledej až na úrovni doručení aplikaci, ne pouhého přijetí do bufferu.
FIFO broadcast algoritmus
Typická šablona:
- Každý proces drží pořadové číslo zpráv od každého odesílatele.
- Odesílatel inkrementuje vlastní sekvenční číslo a posílá
(sender, seq, payload). - Příjemce doručí zprávu od
senderjen pokudseq == next[sender]. - Jinak ji odloží do bufferu.
- Po doručení zprávy zkontroluje buffer, jestli se neuvolnily další zprávy.
Kauzalita
Relace ->:
- Události ve stejném procesu jsou uspořádané lokálním pořadím.
- Odeslání zprávy předchází jejímu přijetí.
- Relace je tranzitivní.
Jak řešit diagramy
- Vypsat pro každý proces lokální pořadí událostí.
- Doplnit hrany send → receive.
- Udělat tranzitivní uzávěr jen v nutném rozsahu.
- Hledat porušení:
- FIFO: stejný odesílatel, jeden příjemce, obrácené doručení.
- Kauzalita: doručení následku před příčinou.
- Atomicita: dva procesy doručí stejné zprávy v jiném pořadí.
Koruna / synchronizovatelnost
U úloh async → sync hledej cyklickou závislost mezi zprávami a procesy, která brání tomu, aby šel průběh rozřezat na synchronní kola. Typická odpověď:
- označit problematické zprávy;
- ukázat lokální pořadí na procesech;
- vysvětlit, proč vzniká koruna;
- navrhnout odstranění nebo změnu pořadí zpráv, pokud zadání chce opravu.
Mini-drill
- Může FIFO porušit dvojice zpráv od různých odesílatelů?
- Jaké tři typy hran tvoří happened-before?
- Jak poznáš porušení atomic broadcastu?
- Proč bufferované přijetí není totéž co doručení?
Vyřešené příklady z termínů
Kauzální broadcast a relace kauzality
Zdroj: term-0-pretermin-a
Zadání: popsat vysílání/přijímání zprávy při kauzálním všesměrovém vysílání a definovat relaci kauzality.
Řešení:
- Každý proces přenáší s broadcast zprávou informaci o kauzální historii, typicky vektorové hodiny nebo množinu závislostí.
- Příjemce zprávu nedoručí aplikaci hned, pokud ještě nedoručil její kauzální předchůdce.
- Relace kauzality
->vzniká z lokálního pořadí událostí, hran send → receive a tranzitivního uzávěru. - Po doručení chybějících předchůdců lze zprávu uvolnit z bufferu.
FIFO broadcast send/recv
Zdroj: term-2-prvni-opravny
Zadání: napsat algoritmus send a recv pro FIFO broadcast a definovat relaci kauzality.
Řešení:
send(m):
seq[self]++
broadcast(self, seq[self], m)
recv(sender, s, m):
if s == next[sender]:
deliver(m)
next[sender]++
while buffer obsahuje zprávu (sender, next[sender]):
deliver(bufferovaná zpráva)
next[sender]++
else:
bufferuj(sender, s, m)FIFO se kontroluje samostatně pro každého odesílatele.
Koruna a synchronizovatelnost
Zdroj: term-0-pretermin
Zadání: vysvětlit, co je koruna, a dát příklad komunikace, kde koruna je nebo není.
Řešení:
- Koruna je cyklický pattern závislostí mezi procesy a zprávami, který brání rozdělení asynchronního průběhu na synchronní kola.
- Při řešení diagramu hledej cyklus: proces lokálně čeká na pořadí, zpráva vytváří závislost na jiném procesu, a po několika krocích se závislost vrátí zpět.
- Pokud koruna existuje, průběh obecně nelze synchronizovat bez změny pořadí nebo odstranění některých zpráv.
- Pokud žádný takový cyklus nevzniká, lze zprávy seskupit do synchronních kol.
Kde se to objevuje
Podle sjednocených termínových souborů v archivu:
- term-0-pretermin-b
- term-0-pretermin-a
- term-0-pretermin
- term-2-prvni-opravny
- term-0-pretermin-b
- term-3-druhy-opravny
- term-2-prvni-opravny
- term-0-pretermin
- term-3-druhy-opravny
- term-1-radny-a-zkratka
- term-0-pretermin
- term-3-druhy-opravny
- term-2-prvni-opravny-b
- term-2-prvni-opravny-a
- term-1-radny-c
- term-3-druhy-opravny
- term-1-radny-zkratka
- term-1-radny-b
- term-1-radny-a
Chyby
- Zaměnit přijetí zprávy s doručením aplikaci.
- Posuzovat FIFO mezi různými odesílateli.
- Přehlédnout tranzitivitu kauzality.
- U atomicity kontrolovat jen jeden proces místo porovnání pořadí mezi procesy.