Documente Academic
Documente Profesional
Documente Cultură
Procese
Concepte generale
Una dintre sarcinile kernelului este si alocarea resurselor (RAM, CPU etc)
diferitelor aplicatii.
Definitie
Un proces reprezinta unitatea elementara de alocare a resurselor in sistem si
ruleaza in propriul sau spatiu de memorie.
In momentul in care se executa o comanda este creat un nou proces. Parintele
acelui proces este shell-ul curent. Imaginea procesului reprezinta programul care se
executa si care se incarca in memoria RAM.
Exista diferente intre un program si un proces. Acelasi program poate genera mai
multe procese diferite.
Exemplu
Deschiderea simultana a editorului VI sau folosirea de mai multi useri a comenzii ls.
Nota
1. Procesoarele (exceptie cele dual-core sau cu mai multe nuclee) executa un
singur proces la un anumit moment dat. Fiecare primeste un anumit slot de timp in care
poate folosi procesorul, apoi ofera posibilitatea altui proces de a folosi CPU. Astfel este
creata senzatia de executie simultana.
2. Fiecare proces care se executa are anumite drepturi asupra sistemului si anume
drepturile userului care l-a executat (user de sistem sau persoana). Un proces pornit de
root are drepturile lui root (totale), iar acelasi proces pornit de un user normal are
drepturile userului (limitate). Exceptie fac programele care au SUID sau SGID setat.
Acestea pleaca cu drepturile ownerului sau grupului owner si nu ale celui care le
executa.
Caracteristici procese
1. Sistemul de operare foloseste functia de sistem fork() pentru a crea noi procese.
Prima etapa este crearea unui proces identic cu parintele sau (aceleasi resurse, drepturi,
practic se creaza o copie identica a parintelui). Ulterior procesul nou creat "urmeaza
propriul sau drum" adica modifica datele primite de la parinte pentru a executa propria
sarcina.
2. Fiecare proces are un parinte, cel care l-a creat. Exceptie face procesul init.
3. Procesele sunt identificate dupa un numar unic pentru intreg sistemul numit
PID (Process ID).
4. Parintele fiecarui proces este identificat cu un PPID (Parent Process ID).
5. Procesul init este primul care porneste la butarea sistemului si are PID = 1. Init
se mai numeste si parintele tuturor proceselor.
6. Un proces dureaza din momentul in care este creat de parintele sau si pana
cand programul executat de proces se termina iar rezultatul procesului este intors
parintelui. In acest moment parintele comunica Kernelului sa elibereze resursele alocate
procesului.
Categorii de procese
In Linux exista urmatoarele categorii de procese:
1. Parinte (parent) - fiecare proces poate genera un alt proces si devine parinte. In
afara procesului init fiecare proces are un parinte.
2. Copil (child) - in momentul in care procesul copil se executa, parintele intra in
starea de sleeping pana cand copilul termina executia. Daca copilul se executa in
background parintele intra/ramane in starea ready.
3. Daemon - reprezinta un proces care ruleaza in background.
4. Orfan (orphan) - reprezinta procesele ale caror parinti au intrat in starea
terminated inaintea lor. Sunt preluate automat de init, parintele tututor proceselor.
Comenzi vizualizare
1. ps (process status) - afisarea tabelara a listei de procese
fara optiuni = afiseaza procesele pornite din terminalul curent
-e (sau A)
-f
--forest
= afiseaza arborescent
-H
Exemple
ps
ps -f
ps -l
ps ef
ps -ef | grep init
ps elf | head
ps -u stud -f | less
Exemplu
pstree ahp
-u username
Exemplu
pgrep -l -u root,stud dhclient
-p PID
Exemplu
top -d 0.3 = refresh la fiecare 3 zecimi de secunda
In timpul operarii putem apasa urmatoarele taste:
h sau ?
= quit
o(o mic)
= process id
= prioritatea procesului
NI
= NICE = valorile negative reprezinta o prioritate mai mare, iar cele pozitive o
prioritate mai mica
= Process Status
Statusul unui proces poate fi:
D = uninterruptible sleep
R = running
S = sleeping
T = stopped
Z = zombie
%CPU
%MEM
TIME
COMMAND
b = toggle on/off - afecteaza daca top va arata boldat coloanele dupa care se sorteaza si
procesele running
x = afiseaza boldat coloana de sortare
y = afiseaza boldat randurile care reprezinta procesele "running" sau "ready to run"
Pentru a modifica campul de sortare se apasa "O" (o mare) si se alege campul
corespunzator. Se poate trece dintr-un camp in altul cu "<" si ">".
Taste:
M = sortare dupa memorie
P = sortare dupa timpul de procesor
R = schimba modul de ordonare (crescator, descrescator)
Pentru a salva modificarile facute: W (salveaza in ~/.toprc).
Exista si comanda htop care ofera o reprezentare grafica mai atragatoare, dar nu
exista de cele mai multe ori si trebuie instalata.
5. nice - modifica prioritatea unui proces (default +10)
Exemple
nice -n -20 sort nr.txt
= prioritate maxima
= prioritate minima
Nota
1. Prioritatea proceselor este un numar intre 0 si 139 si este cu atat mai mare (buna) cu
cat valoarea ei este mai mica.
2. 0-99 zona prioritati setabile de procese
100-139 zona de prioritati accesibile utilizatorilor
3. Valori negative pentru nice pot fi setate doar de superuser. Valoarea nice poate fi
modificata de catre utilizatorii normali doar pentru procesele proprii si numai cu valori
pozitive.
4. Procesele pornesc default cu prioritatea procesului parinte si valoare nice 0.
5. Modificarea valorii nice pentru un proces in derulare se face folosind comanda renice.
Exemple
nice -10 ls
renice +2 p 4567
ps
ps a
ps ef
ps ef | less
ps ef | grep init
ps ef forest
ps u root f
pstree
pstree | less
pgrep l init
Exemplu
sort < numere.txt | head
Comanda sort ordoneaza fisierul numere.txt care reprezinta inputul sau. Outputul
comenzii sort in loc sa fie redirectat catre standard output este conectat la un pipe (care
exista doar pe durata executiei comenzilor) ce transmite datele ca input comenzii head.
Daca pipe-ul "se umple", sort asteapta ca head sa folosesca si sa indeparteze informatia
din conducta.
Procesele pot comunica si folosind canale de tipul named pipes sau domain named
sockets.
Nota
Exemplu de procese care folosesc sockets pentru comunicare:
Procesul server de e-mail comunica printr-un socket cu procesul antivirus si
printr-un alt socket cu procesul care verifica daca un e-mail este spam. Astfel e-mailul
este transmis prin socket intre aceste procese, fiecare actionand intr-un anumit mod.
2. Intreruperi software (Semnale) - o alta modalitate de comunicare intre procese
este prin semnale sau intreruperi software. Intreruperile software pot fi ignorate de
procese sau nu.
Cateva din intreruperile mai importante sunt:
Signal Name
Number Description
SIGHUP
SIGINT
SIGTERM
15
SIGKILL
SIGILL
SIGCONT
18
SIGSTOP
19
SIGTTIN
21
SIGTTOU
22
Instructiune ilegala
Continua executia, daca a fost oprit (bg %jobid)
Opreste executia (nu poate fi prins sau ignorat)
(POSIX)
Proces din background care incearca sa citeasca din
consola - (Ctrl + Z)
Proces din background care incearca sa scrie in
consola
Procesele pot ignora, bloca sau "prinde" toate semnalele cu exceptia SIGSTOP si
SIGKILL. Daca un process "prinde" un semnal inseamna ca include cod care va actiona
corespunzator la primirea semnalului. Daca semnalul nu este "prins" de proces, kernelul
va executa actiunea default.
Pentru a trimite un semnal in mod expres unui proces se foloseste comanda kill.
Aceasta primeste ca argument PID-ul procesului si tipul de semnal pe care sa-l trimita
(default trimite SIGTERM(15)).
SIGTERM(15) se numeste si soft-kill iar SIGKILL(9) se numeste hard-kill. Un
proces poate ignora semnalul 15 dar nu si semnalul 9. La primirea semnalului 15 (daca
nu este ignorat) sau 9 procesul trebuie sa intre in starea terminated.
Nota
Trimiterea semnalului SIGKILL (9) lui init nu are niciun efect.
Comanda pkill primeste ca argument numele comenzii care ruleaza in procesul
caruia ii va trimite semnalul.
Exemplu
#ps -ef | grep bash
root
-bash
root
-bash
Aplicatii
1) Sa se trimita procesului reprezentat de comanda sleep 100 semnalul
corespunzator combinatiei Ctrl+Z.
2) Sa se trimita procesului reprezentat de comanda sleep 50 semnalul
corespunzator combinatiei Ctrl+C.
Nota
Pidul unui proces care ruleaza poate fi aflat folosind comanda pidof.
Exemplu
pidof init.
Job Control
Exemplu
updatedb &
Fiecare job care ruleaza in background primeste un id (incepand cu 1). Comanda
jobs afiseaza toate aceste id-uri sub forma [1] 25647. Primul numar reprezinta Job ID iar
cel de-al doilea Process ID.
Daca sunt mai multe joburi in background, semnul "+" identifica job-ul care va fi
utilizat ca default in cazul comenzilor bg si fg, iar semnul "-" identifica job-ul care devine
default daca job-ul curent termina executia.
Exemplu
fg %job_id - aduce in foreground un job din background.
bg %job_id - porneste in background un job suspendat cu Ctrl+Z
La inchiderea terminalului acesta primeste semnalul SIGHUP. Toate procesele
pornite din terminal primesc la randul lor semnalul SIGHUP.
Comanda nohup este folosita cand se doreste ca un proces sa nu reactioneze la
primirea semnalului SIGHUP (hangup). La inchiderea terminalului, parintele (bash) intra
in starea terminated si procesul este preluat de init.
Exemplu
nohup comanda &
Aplicatie
Se porneste un proces dintr-un terminal in mod normal (fara nohup) in
foreground. Se doreste inchiderea terminalului astfel incat procesul sa isi continue
executia.
#wget -c http://download.fedoraproject.org/.../i386/iso/Fedora-8-i386-DVD.iso
#Ctrl+Z
#jobs
#bg %jobid
#disown -h %jobid
Exercitii:
Fereastra terminalului pornit mai devreme este activ, se pot scrie comenzi
n ea
n terminal rulai fg 1
o
n terminal rulai bg 1
o
Din terminal pornii o alt instan de xterm, rulnd comanda xterm &. Ce
observai?