Sunteți pe pagina 1din 10

LABORATOR 7 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.

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. 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) -f -u user --forest -H = toate procesele tuturor userilor = descriere completa = doar procesele userului user = afiseaza arborescent = afiseaza arborescent (cu indentare)

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 -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 -u username = afiseaza si numele procesului nu doar PID-ul = afiseaza procesele detinute de username (EUID)

Exemplu
pgrep -l -u root,stud sshd 4. top = afisarea in timp real a proceselor cu optiuni diverse de ordonare dupa diferite criterii -c -p PID = afisarea comenzii complete = 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 ? q f o(o mic) = vizualizam un help pentru top = quit = selectarea campurilor care vor fi afisate = selectarea ordinii de afisare

O(O mare) = selectarea campului de sortare

d u k

= 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 NI = prioritatea procesului = 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 S = 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 %MEM 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 = procentul din timpul CPU folosit de la ultima afisare = procentul din memorie folosit

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 nice -n +19 top = 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 top -> tasta W less ~/.toprc

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 SIGHUP SIGINT SIGTERM Number Description 1 2 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 neconditionata a procesului; nu poate fi ignorat sau tratat altfel Instructiune ilegala Continua executia, daca a fost oprit (bg %jobid)

SIGKILL SIGILL SIGCONT

9 4 18

SIGSTOP SIGTTIN SIGTTOU

19 21 22

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 root 13162 13158 0 11:59 pts/1 00:00:00 13403 13400 0 12:19 pts/2 00:00:00 -bash -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

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