GNU/Linux >> Znalost Linux >  >> Linux

Přehled procesu UNIX (uvnitř procesu Linux a typy procesů)

Proces je spuštěná instance programu. V tomto článku jsme použili dva termíny „program“ a „běžící instance“. Předpokládejme, že spustíme program současně 5krát, pak odpovídající každé instanci bude v systému běžet proces. Říkáme tedy, že proces je „běžící instance“ programu.

Jak již víte, můžete použít příkaz ps k zobrazení procesů běžících na vašem systému. Pro efektivní použití příkazu ps viz 7 praktických příkladů příkazů PS pro monitorování procesu.

1. Nahlédnutí do procesu

Nyní, protože je nám jasné, co přesně proces je, pojďme se ponořit trochu hlouběji, abychom viděli, z čeho se proces skládá. Unixový proces si lze představit jako kontejner, který obsahuje:

Pokyny k programu

Programové instrukce jsou uchovávány v textových segmentech, které jsou vykonávány CPU. Obvykle u programů, jako jsou textové editory, které se spouštějí často, je textový segment sdílen. Tento segment má oprávnění pouze pro čtení, což znamená, že program nemůže upravit svůj textový segment.

Data

Většinou jsou data uchovávána v datovém segmentu. Datový segment lze rozdělit na segment inicializovaných dat a segment neinicializovaných dat. Jak název napovídá, inicializovaný datový segment obsahuje ty globální proměnné, které jsou inicializovány předem, zatímco neinicializovaný datový segment (také známý jako „BSS“ segment) obsahuje neinicializované globální proměnné. V datovém segmentu jsou také uloženy statické proměnné.

Lokální proměnné, které jsou lokální pro funkce, jsou uloženy v zásobníku. Zásobník je specifický pro funkci a kromě informací o lokálních proměnných obsahuje také informace o adrese, kam se tok vrátí po provedení funkce. Zásobník také obsahuje informace o prostředí volajících, jako jsou některé registry strojů také uloženy v zásobníku. Funkce, která se nazývá, alokuje paměť pro své lokální proměnné a dočasné proměnné na samotném zásobníku. V případě rekurzivní funkce existuje nezávislý zásobník pro každé volání funkce.

Pak jsou data, která jsou uložena na hromadě. Tato paměť pro tato data je alokována za běhu na segmentu haldy. Segment haldy není lokální pro proces, ale sdílený napříč procesy. To je důvod, proč se programátoři C hodně obávají úniků paměti, které jsou způsobeny na segmentu haldy a mohou ovlivnit další procesy v systému.

Argumenty příkazového řádku a proměnné prostředí

Proces také obsahuje prostor pro ukládání proměnných prostředí a argumentů příkazového řádku, které předáváme programu. Obvykle se zde uloží vektor obsahující informace z příkazového řádku a poté se adresa tohoto vektoru informací a počet prvků ve vektoru zkopíruje do 'argv' a 'argc' (dva argumenty funkce 'main()').

Kromě výše uvedených informací proces obsahuje také informace jako

  • Stav jeho I/O
  • Jeho prioritu a další kontrolní informace

Jednou z nejdůležitějších řídicích informací pro proces jsou oprávnění. Proces přímo zdědí všechna oprávnění uživatele, který tento proces spustil. Například proces spouštěný uživatelem, který nemá práva superuživatele, nemůže dělat věci, které vyžadují oprávnění root, zatímco proces spouštěný uživatelem root může dělat jakoukoli věc, na kterou je naprogramován. Výjimkou z výše uvedeného pravidla je situace, kdy proces může získat větší oprávnění než uživatel, který jej spustil, pokud je pro tento konkrétní proces nastaven bit setuid nebo setgid. Ale o tom se zde nebudeme moc rozepisovat (další informace o tom naleznete v manuálových stránkách setuid a setgid).

2. Procesy na pozadí a v popředí

Jak jsme již probrali, v Unixu můžeme spustit proces podle jeho jména. Stejně jako některé standardní programy lze „ls“, „ps“ atd. spustit pouhým zadáním jejich názvu do příkazového řádku. Existují dva způsoby, jak můžeme zahájit proces

  • Začíná v popředí
  • Spuštění na pozadí

Předpokládejme, že existuje nástroj, který spotřebuje nějaký čas a počítá. Řekněme, že název nástroje je ‚count‘ Nyní, abych spustil a spustil program v popředí, spustím následující příkaz (kde ‚count‘ je název binárního kódu z výše uvedeného kódu):

$ ./count
Counting done

Vidíme tedy, že po spuštění binárního ‚./count‘ trvalo téměř 10 sekund, než se výstup zobrazil na stdout a do té doby byl shell obsazen pouze tímto procesem. tj. Na stejném shellu jste nemohli provést žádnou jinou operaci. Nyní, chcete-li spustit proces na pozadí, přidejte na konec příkazu „&“:

$ ./count &
[1] 4120

$ # Do some work on shell while the above program is working in the background

$ Counting done

Znak ampersand ‚&‘ označuje, že tento proces je třeba spustit jako proces na pozadí. Spuštěním procesu na pozadí můžeme mít přístup k shellu pro provádění dalších operací. Podobně jako ve výše uvedeném výstupu, po spuštění binárního 'count' na pozadí jsem použil několik dalších příkazů na stejném shellu, a když byl binární 'count' hotov s jeho zpracováním, výstup byl vržen zpět do stejného shellu (poslední řádek). Můžeme tedy dojít k závěru, že ve výchozím nastavení každý proces běží v popředí, přijímá vstup (pokud existuje) z klávesnice a vrací výstup uživateli. Zatímco proces na pozadí je proces, který se odpojí od klávesnice a uživatel může použít stejný shell k provádění více operací.

Další informace o procesech na popředí a na pozadí naleznete v části:Jak spravovat úlohy na pozadí UNIX

3. Typy procesů

Vidíme tedy, že proces je koncept, který je pro operační systém zásadní. Téměř každá aktivita na operačním systému má formu procesu, který provádí nějaké věci. V systému běží různé typy procesů, některé z nich jsou:

Podřízené procesy

Proces, který je vytvořen jiným procesem během běhu. Obvykle jsou podřízené procesy vytvořeny tak, aby spouštěly nějaké binární soubory z existujícího procesu. Podřízené procesy jsou vytvářeny pomocí systémového volání fork(). Normálně jsou procesy provedeny tak, aby běžely přes shell/terminál. V takovém případě se shell stane rodičem a provedený proces se stane podřízeným procesem. V Unixu/Linuxu má každý proces rodiče kromě procesu init (o tom se dozvíme později).

Procesy démonů

Jedná se o speciální procesy, které běží na pozadí. Jsou to procesy související se systémem, které nemají přiřazený terminál. Tyto procesy běží budou rootovat oprávnění a obvykle poskytují služby procesům. Jak již víme, že proces démona nemá připojený terminál, dobře, abychom toho dosáhli, musí být proces od terminálu odpojen. Ideální způsob, jak toho v Linuxu/Unixu provést, je spustit proces přes terminál a z tohoto procesu vytvořit další proces a poté ukončit nadřazený proces. Vzhledem k tomu, že rodič je ukončen, dítě se nyní stane nezávislým na terminálu a bude převzato procesem init a stane se tedy procesem démona. Typickým příkladem může být poštovní démon, který čeká na příchod e-mailů a upozorní na přijetí pošty.

Ojedinělé procesy

Obvykle proces vytvoří podřízený proces (jak je popsáno výše) a když se podřízený proces ukončí, je vydán signál nadřazenému, takže rodič může dělat všechny věci, které je třeba udělat, když je jeden z podřízených ukončen. Ale jsou situace, kdy je rodič zabit. V takovém případě se podřízené procesy stanou osiřelými a poté je převezme proces init. Ačkoli proces init přebírá vlastnictví osiřelého procesu, přesto jsou tyto procesy nazývány jako sirotčí, protože jejich původní rodiče již neexistují.

Zombie proces

Když se podřízený proces ukončí nebo dokončí své provádění, jeho záznam v tabulce procesů zůstane, dokud nadřazený proces nezíská informace o stavu ukončeného potomka. Takže do té doby ukončený proces vstoupí do stavu zombie a je známý jako proces zombie. Když je proces ukončen, veškerá paměť a prostředky spojené s procesem jsou uvolněny, ale záznam procesu v tabulce procesů existuje. Signál SIGCHILD je poslán rodičovi procesu (který právě skončil). Obslužná rutina tohoto signálu v nadřazeném prvku obvykle provede volání „čekání“, které načte stav ukončení ukončeného procesu a poté je také odstraněn záznam tohoto zombie procesu z tabulky procesů.

4. Proces init

Jak jsme již uvedli dříve, proces init je 5. fáze v 6. fázi procesu spouštění Linuxu.

Znáte slavnou teorii „kuře a vejce“ o tom, kdo byl první. Pokud jde o procesy, protože každý proces má nadřazený proces, lze stejnou otázku položit o nadřazeném nebo podřízeném procesu. No, naštěstí je tu odpověď. Odpovědí je proces init, který je spuštěn jako první proces během zaváděcí sekvence. To znamená, že neexistuje žádný rodič procesu init. Pojďme to ověřit, protože PID init je ‚1‘, použijeme příkaz ps :

Z výstupu tedy vidíme, že PPID je 0, což znamená, že pro tento proces neexistuje žádný rodič.

$ ps -l 1
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY        TIME CMD
4 S     0     1     0  0  80   0 -  5952 poll_s ?          0:00 /sbin/init

Následují některé z příkazů, které se zabývají procesy:příkaz Top, příkaz HTOP, příkaz PS, příkaz Kill (pkill, xkill).


Linux
  1. UNIX / Linux:3 způsoby odesílání signálu do procesů

  2. UNIX / Linux Procesy:C fork() Funkce

  3. ukončení procesů mmap, msync a linux

  1. Linuxové příkazy – přehled a příklady

  2. Jak najít a zabít zombie proces v Linuxu

  3. Linux – Rozumíte unixovým oprávněním a typům souborů?

  1. Linux – standardní a/nebo společné adresáře na operačních systémech Unix/linux?

  2. 12 kroků k instalaci a konfiguraci Alfresco na UNIX / Linux

  3. Linux:Najděte a zabijte zombie procesy