Sunteți pe pagina 1din 13

LABORATOR 6

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.

Starile unui proces


Un proces se afla in urmatoarele stari de la nastere (fork()) si pana la terminarea
sa:
a) created - reprezinta etapa in care procesul este creat si asteapta permisiunea
schedulerului pentru starea ready.
b) ready (waiting sau runnable) - procesul a fost incarcat in memorie si asteapta
executia procesorului; exista mai multe procese care se gasesc simultan in aceasta stare.
c) blocking (sleeping) - procesul este blocat din cauza unei resurse inaccesibile
(fisier, variabila de tip semafor, device). Este sters din lista de asteptare pentru a fi
executat de procesor. Daca resursa se elibereaza procesul intra in starea "ready".
d) running (active sau executing) - procesul este executat de procesor in acest
moment. Daca isi depaseste slice-ul (timpul) alocat pentru executie va trece din nou in
starea ready.
e) terminated - un proces intra in aceasta stare fie din starea running daca a
terminat executia sau daca este omorat (killed) printr-un semnal. Daca nu este sters din
memorie devine zombie. Daca procesul are copii, acestia sunt preluati de init.

f) suspended and waiting - reprezinta procesele care au fost indepartate din


memoria principala si duse in memoria de tip swap.
g) suspended and blocked - reprezinta procesele care se gasesc in memoria de tip
swap in starea de suspendare.
NOTA:
In cazul unui sistem incarcat(cu multe procese), memoria Ram se poate dovedi
insuficienta pentru a satisface toate procesele. In aceasta situatie o parte din paginile de
memorie sunt evacuate(swappat-e) pe disc pentru a face loc pentru paginile de memorie
utile in momentul de fata. In momentul in care paginile evacuate sunt din nou necesare,
se vor evacua alte pagini pentru a face loc celor curente.
Cea mai uzuala solutie de memorie folosita pentru swap este hard-disk-ul. Pe un sistem
Linux, exista o partitie dedicata(partitia de swap) care este folosita in cazul in care
memoria din sistem este insuficienta. Pentru a afla informatii despre spatiul de swap
utilizat se poate folosi comanda free.

Atributele unui proces


Un proces detine urmatoarele atribute:
a) PID -> Process ID - identificatorul unic al unui proces
b) PPID -> Parent Process ID - identificatorul parintelui procesului
c) UID -> User ID - Identificatorul userului sub care ruleaza procesul
d) GID -> Group ID - Identificatorul grupului sub care ruleaza procesul
e) Prioritate

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.

5. Zombie (defunct) - reprezinta procesele care au terminat executia dar nu sunt


sterse din tabela de procese(procesul parinte omite sau intarzie sa citeasca rezultatul de
iesire al subprocesului, acesta ramane in starea zombie pentru o perioada mai lunga).
Nu pot fi terminate in modul conventional (folosind comanda kill) ci doar de catre
procesul parinte sau init daca procesul parinte termina executia.
In general zombie nu fac rau sistemului fiindca nu consuma resurse.

Comenzi vizualizare
1. ps (process status) - afisarea tabelara a listei de procese
fara optiuni = afiseaza procesele pornite din terminalul curent
-e (sau A)

= toate procesele tuturor userilor nu doar cele din terminalul curent

-f

= descriere completa-afiseaza coloane suplimentare precum UID cu care

ruleaza procesul, PPID, STIME(momentul pornirii procesului), TIME(timp de procesor


consumat de catre acel proces de la pornire si pana in momentul rularii comenzii ps),
TTY(terminalul la care este atasat procesul), C(CPU-procentul de timp de procesor folosit
de catre acest proces de-a lungul existentei sale)
-l

=long format, adauga coloane precum: F(flags-indicatori atasati procesului; 4

indica privilegii de root), S(starea curenta a procesului:R-running, Z-zombie, S-sleeping


etc), PRI(prioritatea procesului), NI(nice value-valoare setabila de utilizator si care
participa in calculul prioritatii procesului)
-u user

= doar procesele userului user

--forest

= afiseaza arborescent

-H

= afiseaza arborescent (cu indentare)-prezinta procesele ierarhic prin

evidentierea relatiilor dintre ele


Fiindca de cele mai multe ori lista de procese nu incape pe un ecran, comanda ps
se foloseste in combinatie cu grep sau less.

Exemple
ps
ps -f
ps -l
ps ef
ps -ef | grep init
ps elf | head
ps -u stud -f | less

2. pstree - afisare arborescenta a proceselor


-a = afisarea argumentelor liniei de comanda
-c = afisare decompactata a sub arborilor
-h = sublinierea procesului curent si a parintilor acestuia
-p = afisare PID
-u = afisare username

Exemplu
pstree ahp

3. pgrep - afiseaza procesele care ruleaza, cautandu-le dupa nume


-l

= afiseaza si numele procesului nu doar PID-ul

-u username

= afiseaza procesele detinute de username (EUID)

Exemplu
pgrep -l -u root,stud dhclient

4. top = afisarea in timp real a proceselor cu optiuni diverse de ordonare dupa


diferite criterii
-c

= afisarea comenzii complete

-p PID

= afiseaza doar procesul cu PID

-d ss.tt (seconds.tenths)= refresh la fiecare secunda.zecime (sunt permise numere mai


mici ca 1)
-u username

= doar procesele care ruleaza sub username

Exemplu
top -d 0.3 = refresh la fiecare 3 zecimi de secunda
In timpul operarii putem apasa urmatoarele taste:
h sau ?

= vizualizam un help pentru top

= quit

= selectarea campurilor care vor fi afisate

o(o mic)

= selectarea ordinii de afisare

O(O mare) = selectarea campului de sortare


d

= insert delay refresh

= afisarea proceselor doar pentru un user

= trimite un semnal unui proces

Semnificatia celor mai importante coloane afisate de top:


PID

= process id

PPID = parent process id


USER = utilizatorul sub care ruleaza procesul
PR

= prioritatea procesului

NI

= NICE = valorile negative reprezinta o prioritate mai mare, iar cele pozitive o
prioritate mai mica

RES = Resident Size = Cantitatea de memorie non-swap (kb) folosita


VIRT = Virtual Image (Swap + Res)
SHR

= Shared Memory - memoria shared folosita. Acest tip de memorie poate fi


impartita intre mai multe procese

= Process Status
Statusul unui proces poate fi:
D = uninterruptible sleep
R = running
S = sleeping
T = stopped
Z = zombie

%CPU

= procentul din timpul CPU folosit de la ultima afisare

%MEM

= procentul din memorie folosit

TIME
COMMAND

Sortarea dupa un camp afisat de top:

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

nice -n +19 top

= 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

Comunicatia dintre procese / Semnale


In Linux si Unix procesele comunica prin doua modalitati principale:
1. Pipe-uri - un proces trimite informatie printr-un pipe care va fi folosita de un
altul. Sincronizarea este posibila deoarece in momentul in care un proces doreste sa
citeasca dintr-un pipe gol, acesta este blocat pana cand exista date disponibile.

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

(hangup) trimis la inchiderea terminalului din care a


fost lansat, daca procesul nu s-a incheiat
(Terminal interrupt - CTRL + C) cerere de intrerupere
trimisa catre aplicatia din foreground
(Termination) cerere soft de terminare ; poate fi
ignorata, tratata sau blocata temporar
(kill) trimis pentru terminarea imediata si

SIGKILL

neconditionata a procesului; nu poate fi ignorat sau


tratat altfel

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.

Comanda killall se foloseste pentru a trimite semnale tuturor proceselor care


ruleaza sub acelasi nume.
Diferenta intre pkill si killall este ca pkill primeste ca argument doar o parte din
numele procesului, iar killall primeste ca argument intreg numele. Pentru a specifica
semnalul trimis se poate folosi codul numeric al semnalului sau numele acestuia.

Exemplu
#ps -ef | grep bash
root

13162 13158 0 11:59 pts/1 00:00:00

-bash

root

13403 13400 0 12:19 pts/2 00:00:00

-bash

#kill -15 13162


sau
#kill -SIGTERM 13162
sau
#pkill bash
sau
#killall 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

Job control se refera la posibilitatea de a opri/suspenda executia unui proces si


repornirea sa la un moment ulterior.
Pentru a rula o comanda in background se foloseste "&" la sfarsitul comenzii.

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:

Deschidei un nou terminal.


Din acest terminal pornii o instan de xterm, rulnd comanda xterm
o

n acest moment fereastra de xterm este activ, putnd scrie comenzi n ea

Fereastra terminalului pornit mai devreme este i ea activ, dar nu pot fi


scrise comenzi

n terminal apsai CTRL+z


o

n acest moment fereastra de xterm este inactiv, nu pot fi scrise comenzi n


ea

Fereastra terminalului pornit mai devreme este activ, se pot scrie comenzi
n ea

n terminal rulai jobs

n terminal rulai fg 1
o

n acest moment fereastra de xterm este activ, putnd scrie comenzi n ea

Fereastra terminalului pornit mai devreme este i ea activ, dar nu pot fi


scrise comenzi

n terminal apsai CTRL+z

n terminal rulai jobs

n terminal rulai bg 1
o

n acest moment fereastra de xterm este activ, putnd scrie comenzi n ea

Fereastra terminalului pornit mai devreme este i ea activ, putnd scrie


comenzi n ea

Ieii din xterm, tastnd exit

Din terminal pornii o alt instan de xterm, rulnd comanda xterm &. Ce
observai?

Afisati lista proceselor utilizatorului curent.


Obinei o listare arborescent a proceselor folosind comanda pstree i apoi
obinei o listare similar (arborescent) folosind comanda ps. (Hint: forest)

Verificai faptul c init adopt procesele orfane.


o Deschidei un nou terminal i din acesta pornii o instan de xterm n
background.
o Din instana de xterm, pornii o a doua instan de xterm n background.

o Din terminal afiai lista proceselor n format arborscent, afind i pid-ul


fiecrui proces (Hint: man pstree, /pid)
o Identificai pid-ul primei sesiuni de xterm i trimitei procesului respectiv
semnalul SIGKILL (Hint: kill)
o Identificai procesul printe al celei de-a doua sesiuni de xterm.

S-ar putea să vă placă și