< Linux

Folyamatok

Szerző: Sallai András

Copyright © 2019, Sallai András

Licenc: CC BY-SA 4.0

Web: https://szit.hu

A linuxos folyamatokról

A futó programot, alkalmazást folyamatnak hívjuk, angolul process.

A memória felosztható két részre:

kernel space

user space

A kernel space helyen a rendszermag kódjai futnak. A user space térben a felhasználók programjai.

Van egy folyamat, amelynek az azonosítója 0. Ezt a folyamatot sosem látjuk.

Folyamat létrehozása

#include <stdio.h> int main() { char nev[100]; printf("\nIndulás\n"); int i; for(i=0; i<0xFFFFFFFF;i++); printf("Folytatáshoz Enter..."); fgets(nev, 100, stdin); return 0; }

Fordítás:

gcc -Wall fogad.c -o fogad

Indítsuk el a programot, majd ps paranccsal ellenőrizzük a futást:

$ ps -aef | grep fogad
janos 8573 4326 99 18:41 pts/0 00:00:10 ./fogad
janos 8578 8236 0 18:41 pts/2 00:00:00 grep fogad

Ha megnézzük a ps -aef kimenetét a grep nélkül láthatjuk az a kimenet egyes oszlopainak nevét is:

$ ps -aef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 16:55 ? 00:00:02 /sbin/init
root 2 0 0 16:55 ? 00:00:00 [kthreadd]
root 3 2 0 16:55 ? 00:00:00 [ksoftirqd/0]
root 5 2 0 16:55 ? 00:00:00 [kworker/0:0H]

A parancs kiadása után túl fut a képernyőn. A Shift+PageUp billentyűkombinációval tudunk visszalapozni. De használhatunk lapozó parancsot is:

ps -aef | less

A megjelenő oszlopnevek sorra:

UID – felhasználó külső azonosító

PID – folyamat belső azonosító

PPID – szülőfolyamat azonosítója

C – processzorhasználat

STIME – mikor indulat a folyamat – start time

TTY – kapcsolt teletype

TIME – processzor használat összesen

CMD – a folyamat neve, külső azonosítója, paraméterekkel

A folyamathoz tartozó felhasználó

Minden folyamat valamilyen felhasználó, valamilyen csoport nevében fut. A ps -aef kimenetében ez az első oszlop, amelynek a felirata UID.

ps -aef

A csoportazonosítók a ps -efj paranccsal tekinthetők meg:

ps -efj

A megjelenő oszlopok:

UID PID PPID PGID SID C STIME TTY TIME CMD

A másik új oszlop a SID a Session ID, azaz munkamenet azonosító. Melyik vezető munkamenethez tartozik a folyamat. Ha a PID és a SID megegyezik, akkor ez a folyat a munkamenet vezérlő.

Az init folyamat

Az init folyamat a kernel után induló első folyamat. A kernel fenntartja az 1 folyamatazonosítót az init számára. Az init folyamatokat nem lehet leállítani; csak akkor áll le, ha a rendszert leállítjuk.

Systemd esetén az init szerepét átveszi a systemd. Debian GNU/Linux 9 rendszeren az init valójában csak egy szimbolikus link a systemd-re.

A zombi és árva folyamatok

Ha egy folyamat elveszti a szülőfolyamatát, akkor árva lesz belőle. Az árva folyamatokat az init folyamat elfogja, és ő válik az árva folyamat szülőjévé.

Az árva folyamat nem azonos zombi folyamattal. A zombi folyamatok, olyan folyamatok, amelyek végrehajtása már véget ért, a folyamat leállít, de a szülő folyamat még nem szüntette meg. Ilyenkor, a szülő folyamat még nem kérdezte le a gyermek megszűnési állapotát. A gyermek ilyenkor zombi, és várja, hogy a szülő megszüntesse ezt az állapotot.

A démon folyamatok

A démonfolyamatok vezérlő terminál nélkül futnak, a háttérben. A démon folyamatok indító-parancsállományai a szülők. Induláskor az ilyen szülő lemond a gyermekről, amely árva lesz, amit átvesz az init folyamat.

A folyamatok memóriaelrendezése

Verem

A függvények lokális változói, mutatói kerülnek erre a memóriaterületre. A verem mérete dinamikusan változik, ha értékek kerülne bele, vagy értékek törlődnek belőle.

Halom

A halomterületen helyezkednek el a folyamatok dinamikus változói, objektumai. A halom mindig egy szegmensben helyezkedik el.

Adat

Az adatterületre kerülnek a globális és statikus változók.

Szöveg

A szöveg memóriaterületre kerülnek a program utasításai.

Folyamatok környezete

A linuxos folyamatok környezete változó=érték formában tárolt adatok. A környezet változóit használhatják a alkalmazások, parancsértelmezők stb.

A környezeti változók lekérdezhetők az env paranccsal:

env

Lehetséges kimenet:

$ env
XDG_VTNR=7
XDG_SESSION_ID=2
USER=janos
PWD=/home/janos
HOME=/home/janos
TERM=xterm
SHELL=/bin/bash
SHLVL=1
LOGNAME=janos
XDG_RUNTIME_DIR=/run/user/1000
PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
_=/usr/bin/env

Források

https://www.ibm.com/ (2019)

https://www.tecmint.com/linux-process-management/ (2019)

https://www.cyberciti.biz/faq/show-all-running-processes-in-linux/ (2019)

https://www.digitalocean.com/ (2019)

https://www.tldp.org/LDP/tlk/kernel/processes.html (2019)

https://www.howtogeek.com/ (2019)

https://www.geeksforgeeks.org/processes-in-linuxunix/ (2019)