GNU/Linux >> Znalost Linux >  >> Linux

Úvod do Linuxových vláken – část I

Prováděcí vlákno je často považováno za nejmenší jednotku zpracování, na které plánovač pracuje.

Proces může mít více podprocesů provádění, které jsou prováděny asynchronně.

Toto asynchronní provádění přináší schopnost každého vlákna samostatně zpracovávat konkrétní práci nebo službu. Proto více vláken běžících v procesu zpracovává své služby, což celkově představuje úplnou schopnost procesu.

V tomto článku se dotkneme základů vláken a vytvoříme základní znalosti potřebné k tomu, abychom se naučili praktické aspekty linuxových vláken.

Řada Linux Threads:část 1 (tento článek), část 2, část 3.

Proč jsou vlákna vyžadována?

Nyní by se někdo zeptal, proč potřebujeme více vláken v procesu? Proč nelze v každé situaci použít proces s pouze jedním (výchozím) hlavním vláknem.

Abychom na to odpověděli, uvažujme příklad:

Předpokládejme, že existuje proces, který přijímá vstupy v reálném čase a odpovídající každému vstupu musí vytvořit určitý výstup. Nyní, pokud proces není vícevláknový, tj. pokud proces nezahrnuje více vláken, pak se celé zpracování v procesu stane synchronním. To znamená, že proces vezme vstup, zpracuje jej a vytvoří výstup.

Omezení ve výše uvedeném návrhu spočívá v tom, že proces nemůže přijmout vstup, dokud není dokončeno zpracování předchozího, a v případě, že zpracování vstupu trvá déle, než se očekávalo, bude přijímání dalších vstupů pozastaveno.

Abychom zvážili dopad výše uvedeného omezení, namapujeme-li obecný příklad výše s procesem serveru soketu, který může přijmout vstupní připojení, zpracuje je a poskytne klientovi soketu výstup. Nyní, pokud při zpracování jakéhokoli vstupu proces serveru trvá déle, než se očekávalo, a mezitím přijde na server soketu další vstup (žádost o připojení), proces serveru nebude schopen přijmout nové vstupní připojení, protože je již zaseknutý. zpracování starého vstupního připojení. To může vést k vypršení časového limitu připojení u klienta soketu, což není vůbec žádoucí.

To ukazuje, že synchronní model spouštění nelze aplikovat všude, a proto byl požadavek na asynchronní model spouštění, který je implementován pomocí vláken.

Rozdíl mezi vlákny a procesy

Níže jsou uvedeny některé z hlavních rozdílů mezi vláknem a procesy:

  • Procesy nesdílejí svůj adresní prostor, zatímco vlákna spouštěná stejným procesem sdílejí adresní prostor.
  • Z výše uvedeného je zřejmé, že procesy se provádějí nezávisle na sobě a o synchronizaci mezi procesy se stará pouze jádro, zatímco na druhé straně se o synchronizaci vláken musí postarat proces, pod kterým se vlákna spouštějí
  • Přepínání kontextu mezi vlákny je rychlé ve srovnání s přepínáním kontextu mezi procesy
  • Interakce mezi dvěma procesy je dosažena pouze prostřednictvím standardní meziprocesní komunikace, zatímco vlákna spouštěná ve stejném procesu mohou snadno komunikovat, protože sdílejí většinu zdrojů, jako je paměť, textový segment atd.

Uživatelská vlákna versus vlákna jádra

Vlákna mohou existovat v uživatelském prostoru i v prostoru jádra.

Uživatelský prostor vlákna se vytvářejí, řídí a ruší pomocí knihoven vláken uživatelského prostoru. Tato vlákna nejsou jádru známa, a proto se jádro nikde nepodílí na jejich zpracování. Tato vlákna se řídí kooperativním multitaskingem, kde vlákno uvolňuje CPU na své vlastní přání, tj. plánovač nemůže vlákno předem vyjmout. Výhodou vláken uživatelského prostoru je to, že přepínání mezi dvěma vlákny nezahrnuje mnoho režie a je obecně velmi rychlé, zatímco na negativní straně, protože tato vlákna sledují kooperativní multitasking, takže pokud se jedno vlákno zablokuje, celý proces se zablokuje.

jaderný prostor vlákno je vytvořeno, řízeno a zničeno jádrem. Pro každé vlákno, které existuje v uživatelském prostoru, existuje odpovídající vlákno jádra. Protože jsou tato vlákna spravována jádrem, řídí se preemptivním multitaskingem, kde plánovač může zabránit vláknu při provádění s vláknem s vyšší prioritou, které je připraveno ke spuštění. Hlavní výhodou jaderných vláken je to, že i když je jedno z vláken zablokováno, celý proces není blokován, protože vlákna jádra se řídí preemptivním plánováním, zatímco na negativní straně není přepínání kontextu příliš rychlé ve srovnání s vlákny v uživatelském prostoru.

Pokud mluvíme o Linuxu, pak jsou vlákna jádra optimalizována do takové míry, že jsou považována za lepší než vlákna v uživatelském prostoru a většinou se používají ve všech scénářích kromě případů, kdy je hlavním požadavkem kooperativní multitasking.

Problém s vlákny

Při používání vláken se objevují některé velké problémy:

  • Mnoho operačních systémů neimplementuje vlákna jako procesy, spíše je vidí jako součást nadřazeného procesu. Co by se v tomto případě stalo, kdyby vlákno zavolalo fork() nebo ještě hůř, co když vlákno spustí nový binární soubor? Tyto scénáře mohou mít nebezpečné důsledky, například v pozdějším problému by mohl být celý nadřazený proces nahrazen adresním prostorem nově spouštěného binárního souboru. To není vůbec žádoucí. Linux, který si stěžuje na POSIX, zajišťuje, že volání fork() duplikuje pouze vlákno, které volalo funkci fork(), zatímco exec z kteréhokoli vlákna by zastavilo všechna vlákna v nadřazeném procesu.
  • Dalším problémem, který může nastat, jsou problémy se souběžností. Vzhledem k tomu, že vlákna sdílejí všechny segmenty (kromě segmentu zásobníku) a mohou být plánovačem v jakékoli fázi preemptována, jakákoli globální proměnná nebo datová struktura, která může být ponechána v nekonzistentním stavu preempcí jednoho vlákna, by mohla způsobit vážné problémy, když další vysoká priorita vlákno provádí stejnou funkci a používá stejné proměnné nebo datové struktury.

K problému 1 uvedenému výše můžeme říci jen to, že jde o problém s návrhem a návrh aplikací by měl být proveden tak, aby vznikalo co nejméně problémů tohoto druhu.

Pro problém 2 uvedený výše může programátor pomocí zamykacích mechanismů zamknout kus kódu uvnitř funkce, takže i když dojde k přepnutí kontextu (když globální proměnná funkce a datové struktury byly v nekonzistentním stavu), ani další vlákno není schopné spouštět stejný kód, dokud nebude blokovaný blok kódu uvnitř funkce odemčen předchozím vláknem (nebo vláknem, které jej získalo).


Linux
  1. Jak zabít proces zombie na Linuxu

  2. Stavy procesu Linuxu

  3. Linux CreateProcess?

  1. Vytvoření démona v Linuxu

  2. Linux:proces do služby

  3. Jsou vlákna jádra Linuxu skutečně procesy jádra?

  1. Úvod do Nmap na Kali Linuxu

  2. Základy signálů Linuxu – část I

  3. Úvod do linuxových základů směrování IP (část 1)