Tartalomjegyzék
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
- fogad.c
#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.howtogeek.com/ (2019)