====== Vlákno (Thread) ====== **Vlákno** je základní jednotkou provádění kódu v rámci procesu. Moderní programování je postaveno na tzv. **multithreadingu** (vícevláknovosti), což umožňuje jedné aplikaci provádět více činností najednou, aniž by se navzájem blokovaly. ---- ====== Rozdíl mezi Procesem a Vláknem ====== Je důležité tyto dva pojmy nezaměňovat, i když spolu úzce souvisejí: ^ Vlastnost ^ Proces (Process) ^ Vlákno (Thread) ^ | **Izolace** | Má vlastní vyhrazenou paměť. | Sdílí paměť s ostatními vlákny stejného procesu. | | **Náročnost** | "Těžká" váha (náročné na vytvoření a prostředky). | "Lehká" váha (rychlé vytvoření i přepínání). | | **Stabilita** | Pád jednoho procesu neovlivní ostatní. | Pád jednoho vlákna může shodit celý proces. | [Image: Process vs Thread memory model - process has its own address space, threads share it] ---- ====== Proč používáme více vláken? ====== Představte si moderní webový prohlížeč. Díky multithreadingu může: * Jedno vlákno vykreslovat grafiku stránky. * Druhé vlákno stahovat data z internetu. * Třetí vlákno reagovat na kliknutí vaší myši. Pokud by prohlížeč používal pouze jedno vlákno, při stahování velkého obrázku by celý program "zamrzl" a přestal reagovat na ovládání. ---- ====== Vlákna a Hardware (Logická jádra) ====== Vztah mezi softwarovými vlákny a hardwarem (procesorem) určuje výkon: * **Hardwarové vlákno:** Pokud má procesor 8 jader a technologii [[hyper-threading|Hyper-Threading]], hlásí systému 16 logických jader. To znamená, že dokáže v jeden okamžik skutečně (fyzicky) zpracovávat 16 softwarových vláken. * **Softwarové vlákno:** Aplikace jich může mít stovky. Operační systém je pak na procesoru střídá (tzv. **Context Switching**) tak rychle, že máme pocit, že běží všechny naráz. ---- ====== Problémy při práci s vlákny ====== Programování vícevláknových aplikací je náročné, protože vlákna sdílejí stejná data. To vede k rizikům: * **Race Condition (Souběh):** Dvě vlákna se snaží změnit stejnou hodnotu ve stejný čas. Výsledek závisí na tom, které z nich bylo o milisekundu rychlejší, což vede k nepředvídatelným chybám. * **Deadlock (Uváznutí):** Vlákno A čeká na data od vlákna B, a vlákno B zároveň čeká na dokončení práce vlákna A. Program se zastaví a přestane reagovat. * **Synchronizace:** K ošetření těchto chyb se používají mechanismy jako **Mutex** (zámek), který dovolí přístup k datům vždy jen jednomu vláknu. [Image: Visualization of a Deadlock - two threads blocking each other] ---- ====== Typy vláken ====== * **User-level threads:** Vlákna spravovaná knihovnou v uživatelském prostoru (rychlá, ale systém o nich neví). * **Kernel-level threads:** Vlákna spravovaná přímo jádrem operačního systému (vhodná pro vícejádrové procesory). ---- //Související pojmy: Proces, Multitasking, Hyper-Threading, Core (Jádro), CPU, Deadlock, Synchronizace.//