GNU/Linux >> Znalost Linux >  >> Linux

Co jsou linuxové procesy, vlákna, lehké procesy a stav procesu

Linux se od svého vzniku hodně vyvinul. Stal se nejrozšířenějším operačním systémem, pokud jde o servery a kritickou práci. Ačkoli není snadné porozumět Linuxu jako celku, existují aspekty, které jsou pro Linux zásadní a stojí za pochopení.

V tomto článku budeme diskutovat o linuxových procesech, vláknech a lehkých procesech a pochopíme rozdíl mezi nimi. Na závěr také probereme různé stavy procesů Linuxu.

Linuxové procesy

Ve velmi základní formě lze proces Linuxu vizualizovat jako spuštěnou instanci programu. Například stačí otevřít textový editor na vašem Linuxovém boxu a proces textového editoru bude na světě.

Zde je příklad, kdy jsem otevřel gedit na svém počítači:

$ gedit &
[1] 5560

$ ps -aef | grep gedit
1000      5560  2684  9 17:34 pts/0    00:00:00 gedit

První příkaz (gedit &) otevře okno gedit, zatímco druhý příkaz ps (ps -aef | grep gedit) zkontroluje, zda existuje přidružený proces. Ve výsledku můžete vidět, že existuje proces spojený s gedit.

Procesy jsou pro Linux zásadní, protože každá práce, kterou OS provádí, je prováděna z hlediska procesů. Myslete na cokoliv a uvidíte, že je to proces. Je to proto, že jakákoli práce, která má být provedena, vyžaduje systémové prostředky (které poskytuje jádro) a je to proces, který jádro vnímá jako entitu, které může poskytnout systémové prostředky.

Procesy mají prioritu podle toho, který kontext jádra je přepíná. Proces může být preemptován, pokud je proces s vyšší prioritou připraven k provedení.

Pokud například proces čeká na systémový prostředek, jako je nějaký text z textového souboru uloženého na disku, může jádro naplánovat proces s vyšší prioritou a vrátit se do procesu čekání, až budou data dostupná. To udržuje chod operačního systému jako celku a dává uživateli pocit, že úkoly probíhají paralelně.

Procesy mohou komunikovat s jinými procesy pomocí metod komunikace mezi procesy a mohou sdílet data pomocí technik, jako je sdílená paměť.

V Linuxu se fork() používá k vytváření nových procesů. Tyto nové procesy se nazývají podřízené procesy a každý podřízený proces zpočátku sdílí všechny segmenty, jako je text, zásobník, halda atd., dokud se dítě nepokusí provést jakoukoli změnu zásobníku nebo haldy. V případě jakékoli změny je pro potomka připravena samostatná kopie segmentů zásobníku a haldy, takže změny zůstávají specifické pro dítě. Textový segment je pouze pro čtení, takže rodič i podřízený prvek sdílejí stejný textový segment. Článek o funkci fork C vysvětluje více o fork().

Linuxová vlákna vs lehké procesy

Vlákna v Linuxu nejsou nic jiného než tok provádění procesu. Proces obsahující více spouštěcích toků je známý jako vícevláknový proces.

U procesu bez více vláken existuje pouze tok provádění, který je hlavním tokem provádění, a proto je také známý jako proces s jedním vláknem. Pro linuxové jádro neexistuje žádný koncept vlákna. Každé vlákno je jádrem vnímáno jako samostatný proces, ale tyto procesy se poněkud liší od ostatních normálních procesů. Rozdíl vysvětlím v následujících odstavcích.

Vlákna se často mísí s termínem Light Weight Processes nebo LWPs. Důvod sahá až do doby, kdy Linux podporoval vlákna pouze na uživatelské úrovni. To znamená, že i vícevláknová aplikace byla jádrem vnímána jako jediný proces. To představovalo velké problémy pro knihovnu, která spravovala tato vlákna na uživatelské úrovni, protože se musela postarat o případy, kterým spuštění vlákna nebránilo, pokud jakékoli jiné vlákno vydalo blokovací volání.

Později se implementace změnila a ke každému vláknu byly připojeny procesy, aby se o ně jádro mohlo postarat. Ale, jak bylo diskutováno dříve, linuxové jádro je nevidí jako vlákna, každé vlákno je vnímáno jako proces uvnitř jádra. Tyto procesy jsou známé jako procesy s nízkou hmotností.

Hlavní rozdíl mezi procesem s nízkou hmotností (LWP) a normálním procesem je ten, že LWP sdílejí stejný adresní prostor a další zdroje, jako jsou otevřené soubory atd. Protože některé zdroje jsou sdíleny, jsou tyto procesy považovány za lehké ve srovnání s jinými normálními procesy. a odtud název lehké procesy.

Takže efektivně můžeme říci, že závity a procesy s nízkou hmotností jsou stejné. Jde jen o to, že vlákno je termín, který se používá na uživatelské úrovni, zatímco lehký proces je termín používaný na úrovni jádra.

Z hlediska implementace jsou vlákna vytvářena pomocí funkcí vystavených knihovnou pthread vyhovující POSIX v Linuxu. Interně se funkce clone() používá k vytvoření normálního procesu i procesu sestupné hmotnosti. To znamená, že k vytvoření normálního procesu se používá fork(), který dále volá clone() s příslušnými argumenty, zatímco k vytvoření vlákna nebo LWP funkce z knihovny pthread volá clone() s příslušnými příznaky. Hlavní rozdíl je tedy generován použitím různých příznaků, které lze předat funkci clone().

Přečtěte si více o fork() a clone() na jejich příslušných manuálových stránkách.

Jak vytvářet vlákna v Linuxu vysvětluje více o vláknech.

Stavy procesu Linux

Životní cyklus normálního linuxového procesu vypadá skoro jako skutečný život. Rodí se procesy, sdílejí zdroje s rodiči na nějakou dobu, získávají vlastní kopii zdrojů, když jsou připraveni provést změny, procházejí různými stavy v závislosti na jejich prioritě a nakonec zemřou. V této části se budeme zabývat různými stavy procesů Linuxu:

  • RUNNING – Tento stav určuje, že proces je buď v provádění, nebo čeká na spuštění.
  • INTERRUPTIBLE – Tento stav určuje, že proces čeká na přerušení, protože je v režimu spánku a čeká na nějakou akci, která může tento proces probudit. Akce může být hardwarové přerušení, signál atd.
  • NEPŘERUŠITELNÝ – Je to stejné jako stav PŘERUŠITELNÝ, jediný rozdíl je v tom, že proces v tomto stavu nelze probudit doručením signálu.
  • ZASTAVENO – Tento stav udává, že proces byl zastaven. To se může stát, pokud je do procesu doručen signál jako SIGSTOP, SIGTTIN atd.
  • TRACED – Tento stav určuje, že proces probíhá ladění. Kdykoli je proces zastaven ladicím programem (aby uživateli pomohl ladit kód), proces přejde do tohoto stavu.
  • ZOMBIE – Tento stav určuje, že proces je ukončen, ale stále se pohybuje v tabulce procesů jádra, protože rodič tohoto procesu stále nezískal stav ukončení tohoto procesu. Parent používá rodinu funkcí wait() k načtení stavu ukončení.
  • DEAD – Tento stav určuje, že proces je ukončen a záznam je odstraněn z tabulky procesů. Tohoto stavu je dosaženo, když rodič úspěšně načte stav ukončení, jak je vysvětleno ve stavu ZOMBIE.

Linux
  1. Linux:Najděte a zabijte zombie procesy

  2. V jakých jazycích jsou napsány Windows, Mac OS X a Linux?

  3. Jaké znaky jsou v názvech adresářů Windows a Linux zakázány?

  1. Jaké jsou rozdíly mezi lsof a netstat na linuxu?

  2. Jaké jsou tyto procesy Windows v systému Linux?

  3. Co je velká a nízká paměť v Linuxu?

  1. Linux – protokol minulých vláken, která jsou nyní uzavřena?

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

  3. Jsou vlákna implementována jako procesy v Linuxu?