zámky vs lock-free struktury

[!note] TL;DR

  • zámky jsou jednodušší a bezpečnější pro běžný kód,
  • lock-free je náročnější, ale škáluje a neblokuje.

Datové struktury se zámky (blocking)

  • Princip: Používají mutex (často jemnozrnné - např. zámek pro každý uzel stromu nebo “sliding window” zámků).

Problémy

  • deadlock:Nekonečné čekání procesů na zámky držené navzájem.
  • priority inversion: Proces s nízkou prioritou blokuje proces s vysokou prioritou.
  • starvation: Proces se nemusí nikdy dostat na řadu.
  • no fault tolerance: Pokud proces spadne, když drží zámek, zbytek systému navždy “zamrzne” .
  • composability: Těžko se skládají atomické operace dohromady (např. přesun prvku mezi dvěma zamčenými strukturami může vést k deadlocku).

Bezzámkové datové struktury (lock-free struktura)

Princip: Využívají CAS/LLSC. Zaručují, že alespoň jeden proces uspěje v konečném čase.

Problémy:

  • složitost: Náročné na implementaci a dokazování korektnosti.
  • ABA problém: Nutno řešit verzováním nebo správou paměti.
  • Správa paměti: Nelze jednoduše uvolnit paměť (free), protože ji může číst jiný proces. Nutno použít techniky jako Hazard Pointers nebo Reference Counting .
  • Livelock: Procesy mohou neustále “bojovat” a restartovat se, i když systém jako celek postupuje.