Vlákno (program)

Z Wikipedie, otevřené encyklopedie
Skočit na: Navigace, Hledání

Vlákno (též vlákno řízení, anglicky thread) označuje v informatice odlehčený proces, pomocí něhož se snižuje režie operačního systému při změně kontextu, které je nutné pro zajištění multitaskingu (zdánlivého běhu více úloh zároveň, který je zajištěn jejich rychlým střídáním na procesoru) nebo při masivně paralelních výpočtech. Zatímco běžné procesy jsou navzájem striktně odděleny, sdílí vlákna nejen společný paměťový prostor, ale i další struktury.

Operační systém, který vlákna nepodporuje, má technicky jedno vlákno na každý proces, zatímco při podpoře vláken je možné v rámci jediného procesu vytvořit mnoho vláken. Vlákna usnadňují díky sdílené paměti vzájemnou komunikaci, což však přináší další komplikace v podobě souběhu (anglicky race condition).

Charakteristika[editovat | editovat zdroj]

Praktickým rozdílem mezi multithreadovým a multiprocesovým multitaskingem je kromě sdílené paměti (která některé věci usnadňuje a jiné naopak ztěžuje) režie při přepínání:

  • Přepnutí mezi vlákny bývá výrazně rychlejší neboť vlákna sdílejí stejnou paměť a uživatelská práva svého mateřského procesu a není je třeba při přepínání měnit.
  • V některých případech není třeba při přepínání vláken volat jádro OS.
  • Rychlejší může být i vytváření a rušení vlákna.
  • Vlákno také spotřebuje méně paměti, což je důležité pro aplikace, které používají stovky nebo více vláken.

Vlákna je možné vytvořit i čistě na aplikační úrovni bez nativní podpory operačního systému (využitím sdílené paměti a dalších technik). Takto vzniklá vlákna je poté možné spouštět postupně v jednotlivých procesech operačního systému nebo takzvaně m:n, tedy v několika vláknech operačního systému současně spouštět větší počet aplikačních vláken. Toto řešení sice není tak dobré jako řešení s podporou operačního systému - například volání služby operačního systému zablokuje „větší“ vlákno OS a ne jenom aplikační vlákno - ale pro některé úlohy může být stále rychlejší.

Podpora vláken v OS[editovat | editovat zdroj]

Z hlediska spravování vláken OS můžeme vlákna rozdělit na

  • vlákna na uživatelské úrovni (ULT)
  • vlákna na úrovni jádra (KLT)
  • kombinace KLT a ULT

Vlákna na uživatelské úrovni (ULT)[editovat | editovat zdroj]

Správu vláken provádí tzv. vláknová knihovna (thread library) na úrovni aplikačního procesu, jádro operačního systému o jejich existenci neví a přepojování mezi vlákny nepožaduje provádění funkcí jádra. Nepřepíná se ani kontext procesu ani režim procesoru. Přepínání vláken a jeho plánování je specifické pro konkrétní aplikaci. Programátor má možnost zvolit si nejvhodnější plánovací strategii a algoritmus sám. U OS není vyžadováno multiprogramování, stačí speciální knihovna. Příklad V případě POSIXu je to knihovna Pthreads („pítreds“)

Vláknová knihovna[editovat | editovat zdroj]

Pro provozování vláken na uživatelské úrovni je třeba speciální knihovna, která musí umožňovat:

  • rušení a vytváření vláken
  • předávání dat a zpráv mezi vlákny
  • plánování běhu vláken
  • uchovávání a obnova kontextu vláken

Výhody uživatelských vláken[editovat | editovat zdroj]

  • nezávislost na podpoře vláken v OS
  • přepínání mezi vlákny je nezávislé na OS (může být rychlejší)
  • výrazně rychlejší tvorba a přepínání vláken
  • plná kontrola procesu nad správou běhu vláken

Nevýhody[editovat | editovat zdroj]

  • volání služby jedním vláknem zablokuje všechna vlákna procesu
  • nutnost dodatečného programování (řízení vláken programátorem)
  • pokud jádro přiděluje procesor pouze procesům, nemohou dvě vlákna téhož procesu běžet současně, i když systém obsahuje více procesorů

Vlákna na úrovni jádra OS (KLT)[editovat | editovat zdroj]

Veškerá správa vláken je řízena OS a každé vlákno v uživatelském prostoru je zobrazeno na vlákno v jádře. Samotné jádro vytváří, ruší a plánuje vlákna.

Výhody[editovat | editovat zdroj]

  • volání systému neblokuje ostatní vlákna téhož procesu
  • jeden proces může využít více procesorů
  • tvorba, rušení a přepínání mezi vlákny je levnější než mezi procesy
  • i programy jádra mohou mít vícevláknový charakter

Nevýhody[editovat | editovat zdroj]

  • správa je nákladnější než u čistě uživatelských vláken

Příklady[editovat | editovat zdroj]

  • Windows NT 4.0/2000/XP
  • Linux
  • 4.4BSD UNIX

Kombinace ULT a KLT[editovat | editovat zdroj]

Některé OS podporují oba způsoby běhu vláken. Přiřazování uživatelských vláken k systémovým se děje automaticky (bez programátora) anebo programátor může nastavit počet vláken na úrovni jádra.

Podpora u OS[editovat | editovat zdroj]

Kombinaci ULT a KLT podporují například následující OS:

  • Windows 2000/XP s nadstavbou ThreadFiber
  • FreeBSD 5.x

Kdy se vlákna používají[editovat | editovat zdroj]

  • Obsluha periferií
    • U některých zařízení je třeba periodicky testovat stav hardware.
    • Vláknu pak nemusí zbývat mnoho času na obsluhu uživatelského rozhraní.
    • Jedno vlákno pro komunikaci s uživatelem a druhé obsluhuje hardware
  • Síťová komunikace
    • Jedno vlákno akceptuje příchozí komunikace.
    • Jedno vlákno odesílá data.
    • Jedno vlákno zpracovává data.
  • Vyvolání dojmu rychlé odezvy programu
    • Práce s velkým objemem data uložených v databázi.
    • Hlavní vlákno pouze obsluhuje uživatelské rozhraní, další pracuje s databází.
  • Urychlení výpočtu
    • Lze-li spustit na víceprocesorovém stroji kooperující vlákna na několika procesorech.
  • Vhodné pro architekturu aplikace
    • Simulace – jedno vlákno počítá vlastní simulaci.
    • Další vlákno periodicky vzorkuje stav simulace a zobrazuje ho.
    • Primární vlákno obsluhuje uživatelské rozhraní
  • Efektivita
    • Některé aplikace jsou ze své podstaty nevhodná pro jednovláknovou architekturu.
    • Použití vláken může vést k výraznému zpřehlednění programového kódu
    • V moderním OS už beztak běží několik vláken, pár navíc nehraje roli Každý OS má maximální strop na počet threadů, kdy je plánování procesu stále ještě efektivní.

Vlákna je výhodné použít, pokud aplikace splňuje některé následující kritérium[editovat | editovat zdroj]

  • Je složena z nezávislých úloh.
  • Může být blokována po dlouho dobu.
  • Obsahuje výpočetně náročnou část.
  • Musí reagovat na asynchronní události.
  • Obsahuje úlohy s nižší nebo vyšší prioritou než zbytek aplikace.

Nevýhody vláken[editovat | editovat zdroj]

  • Vlákna by se měla používat jen tam, kde je to opravdu nutné, protože tvorba vlákna na určitých platformách je poněkud zdlouhavá operace.
  • K vyřešení tohoto problému se u vícevláknových aplikací používá mechanismus sdružování vláken.
  • Každé vytvořené vlákno vytváří v paměti vlastní zásobník, do kterých jsou ukládány mezivýsledky, stavy proměnných, adresy apod.
  • I když je teoreticky možné vytvářet obrovský počet vláken, maximální počet vláken je omezen platformou.
  • Zvýšená složitost kódu.
  • Daleko složitější sledovat tok programu.
  • Sdílení prostředků, za kterou je většinou odpovědný programátor.
  • K řízení sdílení prostředků se používá synchronizace → zaručuje, že stav dat nebude změněn z více vláken zároveň.

Modely vícevláknových aplikací[editovat | editovat zdroj]

Modely řeší způsob vytváření a rozdělování práce mezi vlákna.

  • Boss/Worker - hlavní vlákno řídí rozdělení úlohy jiným vláknům.
  • Peer - vlákna běží paralelně bez specifického vedoucího.
  • Pipeline - zpracování dat sekvencí operací. Předpokládá dlouhý vstupní proud dat.

Boss/Worker[editovat | editovat zdroj]

Hlavní vlákno je zodpovědné za vyřizování požadavků. Pracuje v cyklu:

  1. příchod požadavku,
  2. vytvoření vlákna pro řešení příslušného úkolu,
  3. návrat na čekání požadavku.

Výstup řešení úkolu je řízen[editovat | editovat zdroj]

  • Příslušným vláknem řešícím úkol.
  • Hlavním vláknem, předání využívá synchronizační mechanismy.

Peer model[editovat | editovat zdroj]

  • Neobsahuje hlavní vlákno.
  • První vlákno po vytvoření ostatních vláken:
    • se stává jedním z ostatních vláken (rovnocenným),
    • pozastavuje svou činnost do doby než ostatní vlákna končí.
  • Každé vlákno je zodpovědné za svůj vstup a výstup.

Pipeline[editovat | editovat zdroj]

  • Dlouhý vstupní proud dat.
  • Sekvence operací (částí zpracování), každá vstupní jednotka musí projít všemi částmi zpracování.
  • V každé části jsou v daném čase, zpracovány různé jednotky vstupu (nezávislost jednotek).

Vícevláknové aplikace a ladění[editovat | editovat zdroj]

Hlavní problémy vícevláknových aplikací souvisí se synchronizací

  • uváznutí - Deadlock.
  • souběh (race conditions) - přístup více vláken ke sdíleným proměnným a alespoň jedno vlákno nevyužívá synchronizačních mechanismů. Vlákno čte hodnotu zatímco jiné vlákno zapisuje. Zápis a čtení nejsou atomické a data mohou být neplatná.
  • vyhladovění - Vyhladovění - stav, kdy jsou vláknu neustále odepírány prostředky. Bez těchto prostředků program nikdy nedokončí svůj úkol.

Související články[editovat | editovat zdroj]

Externí odkazy[editovat | editovat zdroj]