• Vzájemné vyloučení je mechanismus, který zajišťuje, že v daném okamžiku může určitý kritický úsek kódu (nebo sdílený prostředek) používat pouze jeden proces.
  • Je důležitý pro zajištění konzistence a zabránění konfliktů.

Centralizované řešení

  • Velmi jednoduchá myšlenka i provedení.
  • Jeden uzel (rozhodčí) rozhoduje o výhradním přístupu ke sdílenému zdroji.

Postup:

  • Rozhodčí drží frontu žádostí.
  1. Zájemce pošle žádost.
  2. Rozhodčí potvrdí OK, je-li zdroj volný, jinak dá do fronty.
  3. Proces po dokončení práce pošle RELEASE.
  4. Rozhodčí pošle OK dalšímu ve frontě, nebo čeká na žádost.
  • Rozhodčí může selhat to ostatní nepoznají.
  • Rozhodčí může být přetížený (je to prostě bottleneck).

Ricart-Agrawala algoritmus

  • Byl navržen aby umožnil procesům koordinovat svůj přístup ke sdíleným zdrojům.

  • Stačí nám méně zpráv (než u využití logických hodin) a není potřeba FIFO komunikace

  • Každý proces má logické hodiny.

  • Procesy si posílají typy zpráv:

    • request
    • ack

Postup:

  1. Proces , který chce vstoupit zašle request ostatním .
  2. Proces při přijetí pošle ack pokud nechce vstoupit nebo je menší než logické hodiny procesu , jinak si přidá do fronty.
  3. Při přijetí ack zpráv, proces vstoupí do kritické sekce.
  4. Při výstupu proces pošle ack všem ve frontě čekajícím procesům.

Problém:

  • bodů selhání
    • Lze vyřešit opakovaným posíláním zprávy, kdy odesílatel po neobdržení odpovědí usoudí, že proces selhal.
  • Vyžaduje multicast komunikaci
    • Nevhodné pro rozsáhlé systémy, protože je potřeba evidence.

Token-ring algoritmus

  • Algoritmus využívající princip tokenu - speciální zpráva, která obíhá mezi uzly.

  • Tento token určuje, který proces má aktuálně právo vstoupit do kritické sekce.

  • Inicializace:

    • Každý uzel v systému má určený identifikátor a zná seznam všech uzlů v DS.
    • Tyto uzly jsou uspořádány do logického kruhu (obecně nezávislé na fyzické topologii).
  • Token:

    • Token je speciální zpráva, která obíhá mezi uzly v kruhové síti.
    • Kdo má token, může vstoupit do kritické sekce.
  • Vstup do kritické sekce:

    • Když token dorazí k uzlu, který si přeje vstoupit do kritické sekce, může vstoupit do této části kódu.
    • Během této doby ostatní uzly nemohou vstoupit do kritické sekce.
  • Opuštění kritické sekce:

    • Když proces dokončí svou činnost v kritické sekci, předá token dalšímu uzlu v prstenci.
  • Kruhový pohyb tokenu:

    • Token pokračuje v obíhání v kruhu.
    • Uzly, které si nepřejí vstoupit do kritické sekce, pouze předávají token dál.

Problémy:

  • Ztráta tokenu
  • Udržování topologie
  • Je důležité poznamenat, že toto řešení funguje dobře pro malé a střední sítě. Může mít problémy s výkonem a efektivitou ve velkých systémech.

Decentralizované řešení

  • Každý zdroj je replikován krát. Přitom každá replikace má svého koordinátora.
  • Pokud chce proces vstoupit do kritické sekce, pošle zprávu každému koordinátorovi (tedy zpráv).
  • Koordinátor může poslat pouze jedno potvrzení, pokud dostane více žádostí, ignoruje je.
  • Pokud proces dostane nadpoloviční počet potvrzení, může vstoupit do kritické sekce.
  • Po vystoupení z kritické sekce, informuje všechny, že odešel a může se znovu hlasovat.

*Toto je navíc z předchozího ročníku.

Logické hodiny

  • Lamportovy logické hodiny mohou být využity pro implementaci algoritmu vzájemného vyloučení v DS.

  • Každý proces má logické hodiny.

  • Všechny procesy si posílají 3 druhy zpráv.

    • request
    • release
    • ack
  • Request:

    • Proces každému procesu posílá zprávu s hodnotou logických hodin (žádá o vstup) a zprávu si uloží do fronty.
    • Při přijetí request je uloženo do fronty a posláno potvrzení ack.
  • Release:

    • Proces každému procesu zasílá zprávu (oznámení o výstupu), při přijetí je smazáno z fronty.
  • Ack:

    • Potvrzení request.

Zvyšování hodin:

  • Každé volání request, release, ack hodiny .

Podmínka o vstup:

  • Proces vstoupí do kritické sekce pokud má ve frontě request s hodnotou .
  • je menší než všechny ostatní request ve frontě.
  • Obdržel potvrzení od každého uzlu s hodnotou větší než Všechny body musí platit.

Warning

Komunikace musí probíhat FIFO